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

Artifact 06a122decd9268c747e9110448b0c84249a4623ca9d78a73618ce648f7af8869:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 75 2f 25 64 2f 25 70 3a 20 22 2c 28 53 29  "%u/%d/%p: ",(S)
02c0: 2d 3e 73 65 6c 49 64 2c 28 50 29 2d 3e 61 64 64  ->selId,(P)->add
02d0: 72 45 78 70 6c 61 69 6e 2c 28 53 29 29 2c 5c 0a  rExplain,(S)),\.
02e0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
02f0: 50 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23  Printf X.#else.#
0300: 20 64 65 66 69 6e 65 20 53 45 4c 45 43 54 54 52   define SELECTTR
0310: 41 43 45 28 4b 2c 50 2c 53 2c 58 29 0a 23 65 6e  ACE(K,P,S,X).#en
0320: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  dif.../*.** An i
0330: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
0340: 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20  ollowing object 
0350: 69 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72  is used to recor
0360: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  d information ab
0370: 6f 75 74 0a 2a 2a 20 68 6f 77 20 74 6f 20 70 72  out.** how to pr
0380: 6f 63 65 73 73 20 74 68 65 20 44 49 53 54 49 4e  ocess the DISTIN
0390: 43 54 20 6b 65 79 77 6f 72 64 2c 20 74 6f 20 73  CT keyword, to s
03a0: 69 6d 70 6c 69 66 79 20 70 61 73 73 69 6e 67 20  implify passing 
03b0: 74 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  that information
03c0: 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 65 6c  .** into the sel
03d0: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 72  ectInnerLoop() r
03e0: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64  outine..*/.typed
03f0: 65 66 20 73 74 72 75 63 74 20 44 69 73 74 69 6e  ef struct Distin
0400: 63 74 43 74 78 20 44 69 73 74 69 6e 63 74 43 74  ctCtx DistinctCt
0410: 78 3b 0a 73 74 72 75 63 74 20 44 69 73 74 69 6e  x;.struct Distin
0420: 63 74 43 74 78 20 7b 0a 20 20 75 38 20 69 73 54  ctCtx {.  u8 isT
0430: 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  nct;      /* Tru
0440: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
0450: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
0460: 73 65 6e 74 20 2a 2f 0a 20 20 75 38 20 65 54 6e  sent */.  u8 eTn
0470: 63 74 54 79 70 65 3b 20 20 20 2f 2a 20 4f 6e 65  ctType;   /* One
0480: 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 44 49   of the WHERE_DI
0490: 53 54 49 4e 43 54 5f 2a 20 6f 70 65 72 61 74 6f  STINCT_* operato
04a0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62 54  rs */.  int tabT
04b0: 6e 63 74 3b 20 20 20 20 2f 2a 20 45 70 68 65 6d  nct;    /* Ephem
04c0: 65 72 61 6c 20 74 61 62 6c 65 20 75 73 65 64 20  eral table used 
04d0: 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72 6f  for DISTINCT pro
04e0: 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  cessing */.  int
04f0: 20 61 64 64 72 54 6e 63 74 3b 20 20 20 2f 2a 20   addrTnct;   /* 
0500: 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70  Address of OP_Op
0510: 65 6e 45 70 68 65 6d 65 72 61 6c 20 6f 70 63 6f  enEphemeral opco
0520: 64 65 20 66 6f 72 20 74 61 62 54 6e 63 74 20 2a  de for tabTnct *
0530: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  /.};../*.** An i
0540: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
0550: 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20  ollowing object 
0560: 69 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72  is used to recor
0570: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  d information ab
0580: 6f 75 74 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52  out.** the ORDER
0590: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
05a0: 29 20 63 6c 61 75 73 65 20 6f 66 20 71 75 65 72  ) clause of quer
05b0: 79 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64  y is being coded
05c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 44 65 66  ..**.** The aDef
05d0: 65 72 5b 5d 20 61 72 72 61 79 20 69 73 20 75 73  er[] array is us
05e0: 65 64 20 62 79 20 74 68 65 20 73 6f 72 74 65 72  ed by the sorter
05f0: 2d 72 65 66 65 72 65 6e 63 65 73 20 6f 70 74 69  -references opti
0600: 6d 69 7a 61 74 69 6f 6e 2e 20 46 6f 72 0a 2a 2a  mization. For.**
0610: 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69   example, assumi
0620: 6e 67 20 74 68 65 72 65 20 69 73 20 6e 6f 20 69  ng there is no i
0630: 6e 64 65 78 20 74 68 61 74 20 63 61 6e 20 62 65  ndex that can be
0640: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 4f 52   used for the OR
0650: 44 45 52 20 42 59 2c 0a 2a 2a 20 66 6f 72 20 74  DER BY,.** for t
0660: 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  he query:.**.** 
0670: 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 69      SELECT a, bi
0680: 67 62 6c 6f 62 20 46 52 4f 4d 20 74 31 20 4f 52  gblob FROM t1 OR
0690: 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 31  DER BY a LIMIT 1
06a0: 30 3b 0a 2a 2a 0a 2a 2a 20 69 74 20 6d 61 79 20  0;.**.** it may 
06b0: 62 65 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  be more efficien
06c0: 74 20 74 6f 20 61 64 64 20 6a 75 73 74 20 74 68  t to add just th
06d0: 65 20 22 61 22 20 76 61 6c 75 65 73 20 74 6f 20  e "a" values to 
06e0: 74 68 65 20 73 6f 72 74 65 72 2c 20 61 6e 64 0a  the sorter, and.
06f0: 2a 2a 20 72 65 74 72 69 65 76 65 20 74 68 65 20  ** retrieve the 
0700: 61 73 73 6f 63 69 61 74 65 64 20 22 62 69 67 62  associated "bigb
0710: 6c 6f 62 22 20 76 61 6c 75 65 73 20 64 69 72 65  lob" values dire
0720: 63 74 6c 79 20 66 72 6f 6d 20 74 61 62 6c 65 20  ctly from table 
0730: 74 31 20 61 73 20 74 68 65 0a 2a 2a 20 31 30 20  t1 as the.** 10 
0740: 73 6d 61 6c 6c 65 73 74 20 22 61 22 20 76 61 6c  smallest "a" val
0750: 75 65 73 20 61 72 65 20 65 78 74 72 61 63 74 65  ues are extracte
0760: 64 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65  d from the sorte
0770: 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  r..**.** When th
0780: 65 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e  e sorter-referen
0790: 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ce optimization 
07a0: 69 73 20 75 73 65 64 2c 20 74 68 65 72 65 20 69  is used, there i
07b0: 73 20 6f 6e 65 20 65 6e 74 72 79 20 69 6e 20 74  s one entry in t
07c0: 68 65 0a 2a 2a 20 61 44 65 66 65 72 5b 5d 20 61  he.** aDefer[] a
07d0: 72 72 61 79 20 66 6f 72 20 65 61 63 68 20 64 61  rray for each da
07e0: 74 61 62 61 73 65 20 74 61 62 6c 65 20 74 68 61  tabase table tha
07f0: 74 20 6d 61 79 20 62 65 20 72 65 61 64 20 61 73  t may be read as
0800: 20 76 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 65   values are.** e
0810: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
0820: 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 74 79 70  e sorter..*/.typ
0830: 65 64 65 66 20 73 74 72 75 63 74 20 53 6f 72 74  edef struct Sort
0840: 43 74 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72  Ctx SortCtx;.str
0850: 75 63 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20  uct SortCtx {.  
0860: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
0870: 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By;   /* The ORD
0880: 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20  ER BY (or GROUP 
0890: 42 59 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20  BY clause) */.  
08a0: 69 6e 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20  int nOBSat;     
08b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
08c0: 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  of ORDER BY term
08d0: 73 20 73 61 74 69 73 66 69 65 64 20 62 79 20 69  s satisfied by i
08e0: 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
08f0: 69 45 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20  iECursor;       
0900: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
0910: 65 72 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65  er for the sorte
0920: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  r */.  int regRe
0930: 74 75 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20  turn;        /* 
0940: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
0950: 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65   block-output re
0960: 74 75 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a  turn address */.
0970: 20 20 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74    int labelBkOut
0980: 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74  ;       /* Start
0990: 20 6c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62   label for the b
09a0: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72  lock-output subr
09b0: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
09c0: 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20  addrSortIndex;  
09d0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
09e0: 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  the OP_SorterOpe
09f0: 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65  n or OP_OpenEphe
0a00: 6d 65 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6c  meral */.  int l
0a10: 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20  abelDone;       
0a20: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68   /* Jump here wh
0a30: 65 6e 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49 4d  en done, ex: LIM
0a40: 49 54 20 72 65 61 63 68 65 64 20 2a 2f 0a 20 20  IT reached */.  
0a50: 69 6e 74 20 6c 61 62 65 6c 4f 42 4c 6f 70 74 3b  int labelOBLopt;
0a60: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
0a70: 72 65 20 77 68 65 6e 20 73 6f 72 74 65 72 20 69  re when sorter i
0a80: 73 20 66 75 6c 6c 20 2a 2f 0a 20 20 75 38 20 73  s full */.  u8 s
0a90: 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20 20 20  ortFlags;       
0aa0: 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72    /* Zero or mor
0ab0: 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62 69 74  e SORTFLAG_* bit
0ac0: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
0ad0: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
0ae0: 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 75 38  _REFERENCES.  u8
0af0: 20 6e 44 65 66 65 72 3b 20 20 20 20 20 20 20 20   nDefer;        
0b00: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0b10: 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69   valid entries i
0b20: 6e 20 61 44 65 66 65 72 5b 5d 20 2a 2f 0a 20 20  n aDefer[] */.  
0b30: 73 74 72 75 63 74 20 44 65 66 65 72 72 65 64 43  struct DeferredC
0b40: 73 72 20 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  sr {.    Table *
0b50: 70 54 61 62 3b 20 20 20 20 20 20 20 20 2f 2a 20  pTab;        /* 
0b60: 54 61 62 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e  Table definition
0b70: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 73 72   */.    int iCsr
0b80: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
0b90: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
0ba0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e   table */.    in
0bb0: 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20 20  t nKey;         
0bc0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50    /* Number of P
0bd0: 4b 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 61  K columns for ta
0be0: 62 6c 65 20 70 54 61 62 20 28 3e 3d 31 29 20 2a  ble pTab (>=1) *
0bf0: 2f 0a 20 20 7d 20 61 44 65 66 65 72 5b 34 5d 3b  /.  } aDefer[4];
0c00: 0a 23 65 6e 64 69 66 0a 20 20 73 74 72 75 63 74  .#endif.  struct
0c10: 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20 2a 70 44   RowLoadInfo *pD
0c20: 65 66 65 72 72 65 64 52 6f 77 4c 6f 61 64 3b 20  eferredRowLoad; 
0c30: 20 2f 2a 20 44 65 66 65 72 72 65 64 20 72 6f 77   /* Deferred row
0c40: 20 6c 6f 61 64 69 6e 67 20 69 6e 66 6f 20 6f 72   loading info or
0c50: 20 4e 55 4c 4c 20 2a 2f 0a 7d 3b 0a 23 64 65 66   NULL */.};.#def
0c60: 69 6e 65 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  ine SORTFLAG_Use
0c70: 53 6f 72 74 65 72 20 20 30 78 30 31 20 20 20 2f  Sorter  0x01   /
0c80: 2a 20 55 73 65 20 53 6f 72 74 65 72 4f 70 65 6e  * Use SorterOpen
0c90: 20 69 6e 73 74 65 61 64 20 6f 66 20 4f 70 65 6e   instead of Open
0ca0: 45 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a  Ephemeral */../*
0cb0: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 74  .** Delete all t
0cc0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
0cd0: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0ce0: 2e 20 20 44 65 61 6c 6c 6f 63 61 74 65 20 74 68  .  Deallocate th
0cf0: 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69  e structure.** i
0d00: 74 73 65 6c 66 20 6f 6e 6c 79 20 69 66 20 62 46  tself only if bF
0d10: 72 65 65 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a  ree is true..*/.
0d20: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61  static void clea
0d30: 72 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 20  rSelect(sqlite3 
0d40: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  *db, Select *p, 
0d50: 69 6e 74 20 62 46 72 65 65 29 7b 0a 20 20 77 68  int bFree){.  wh
0d60: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 53 65  ile( p ){.    Se
0d70: 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70  lect *pPrior = p
0d80: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 73 71  ->pPrior;.    sq
0d90: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
0da0: 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  ete(db, p->pELis
0db0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  t);.    sqlite3S
0dc0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
0dd0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 73   p->pSrc);.    s
0de0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
0df0: 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b  (db, p->pWhere);
0e00: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0e10: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
0e20: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
0e30: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
0e40: 74 65 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  te(db, p->pHavin
0e50: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  g);.    sqlite3E
0e60: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
0e70: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
0e80: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
0e90: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
0ea0: 6d 69 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  mit);.#ifndef SQ
0eb0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
0ec0: 46 55 4e 43 0a 20 20 20 20 69 66 28 20 4f 4b 5f  FUNC.    if( OK_
0ed0: 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70  IF_ALWAYS_TRUE(p
0ee0: 2d 3e 70 57 69 6e 44 65 66 6e 29 20 29 7b 0a 20  ->pWinDefn) ){. 
0ef0: 20 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64       sqlite3Wind
0f00: 6f 77 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  owListDelete(db,
0f10: 20 70 2d 3e 70 57 69 6e 44 65 66 6e 29 3b 0a 20   p->pWinDefn);. 
0f20: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
0f30: 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53  if( OK_IF_ALWAYS
0f40: 5f 54 52 55 45 28 70 2d 3e 70 57 69 74 68 29 20  _TRUE(p->pWith) 
0f50: 29 20 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c  ) sqlite3WithDel
0f60: 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69 74 68  ete(db, p->pWith
0f70: 29 3b 0a 20 20 20 20 69 66 28 20 62 46 72 65 65  );.    if( bFree
0f80: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
0f90: 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70  NN(db, p);.    p
0fa0: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 62   = pPrior;.    b
0fb0: 46 72 65 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  Free = 1;.  }.}.
0fc0: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
0fd0: 65 20 61 20 53 65 6c 65 63 74 44 65 73 74 20 73  e a SelectDest s
0fe0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69  tructure..*/.voi
0ff0: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  d sqlite3SelectD
1000: 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74 44 65  estInit(SelectDe
1010: 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74 20 65  st *pDest, int e
1020: 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29  Dest, int iParm)
1030: 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74  {.  pDest->eDest
1040: 20 3d 20 28 75 38 29 65 44 65 73 74 3b 0a 20 20   = (u8)eDest;.  
1050: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 3d  pDest->iSDParm =
1060: 20 69 50 61 72 6d 3b 0a 20 20 70 44 65 73 74 2d   iParm;.  pDest-
1070: 3e 7a 41 66 66 53 64 73 74 20 3d 20 30 3b 0a 20  >zAffSdst = 0;. 
1080: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
1090: 30 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73  0;.  pDest->nSds
10a0: 74 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t = 0;.}.../*.**
10b0: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
10c0: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
10d0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
10e0: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
10f0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
1100: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
1110: 6c 65 63 74 4e 65 77 28 0a 20 20 50 61 72 73 65  lectNew(.  Parse
1120: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1130: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1140: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
1150: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 2f  t *pEList,     /
1160: 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20  * which columns 
1170: 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68  to include in th
1180: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 53 72  e result */.  Sr
1190: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
11a0: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
11b0: 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68 20  clause -- which 
11c0: 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20 2a  tables to scan *
11d0: 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
11e0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  ,         /* the
11f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1200: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
1210: 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65 20  oupBy,   /* the 
1220: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
1230: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
1240: 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  ng,        /* th
1250: 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  e HAVING clause 
1260: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1270: 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74 68  OrderBy,   /* th
1280: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1290: 65 20 2a 2f 0a 20 20 75 33 32 20 73 65 6c 46 6c  e */.  u32 selFl
12a0: 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ags,         /* 
12b0: 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 73 2c  Flag parameters,
12c0: 20 73 75 63 68 20 61 73 20 53 46 5f 44 69 73 74   such as SF_Dist
12d0: 69 6e 63 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  inct */.  Expr *
12e0: 70 4c 69 6d 69 74 20 20 20 20 20 20 20 20 20 20  pLimit          
12f0: 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20  /* LIMIT value. 
1300: 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 74 20   NULL means not 
1310: 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  used */.){.  Sel
1320: 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c  ect *pNew;.  Sel
1330: 65 63 74 20 73 74 61 6e 64 69 6e 3b 0a 20 20 70  ect standin;.  p
1340: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
1350: 61 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61 72 73  allocRawNN(pPars
1360: 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  e->db, sizeof(*p
1370: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
1380: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ew==0 ){.    ass
1390: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
13a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
13b0: 0a 20 20 20 20 70 4e 65 77 20 3d 20 26 73 74 61  .    pNew = &sta
13c0: 6e 64 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndin;.  }.  if( 
13d0: 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  pEList==0 ){.   
13e0: 20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65   pEList = sqlite
13f0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
1400: 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20  pParse, 0,.     
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1430: 6c 69 74 65 33 45 78 70 72 28 70 50 61 72 73 65  lite3Expr(pParse
1440: 2d 3e 64 62 2c 54 4b 5f 41 53 54 45 52 49 53 4b  ->db,TK_ASTERISK
1450: 2c 30 29 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  ,0));.  }.  pNew
1460: 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73  ->pEList = pELis
1470: 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20  t;.  pNew->op = 
1480: 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 4e 65  TK_SELECT;.  pNe
1490: 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 73 65  w->selFlags = se
14a0: 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e  lFlags;.  pNew->
14b0: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e  iLimit = 0;.  pN
14c0: 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b  ew->iOffset = 0;
14d0: 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 49 64 20 3d  .  pNew->selId =
14e0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65   ++pParse->nSele
14f0: 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  ct;.  pNew->addr
1500: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31  OpenEphm[0] = -1
1510: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
1520: 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a  enEphm[1] = -1;.
1530: 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52    pNew->nSelectR
1540: 6f 77 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53  ow = 0;.  if( pS
1550: 72 63 3d 3d 30 20 29 20 70 53 72 63 20 3d 20 73  rc==0 ) pSrc = s
1560: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1570: 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
1580: 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20  izeof(*pSrc));. 
1590: 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53   pNew->pSrc = pS
15a0: 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65  rc;.  pNew->pWhe
15b0: 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70  re = pWhere;.  p
15c0: 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
15d0: 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77  pGroupBy;.  pNew
15e0: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76  ->pHaving = pHav
15f0: 69 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  ing;.  pNew->pOr
1600: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
1610: 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
1620: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e   = 0;.  pNew->pN
1630: 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ext = 0;.  pNew-
1640: 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
1650: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74 68 20  ;.  pNew->pWith 
1660: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
1670: 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
1680: 55 4e 43 0a 20 20 70 4e 65 77 2d 3e 70 57 69 6e  UNC.  pNew->pWin
1690: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 57   = 0;.  pNew->pW
16a0: 69 6e 44 65 66 6e 20 3d 20 30 3b 0a 23 65 6e 64  inDefn = 0;.#end
16b0: 69 66 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  if.  if( pParse-
16c0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
16d0: 64 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53  d ) {.    clearS
16e0: 65 6c 65 63 74 28 70 50 61 72 73 65 2d 3e 64 62  elect(pParse->db
16f0: 2c 20 70 4e 65 77 2c 20 70 4e 65 77 21 3d 26 73  , pNew, pNew!=&s
1700: 74 61 6e 64 69 6e 29 3b 0a 20 20 20 20 70 4e 65  tandin);.    pNe
1710: 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w = 0;.  }else{.
1720: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
1730: 2d 3e 70 53 72 63 21 3d 30 20 7c 7c 20 70 50 61  ->pSrc!=0 || pPa
1740: 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a 20  rse->nErr>0 );. 
1750: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65   }.  assert( pNe
1760: 77 21 3d 26 73 74 61 6e 64 69 6e 20 29 3b 0a 20  w!=&standin );. 
1770: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
1780: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
1790: 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63 74 20  he given Select 
17a0: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c  structure and al
17b0: 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74 72 75  l of its substru
17c0: 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ctures..*/.void 
17d0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
17e0: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
17f0: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
1800: 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f  f( OK_IF_ALWAYS_
1810: 54 52 55 45 28 70 29 20 29 20 63 6c 65 61 72 53  TRUE(p) ) clearS
1820: 65 6c 65 63 74 28 64 62 2c 20 70 2c 20 31 29 3b  elect(db, p, 1);
1830: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1840: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1850: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c  e right-most SEL
1860: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ECT statement in
1870: 20 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a   a compound..*/.
1880: 73 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 66  static Select *f
1890: 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 53 65 6c  indRightmost(Sel
18a0: 65 63 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65  ect *p){.  while
18b0: 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 20 3d  ( p->pNext ) p =
18c0: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74   p->pNext;.  ret
18d0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
18e0: 47 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65  Given 1 to 3 ide
18f0: 6e 74 69 66 69 65 72 73 20 70 72 65 63 65 64 69  ntifiers precedi
1900: 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77  ng the JOIN keyw
1910: 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74  ord, determine t
1920: 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f  he.** type of jo
1930: 69 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  in.  Return an i
1940: 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
1950: 74 68 61 74 20 65 78 70 72 65 73 73 65 73 20 74  that expresses t
1960: 68 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74  hat type.** in t
1970: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c  erms of the foll
1980: 6f 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73  owing bit values
1990: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49  :.**.**     JT_I
19a0: 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43  NNER.**     JT_C
19b0: 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f  ROSS.**     JT_O
19c0: 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e  UTER.**     JT_N
19d0: 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54  ATURAL.**     JT
19e0: 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f  _LEFT.**     JT_
19f0: 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75  RIGHT.**.** A fu
1a00: 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73  ll outer join is
1a10: 20 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e   the combination
1a20: 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20   of JT_LEFT and 
1a30: 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20  JT_RIGHT..**.** 
1a40: 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72  If an illegal or
1a50: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
1a60: 6e 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20  n type is seen, 
1a70: 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72  then still retur
1a80: 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65  n.** a join type
1a90: 2c 20 62 75 74 20 70 75 74 20 61 6e 20 65 72 72  , but put an err
1aa0: 6f 72 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  or in the pParse
1ab0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69   structure..*/.i
1ac0: 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79  nt sqlite3JoinTy
1ad0: 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pe(Parse *pParse
1ae0: 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b  , Token *pA, Tok
1af0: 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70  en *pB, Token *p
1b00: 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79  C){.  int jointy
1b10: 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20  pe = 0;.  Token 
1b20: 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b  *apAll[3];.  Tok
1b30: 65 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 20  en *p;.         
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b50: 20 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35 36      /*   0123456
1b60: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
1b70: 33 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a 20  3456789 123 */. 
1b80: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
1b90: 61 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20  ar zKeyText[] = 
1ba0: 22 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65 72  "naturaleftouter
1bb0: 69 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f  ightfullinnercro
1bc0: 73 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  ss";.  static co
1bd0: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
1be0: 20 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f 2a   u8 i;        /*
1bf0: 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65   Beginning of ke
1c00: 79 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a 4b  yword text in zK
1c10: 65 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20  eyText[] */.    
1c20: 75 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20  u8 nChar;    /* 
1c30: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65  Length of the ke
1c40: 79 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63 74  yword in charact
1c50: 65 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f  ers */.    u8 co
1c60: 64 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20  de;     /* Join 
1c70: 74 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d  type mask */.  }
1c80: 20 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a   aKeyword[] = {.
1c90: 20 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a      /* natural *
1ca0: 2f 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41  / { 0,  7, JT_NA
1cb0: 54 55 52 41 4c 20 20 20 20 20 20 20 20 20 20 20  TURAL           
1cc0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c       },.    /* l
1cd0: 65 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20  eft    */ { 6,  
1ce0: 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55  4, JT_LEFT|JT_OU
1cf0: 54 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  TER          },.
1d00: 20 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a      /* outer   *
1d10: 2f 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55  / { 10, 5, JT_OU
1d20: 54 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  TER             
1d30: 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72       },.    /* r
1d40: 69 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20  ight   */ { 14, 
1d50: 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  5, JT_RIGHT|JT_O
1d60: 55 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c 0a  UTER         },.
1d70: 20 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a      /* full    *
1d80: 2f 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45  / { 19, 4, JT_LE
1d90: 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  FT|JT_RIGHT|JT_O
1da0: 55 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69  UTER },.    /* i
1db0: 6e 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20  nner   */ { 23, 
1dc0: 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20  5, JT_INNER     
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
1de0: 20 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a      /* cross   *
1df0: 2f 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e  / { 28, 5, JT_IN
1e00: 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20  NER|JT_CROSS    
1e10: 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69       },.  };.  i
1e20: 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c  nt i, j;.  apAll
1e30: 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c  [0] = pA;.  apAl
1e40: 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41  l[1] = pB;.  apA
1e50: 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f  ll[2] = pC;.  fo
1e60: 72 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70  r(i=0; i<3 && ap
1e70: 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  All[i]; i++){.  
1e80: 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a    p = apAll[i];.
1e90: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41      for(j=0; j<A
1ea0: 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72  rraySize(aKeywor
1eb0: 64 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  d); j++){.      
1ec0: 69 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f  if( p->n==aKeywo
1ed0: 72 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20  rd[j].nChar .   
1ee0: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
1ef0: 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a  3StrNICmp((char*
1f00: 29 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74  )p->z, &zKeyText
1f10: 5b 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c  [aKeyword[j].i],
1f20: 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20   p->n)==0 ){.   
1f30: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
1f40: 20 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64   aKeyword[j].cod
1f50: 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
1f60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f70: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d      testcase( j=
1f80: 3d 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d  =0 || j==1 || j=
1f90: 3d 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d  =2 || j==3 || j=
1fa0: 3d 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d  =4 || j==5 || j=
1fb0: 3d 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e  =6 );.    if( j>
1fc0: 3d 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77  =ArraySize(aKeyw
1fd0: 6f 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f  ord) ){.      jo
1fe0: 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52  intype |= JT_ERR
1ff0: 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
2000: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2010: 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20  .     (jointype 
2020: 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  & (JT_INNER|JT_O
2030: 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45  UTER))==(JT_INNE
2040: 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20  R|JT_OUTER) ||. 
2050: 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20      (jointype & 
2060: 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29  JT_ERROR)!=0.  )
2070: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2080: 20 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20 20   *zSp = " ";.   
2090: 20 61 73 73 65 72 74 28 20 70 42 21 3d 30 20 29   assert( pB!=0 )
20a0: 3b 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20  ;.    if( pC==0 
20b0: 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20  ){ zSp++; }.    
20c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
20d0: 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
20e0: 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20   or unsupported 
20f0: 6a 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20  join type: ".   
2100: 20 20 20 20 22 25 54 20 25 54 25 73 25 54 22 2c      "%T %T%s%T",
2110: 20 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43   pA, pB, zSp, pC
2120: 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  );.    jointype 
2130: 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65  = JT_INNER;.  }e
2140: 6c 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79 70  lse if( (jointyp
2150: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
2160: 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 6a   .         && (j
2170: 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45  ointype & (JT_LE
2180: 46 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a  FT|JT_RIGHT))!=J
2190: 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73 71  T_LEFT ){.    sq
21a0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
21b0: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49  arse, .      "RI
21c0: 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54  GHT and FULL OUT
21d0: 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74  ER JOINs are not
21e0: 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f   currently suppo
21f0: 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e  rted");.    join
2200: 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b  type = JT_INNER;
2210: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f  .  }.  return jo
2220: 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  intype;.}../*.**
2230: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
2240: 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  x of a column in
2250: 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72   a table.  Retur
2260: 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75  n -1 if the colu
2270: 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e  mn.** is not con
2280: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61  tained in the ta
2290: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
22a0: 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54  nt columnIndex(T
22b0: 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73  able *pTab, cons
22c0: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20  t char *zCol){. 
22d0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
22e0: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
22f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
2300: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54  qlite3StrICmp(pT
2310: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
2320: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65  e, zCol)==0 ) re
2330: 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
2340: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
2350: 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 69 72  * Search the fir
2360: 73 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20 70  st N tables in p
2370: 53 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74  Src, from left t
2380: 6f 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67  o right, looking
2390: 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20   for a.** table 
23a0: 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75 6d  that has a colum
23b0: 6e 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a  n named zCol.  .
23c0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64  **.** When found
23d0: 2c 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e 64  , set *piTab and
23e0: 20 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20 74   *piCol to the t
23f0: 61 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20 63  able index and c
2400: 6f 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f  olumn index.** o
2410: 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63  f the matching c
2420: 6f 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e  olumn and return
2430: 20 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   TRUE..**.** If 
2440: 6e 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75 72  not found, retur
2450: 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74  n FALSE..*/.stat
2460: 69 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64 43  ic int tableAndC
2470: 6f 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72  olumnIndex(.  Sr
2480: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
2490: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74     /* Array of t
24a0: 61 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68 20  ables to search 
24b0: 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
24c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
24d0: 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ber of tables in
24e0: 20 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65   pSrc->a[] to se
24f0: 61 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  arch */.  const 
2500: 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f  char *zCol,    /
2510: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
2520: 6c 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b  lumn we are look
2530: 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  ing for */.  int
2540: 20 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20 20   *piTab,        
2550: 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78    /* Write index
2560: 20 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65   of pSrc->a[] he
2570: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43  re */.  int *piC
2580: 6f 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ol           /* 
2590: 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70  Write index of p
25a0: 53 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70  Src->a[*piTab].p
25b0: 54 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65  Tab->aCol[] here
25c0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25e0: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
25f0: 72 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  r tables in pSrc
2600: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20   */.  int iCol; 
2610: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2620: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61  dex of column ma
2630: 74 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a  tching zCol */..
2640: 20 20 61 73 73 65 72 74 28 20 28 70 69 54 61 62    assert( (piTab
2650: 3d 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29  ==0)==(piCol==0)
2660: 20 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20   );  /* Both or 
2670: 6e 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c 4c  neither are NULL
2680: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
2690: 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43  <N; i++){.    iC
26a0: 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78  ol = columnIndex
26b0: 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62  (pSrc->a[i].pTab
26c0: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28  , zCol);.    if(
26d0: 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20   iCol>=0 ){.    
26e0: 20 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a 20    if( piTab ){. 
26f0: 20 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d 20         *piTab = 
2700: 69 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f  i;.        *piCo
2710: 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  l = iCol;.      
2720: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  }.      return 1
2730: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2740: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2750: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2760: 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 74 65  s used to add te
2770: 72 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20 4a  rms implied by J
2780: 4f 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74 68  OIN syntax to th
2790: 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
27a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  e expression of 
27b0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
27c0: 6e 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72 6d  nt. The new term
27d0: 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e  , which.** is AN
27e0: 44 65 64 20 77 69 74 68 20 74 68 65 20 65 78 69  Ded with the exi
27f0: 73 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61 75  sting WHERE clau
2800: 73 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66 6f  se, is of the fo
2810: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61  rm:.**.**    (ta
2820: 62 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63  b1.col1 = tab2.c
2830: 6f 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  ol2).**.** where
2840: 20 74 61 62 31 20 69 73 20 74 68 65 20 69 53 72   tab1 is the iSr
2850: 63 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53 72  c'th table in Sr
2860: 63 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20 74  cList pSrc and t
2870: 61 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20 28  ab2 is the .** (
2880: 69 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75  iSrc+1)'th. Colu
2890: 6d 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d  mn col1 is colum
28a0: 6e 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61  n iColLeft of ta
28b0: 62 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a  b1, and col2 is.
28c0: 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69  ** column iColRi
28d0: 67 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a  ght of tab2..*/.
28e0: 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57  static void addW
28f0: 68 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73  hereTerm(.  Pars
2900: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2920: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
2930: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
2940: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2950: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
2960: 61 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c  ables in FROM cl
2970: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ause */.  int iL
2980: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
2990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
29a0: 65 78 20 6f 66 20 66 69 72 73 74 20 74 61 62 6c  ex of first tabl
29b0: 65 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72  e to join in pSr
29c0: 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c  c */.  int iColL
29d0: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
29e0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
29f0: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72  of column in fir
2a00: 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  st table */.  in
2a10: 74 20 69 52 69 67 68 74 2c 20 20 20 20 20 20 20  t iRight,       
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a30: 20 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e 64   Index of second
2a40: 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20 2a   table in pSrc *
2a50: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67 68  /.  int iColRigh
2a60: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2a70: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
2a80: 63 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64  column in second
2a90: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
2aa0: 69 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20  isOuterJoin,    
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2ac0: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2ad0: 6e 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a  n OUTER join */.
2ae0: 20 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65    Expr **ppWhere
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b00: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65    /* IN/OUT: The
2b10: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
2b20: 20 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20   add to */.){.  
2b30: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
2b40: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
2b50: 20 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a 70   *pE1;.  Expr *p
2b60: 45 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71 3b  E2;.  Expr *pEq;
2b70: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 66  ..  assert( iLef
2b80: 74 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73  t<iRight );.  as
2b90: 73 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63  sert( pSrc->nSrc
2ba0: 3e 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73  >iRight );.  ass
2bb0: 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65  ert( pSrc->a[iLe
2bc0: 66 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61 73  ft].pTab );.  as
2bd0: 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 52  sert( pSrc->a[iR
2be0: 69 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20  ight].pTab );.. 
2bf0: 20 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43 72   pE1 = sqlite3Cr
2c00: 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64  eateColumnExpr(d
2c10: 62 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20  b, pSrc, iLeft, 
2c20: 69 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32  iColLeft);.  pE2
2c30: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
2c40: 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70  ColumnExpr(db, p
2c50: 53 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43 6f  Src, iRight, iCo
2c60: 6c 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71 20  lRight);..  pEq 
2c70: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
2c80: 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45  Parse, TK_EQ, pE
2c90: 31 2c 20 70 45 32 29 3b 0a 20 20 69 66 28 20 70  1, pE2);.  if( p
2ca0: 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69  Eq && isOuterJoi
2cb0: 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  n ){.    ExprSet
2cc0: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
2cd0: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
2ce0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2cf0: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
2d00: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
2d10: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78  duced) );.    Ex
2d20: 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
2d30: 28 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63  (pEq, EP_NoReduc
2d40: 65 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69  e);.    pEq->iRi
2d50: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28  ghtJoinTable = (
2d60: 69 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b  i16)pE2->iTable;
2d70: 0a 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20  .  }.  *ppWhere 
2d80: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
2d90: 28 64 62 2c 20 2a 70 70 57 68 65 72 65 2c 20 70  (db, *ppWhere, p
2da0: 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  Eq);.}../*.** Se
2db0: 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  t the EP_FromJoi
2dc0: 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c  n property on al
2dd0: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67  l terms of the g
2de0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  iven expression.
2df0: 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20  .** And set the 
2e00: 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
2e10: 61 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66  able to iTable f
2e20: 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  or every term in
2e30: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
2e40: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50  on..**.** The EP
2e50: 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72  _FromJoin proper
2e60: 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65  ty is used on te
2e70: 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73  rms of an expres
2e80: 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20  sion to tell.** 
2e90: 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  the LEFT OUTER J
2ea0: 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  OIN processing l
2eb0: 6f 67 69 63 20 74 68 61 74 20 74 68 69 73 20 74  ogic that this t
2ec0: 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74  erm is part of t
2ed0: 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72  he.** join restr
2ee0: 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64  iction specified
2ef0: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
2f00: 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e  ING clause and n
2f10: 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20  ot a part.** of 
2f20: 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c  the more general
2f30: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
2f40: 54 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20  These terms are 
2f50: 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68  moved over to th
2f60: 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
2f70: 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72  e during join pr
2f80: 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77 65 20  ocessing but we 
2f90: 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
2fa0: 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72   that they.** or
2fb0: 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20  iginated in the 
2fc0: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
2fd0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78  se..**.** The Ex
2fe0: 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
2ff0: 6c 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45  le tells the WHE
3000: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
3010: 73 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a  sing that the.**
3020: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65   expression depe
3030: 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69  nds on table iRi
3040: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65  ghtJoinTable eve
3050: 6e 20 69 66 20 74 68 61 74 20 74 61 62 6c 65 20  n if that table 
3060: 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63  is not.** explic
3070: 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69  itly mentioned i
3080: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
3090: 2e 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74  .  That informat
30a0: 69 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a  ion is needed.**
30b0: 20 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20   for cases like 
30c0: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  this:.**.**    S
30d0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
30e0: 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
30f0: 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31  t1.a=t2.b AND t1
3100: 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77  .x=5.**.** The w
3110: 68 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64  here clause need
3120: 73 20 74 6f 20 64 65 66 65 72 20 74 68 65 20 68  s to defer the h
3130: 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74  andling of the t
3140: 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e  1.x=5.** term un
3150: 74 69 6c 20 61 66 74 65 72 20 74 68 65 20 74 32  til after the t2
3160: 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69   loop of the joi
3170: 6e 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c  n.  In that way,
3180: 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f   a.** NULL t2 ro
3190: 77 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  w will be insert
31a0: 65 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78  ed whenever t1.x
31b0: 21 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e  !=5.  If we do n
31c0: 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20  ot.** defer the 
31d0: 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78  handling of t1.x
31e0: 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70  =5, it will be p
31f0: 72 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61  rocessed immedia
3200: 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68  tely.** after th
3210: 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f  e t1 loop and ro
3220: 77 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20  ws with t1.x!=5 
3230: 77 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61  will never appea
3240: 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70  r in.** the outp
3250: 75 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63  ut, which is inc
3260: 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  orrect..*/.stati
3270: 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78  c void setJoinEx
3280: 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  pr(Expr *p, int 
3290: 69 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65  iTable){.  while
32a0: 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53  ( p ){.    ExprS
32b0: 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  etProperty(p, EP
32c0: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
32d0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
32e0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
32f0: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
3300: 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72  ced) );.    Expr
3310: 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
3320: 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
3330: 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69      p->iRightJoi
3340: 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54  nTable = (i16)iT
3350: 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 70 2d  able;.    if( p-
3360: 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e  >op==TK_FUNCTION
3370: 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29   && p->x.pList )
3380: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
3390: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
33a0: 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  p->x.pList->nExp
33b0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
33c0: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e   setJoinExpr(p->
33d0: 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  x.pList->a[i].pE
33e0: 78 70 72 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20  xpr, iTable);.  
33f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
3400: 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70  setJoinExpr(p->p
3410: 4c 65 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20  Left, iTable);. 
3420: 20 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74     p = p->pRight
3430: 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 20 55 6e 64  ;.  } .}../* Und
3440: 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 73 65  o the work of se
3450: 74 4a 6f 69 6e 45 78 70 72 28 29 2e 20 20 49 6e  tJoinExpr().  In
3460: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
3470: 74 72 65 65 20 70 2c 20 63 6f 6e 76 65 72 74 20  tree p, convert 
3480: 65 76 65 72 79 0a 2a 2a 20 74 65 72 6d 20 74 68  every.** term th
3490: 61 74 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74  at is marked wit
34a0: 68 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 61 6e  h EP_FromJoin an
34b0: 64 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  d iRightJoinTabl
34c0: 65 3d 3d 69 54 61 62 6c 65 20 69 6e 74 6f 0a 2a  e==iTable into.*
34d0: 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 74 65  * an ordinary te
34e0: 72 6d 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68  rm that omits th
34f0: 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 6d 61  e EP_FromJoin ma
3500: 72 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 68  rk..**.** This h
3510: 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20 4c 45  appens when a LE
3520: 46 54 20 4a 4f 49 4e 20 69 73 20 73 69 6d 70 6c  FT JOIN is simpl
3530: 69 66 69 65 64 20 69 6e 74 6f 20 61 6e 20 6f 72  ified into an or
3540: 64 69 6e 61 72 79 20 4a 4f 49 4e 2e 0a 2a 2f 0a  dinary JOIN..*/.
3550: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 73 65  static void unse
3560: 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a  tJoinExpr(Expr *
3570: 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a  p, int iTable){.
3580: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
3590: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
35a0: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
35b0: 4a 6f 69 6e 29 0a 20 20 20 20 20 26 26 20 28 69  Join).     && (i
35c0: 54 61 62 6c 65 3c 30 20 7c 7c 20 70 2d 3e 69 52  Table<0 || p->iR
35d0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69  ightJoinTable==i
35e0: 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20  Table) ){.      
35f0: 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74  ExprClearPropert
3600: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
3610: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
3620: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54   p->op==TK_FUNCT
3630: 49 4f 4e 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73  ION && p->x.pLis
3640: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
3650: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
3660: 20 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e   i<p->x.pList->n
3670: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
3680: 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70      unsetJoinExp
3690: 72 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  r(p->x.pList->a[
36a0: 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65  i].pExpr, iTable
36b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
36c0: 0a 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78  .    unsetJoinEx
36d0: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61  pr(p->pLeft, iTa
36e0: 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  ble);.    p = p-
36f0: 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a  >pRight;.  } .}.
3700: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3710: 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68  ine processes th
3720: 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69  e join informati
3730: 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20  on for a SELECT 
3740: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e  statement..** ON
3750: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
3760: 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  es are converted
3770: 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d   into extra term
3780: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
3790: 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41  lause..** NATURA
37a0: 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65  L joins also cre
37b0: 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20  ate extra WHERE 
37c0: 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
37d0: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66  .** The terms of
37e0: 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61   a FROM clause a
37f0: 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  re contained in 
3800: 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20  the Select.pSrc 
3810: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68  structure..** Th
3820: 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c  e left most tabl
3830: 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65  e is the first e
3840: 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70  ntry in Select.p
3850: 53 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d  Src.  The right-
3860: 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73  most.** table is
3870: 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e   the last entry.
3880: 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61    The join opera
3890: 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74  tor is held in t
38a0: 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74  he entry to.** t
38b0: 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65  he left.  Thus e
38c0: 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20  ntry 0 contains 
38d0: 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
38e0: 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62  r for the join b
38f0: 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65  etween.** entrie
3900: 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20  s 0 and 1.  Any 
3910: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
3920: 73 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ses associated w
3930: 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65  ith the join are
3940: 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65  .** also attache
3950: 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e  d to the left en
3960: 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  try..**.** This 
3970: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
3980: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
3990: 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rors encountered
39a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
39b0: 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
39c0: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
39d0: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53   Select *p){.  S
39e0: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
39f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3a00: 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  * All tables in 
3a10: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
3a20: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
3a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a40: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
3a50: 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63  nters */.  struc
3a60: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
3a70: 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65  pLeft;     /* Le
3a80: 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ft table being j
3a90: 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  oined */.  struc
3aa0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
3ab0: 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69  pRight;    /* Ri
3ac0: 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20  ght table being 
3ad0: 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72  joined */..  pSr
3ae0: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  c = p->pSrc;.  p
3af0: 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b  Left = &pSrc->a[
3b00: 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26  0];.  pRight = &
3b10: 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28  pLeft[1];.  for(
3b20: 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
3b30: 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74  c-1; i++, pRight
3b40: 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20  ++, pLeft++){.  
3b50: 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54    Table *pRightT
3b60: 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61  ab = pRight->pTa
3b70: 62 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75 74  b;.    int isOut
3b80: 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45 56  er;..    if( NEV
3b90: 45 52 28 70 4c 65 66 74 2d 3e 70 54 61 62 3d 3d  ER(pLeft->pTab==
3ba0: 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d  0 || pRightTab==
3bb0: 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  0) ) continue;. 
3bc0: 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52     isOuter = (pR
3bd0: 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  ight->fg.jointyp
3be0: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
3bf0: 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74  ;..    /* When t
3c00: 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
3c10: 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61  rd is present, a
3c20: 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  dd WHERE clause 
3c30: 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a  terms for.    **
3c40: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68   every column th
3c50: 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  at the two table
3c60: 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e  s have in common
3c70: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
3c80: 20 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e   pRight->fg.join
3c90: 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
3ca0: 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  L ){.      if( p
3cb0: 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52  Right->pOn || pR
3cc0: 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a  ight->pUsing ){.
3cd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
3ce0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3cf0: 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20  "a NATURAL join 
3d00: 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20  may not have ". 
3d10: 20 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e            "an ON
3d20: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
3d30: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72  ", 0);.        r
3d40: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
3d50: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
3d60: 6a 3c 70 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f  j<pRightTab->nCo
3d70: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
3d80: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
3d90: 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d  /* Name of colum
3da0: 6e 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 74  n in the right t
3db0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
3dc0: 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20 2f  int iLeft;     /
3dd0: 2a 20 4d 61 74 63 68 69 6e 67 20 6c 65 66 74 20  * Matching left 
3de0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
3df0: 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20   int iLeftCol;  
3e00: 2f 2a 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75  /* Matching colu
3e10: 6d 6e 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74  mn in the left t
3e20: 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20  able */..       
3e30: 20 7a 4e 61 6d 65 20 3d 20 70 52 69 67 68 74 54   zName = pRightT
3e40: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
3e50: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74  e;.        if( t
3e60: 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64  ableAndColumnInd
3e70: 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e  ex(pSrc, i+1, zN
3e80: 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c  ame, &iLeft, &iL
3e90: 65 66 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20  eftCol) ){.     
3ea0: 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72       addWhereTer
3eb0: 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20  m(pParse, pSrc, 
3ec0: 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c  iLeft, iLeftCol,
3ed0: 20 69 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20   i+1, j,.       
3ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ef0: 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68  isOuter, &p->pWh
3f00: 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ere);.        }.
3f10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
3f20: 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62     /* Disallow b
3f30: 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  oth ON and USING
3f40: 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20   clauses in the 
3f50: 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f  same join.    */
3f60: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
3f70: 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e  >pOn && pRight->
3f80: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
3f90: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
3fa0: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
3fb0: 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64  have both ON and
3fc0: 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20   USING ".       
3fd0: 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65   "clauses in the
3fe0: 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20   same join");.  
3ff0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
4000: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
4010: 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f  the ON clause to
4020: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
4030: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f  WHERE clause, co
4040: 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a  nnected by.    *
4050: 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  * an AND operato
4060: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
4070: 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b  ( pRight->pOn ){
4080: 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 75 74  .      if( isOut
4090: 65 72 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72  er ) setJoinExpr
40a0: 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52  (pRight->pOn, pR
40b0: 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  ight->iCursor);.
40c0: 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20        p->pWhere 
40d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
40e0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
40f0: 70 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e  pWhere, pRight->
4100: 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67  pOn);.      pRig
4110: 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20  ht->pOn = 0;.   
4120: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
4130: 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e  e extra terms on
4140: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
4150: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
4160: 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69  n named.    ** i
4170: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
4180: 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66  se.  Example: If
4190: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
41a0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65  to be joined are
41b0: 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42   .    ** A and B
41c0: 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63   and the USING c
41d0: 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59  lause names X, Y
41e0: 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64  , and Z, then ad
41f0: 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f  d this.    ** to
4200: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
4210: 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e  e:    A.X=B.X AN
4220: 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e  D A.Y=B.Y AND A.
4230: 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70  Z=B.Z.    ** Rep
4240: 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ort an error if 
4250: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69  any column menti
4260: 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e  oned in the USIN
4270: 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20  G clause is.    
4280: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  ** not contained
4290: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20   in both tables 
42a0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20  to be joined..  
42b0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
42c0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
42d0: 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69       IdList *pLi
42e0: 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73  st = pRight->pUs
42f0: 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  ing;.      for(j
4300: 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; j<pList->nId
4310: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
4320: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
4330: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
4340: 74 65 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e  term in the USIN
4350: 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  G clause */.    
4360: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20      int iLeft;  
4370: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e       /* Table on
4380: 20 74 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d   the left with m
4390: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e  atching column n
43a0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ame */.        i
43b0: 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20  nt iLeftCol;    
43c0: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  /* Column number
43d0: 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c   of matching col
43e0: 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  umn on the left 
43f0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
4400: 52 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43  RightCol;   /* C
4410: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
4420: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
4430: 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
4440: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
4450: 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61   pList->a[j].zNa
4460: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67  me;.        iRig
4470: 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e  htCol = columnIn
4480: 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a  dex(pRightTab, z
4490: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Name);.        i
44a0: 66 28 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20  f( iRightCol<0. 
44b0: 20 20 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c          || !tabl
44c0: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
44d0: 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65  pSrc, i+1, zName
44e0: 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74  , &iLeft, &iLeft
44f0: 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  Col).        ){.
4500: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
4510: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
4520: 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75  , "cannot join u
4530: 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d  sing column %s -
4540: 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20   column ".      
4550: 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65        "not prese
4560: 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  nt in both table
4570: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
4580: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
4590: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
45a0: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
45b0: 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65  Parse, pSrc, iLe
45c0: 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b  ft, iLeftCol, i+
45d0: 31 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20  1, iRightCol,.  
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45f0: 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e     isOuter, &p->
4600: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d  pWhere);.      }
4610: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4620: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
4630: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
4640: 68 69 73 20 6f 62 6a 65 63 74 20 68 6f 6c 64 73  his object holds
4650: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 28 62 65   information (be
4660: 79 6f 6e 64 20 70 50 61 72 73 65 20 61 6e 64 20  yond pParse and 
4670: 70 53 65 6c 65 63 74 29 0a 2a 2a 20 6e 65 65 64  pSelect).** need
4680: 65 64 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 6e  ed to load the n
4690: 65 78 74 20 72 65 73 75 6c 74 20 72 6f 77 20 74  ext result row t
46a0: 68 61 74 20 69 73 20 74 6f 20 62 65 20 61 64 64  hat is to be add
46b0: 65 64 20 74 6f 20 74 68 65 20 73 6f 72 74 65 72  ed to the sorter
46c0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
46d0: 75 63 74 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20  uct RowLoadInfo 
46e0: 52 6f 77 4c 6f 61 64 49 6e 66 6f 3b 0a 73 74 72  RowLoadInfo;.str
46f0: 75 63 74 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20  uct RowLoadInfo 
4700: 7b 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c  {.  int regResul
4710: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4720: 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74   /* Store result
4730: 73 20 69 6e 20 61 72 72 61 79 20 6f 66 20 72 65  s in array of re
4740: 67 69 73 74 65 72 73 20 68 65 72 65 20 2a 2f 0a  gisters here */.
4750: 20 20 75 38 20 65 63 65 6c 46 6c 61 67 73 3b 20    u8 ecelFlags; 
4760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4770: 2a 20 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  * Flag argument 
4780: 74 6f 20 45 78 70 72 43 6f 64 65 45 78 70 72 4c  to ExprCodeExprL
4790: 69 73 74 28 29 20 2a 2f 0a 23 69 66 64 65 66 20  ist() */.#ifdef 
47a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
47b0: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
47c0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 78 74    ExprList *pExt
47d0: 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ra;            /
47e0: 2a 20 45 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20  * Extra columns 
47f0: 6e 65 65 64 65 64 20 62 79 20 73 6f 72 74 65 72  needed by sorter
4800: 20 72 65 66 73 20 2a 2f 0a 20 20 69 6e 74 20 72   refs */.  int r
4810: 65 67 45 78 74 72 61 52 65 73 75 6c 74 3b 20 20  egExtraResult;  
4820: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
4830: 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 65 78 74   to load the ext
4840: 72 61 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 65  ra columns */.#e
4850: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  ndif.};../*.** T
4860: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
4870: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6c 6f 61   the work of loa
4880: 64 69 6e 67 20 71 75 65 72 79 20 64 61 74 61 20  ding query data 
4890: 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  into an array of
48a0: 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73 6f  .** registers so
48b0: 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 20   that it can be 
48c0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 6f 72  added to the sor
48d0: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
48e0: 6f 69 64 20 69 6e 6e 65 72 4c 6f 6f 70 4c 6f 61  oid innerLoopLoa
48f0: 64 52 6f 77 28 0a 20 20 50 61 72 73 65 20 2a 70  dRow(.  Parse *p
4900: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
4910: 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
4920: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
4930: 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
4940: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20  pSelect,        
4950: 20 20 20 2f 2a 20 54 68 65 20 71 75 65 72 79 20     /* The query 
4960: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
4970: 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20 2a 70 49   RowLoadInfo *pI
4980: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 49  nfo         /* I
4990: 6e 66 6f 20 6e 65 65 64 65 64 20 74 6f 20 63 6f  nfo needed to co
49a0: 6d 70 6c 65 74 65 20 74 68 65 20 72 6f 77 20 6c  mplete the row l
49b0: 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  oad */.){.  sqli
49c0: 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
49d0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
49e0: 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 70 49 6e  ect->pEList, pIn
49f0: 66 6f 2d 3e 72 65 67 52 65 73 75 6c 74 2c 0a 20  fo->regResult,. 
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a10: 20 20 20 20 20 20 20 20 20 30 2c 20 70 49 6e 66           0, pInf
4a20: 6f 2d 3e 65 63 65 6c 46 6c 61 67 73 29 3b 0a 23  o->ecelFlags);.#
4a30: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
4a40: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
4a50: 45 4e 43 45 53 0a 20 20 69 66 28 20 70 49 6e 66  ENCES.  if( pInf
4a60: 6f 2d 3e 70 45 78 74 72 61 20 29 7b 0a 20 20 20  o->pExtra ){.   
4a70: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
4a80: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
4a90: 20 70 49 6e 66 6f 2d 3e 70 45 78 74 72 61 2c 20   pInfo->pExtra, 
4aa0: 70 49 6e 66 6f 2d 3e 72 65 67 45 78 74 72 61 52  pInfo->regExtraR
4ab0: 65 73 75 6c 74 2c 20 30 2c 20 30 29 3b 0a 20 20  esult, 0, 0);.  
4ac0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
4ad0: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
4ae0: 64 62 2c 20 70 49 6e 66 6f 2d 3e 70 45 78 74 72  db, pInfo->pExtr
4af0: 61 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  a);.  }.#endif.}
4b00: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 74 68 65  ../*.** Code the
4b10: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 69   OP_MakeRecord i
4b20: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
4b30: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 65 6e  generates the en
4b40: 74 72 79 20 74 6f 20 62 65 0a 2a 2a 20 61 64 64  try to be.** add
4b50: 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74  ed into the sort
4b60: 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
4b70: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 6e   the register in
4b80: 20 77 68 69 63 68 20 74 68 65 20 72 65 73 75 6c   which the resul
4b90: 74 20 69 73 20 73 74 6f 72 65 64 2e 0a 2a 2f 0a  t is stored..*/.
4ba0: 73 74 61 74 69 63 20 69 6e 74 20 6d 61 6b 65 53  static int makeS
4bb0: 6f 72 74 65 72 52 65 63 6f 72 64 28 0a 20 20 50  orterRecord(.  P
4bc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
4bd0: 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 0a  SortCtx *pSort,.
4be0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
4bf0: 74 2c 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65  t,.  int regBase
4c00: 2c 0a 20 20 69 6e 74 20 6e 42 61 73 65 0a 29 7b  ,.  int nBase.){
4c10: 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20  .  int nOBSat = 
4c20: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20  pSort->nOBSat;. 
4c30: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
4c40: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
4c50: 72 65 67 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73  regOut = ++pPars
4c60: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 69 66 28 20 70  e->nMem;.  if( p
4c70: 53 6f 72 74 2d 3e 70 44 65 66 65 72 72 65 64 52  Sort->pDeferredR
4c80: 6f 77 4c 6f 61 64 20 29 7b 0a 20 20 20 20 69 6e  owLoad ){.    in
4c90: 6e 65 72 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28 70  nerLoopLoadRow(p
4ca0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
4cb0: 70 53 6f 72 74 2d 3e 70 44 65 66 65 72 72 65 64  pSort->pDeferred
4cc0: 52 6f 77 4c 6f 61 64 29 3b 0a 20 20 7d 0a 20 20  RowLoad);.  }.  
4cd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4ce0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
4cf0: 72 64 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53  rd, regBase+nOBS
4d00: 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74  at, nBase-nOBSat
4d10: 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 72 65 74  , regOut);.  ret
4d20: 75 72 6e 20 72 65 67 4f 75 74 3b 0a 7d 0a 0a 2f  urn regOut;.}../
4d30: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
4d40: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73  de that will pus
4d50: 68 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 20  h the record in 
4d60: 72 65 67 69 73 74 65 72 73 20 72 65 67 44 61 74  registers regDat
4d70: 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72 65 67  a.** through reg
4d80: 44 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e 74  Data+nData-1 ont
4d90: 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f  o the sorter..*/
4da0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73  .static void pus
4db0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50  hOntoSorter(.  P
4dc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4dd0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
4de0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f 72  context */.  Sor
4df0: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20  tCtx *pSort,    
4e00: 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
4e10: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52 44  on about the ORD
4e20: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
4e30: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
4e40: 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
4e50: 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61  whole SELECT sta
4e60: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
4e70: 72 65 67 44 61 74 61 2c 20 20 20 20 20 20 20 20  regData,        
4e80: 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69     /* First regi
4e90: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74  ster holding dat
4ea0: 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a  a to be sorted *
4eb0: 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67 44  /.  int regOrigD
4ec0: 61 74 61 2c 20 20 20 20 20 20 20 2f 2a 20 46 69  ata,       /* Fi
4ed0: 72 73 74 20 72 65 67 69 73 74 65 72 20 68 6f 6c  rst register hol
4ee0: 64 69 6e 67 20 64 61 74 61 20 62 65 66 6f 72 65  ding data before
4ef0: 20 70 61 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e   packing */.  in
4f00: 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20 20 20  t nData,        
4f10: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4f20: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  f elements in th
4f30: 65 20 72 65 67 44 61 74 61 20 64 61 74 61 20 61  e regData data a
4f40: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  rray */.  int nP
4f50: 72 65 66 69 78 52 65 67 20 20 20 20 20 20 20 20  refixReg        
4f60: 20 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65 67 20 70   /* No. of reg p
4f70: 72 69 6f 72 20 74 6f 20 72 65 67 44 61 74 61 20  rior to regData 
4f80: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
4f90: 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  e */.){.  Vdbe *
4fa0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
4fb0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
4fc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
4fd0: 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  mt under constru
4fe0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62  ction */.  int b
4ff0: 53 65 71 20 3d 20 28 28 70 53 6f 72 74 2d 3e 73  Seq = ((pSort->s
5000: 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46  ortFlags & SORTF
5010: 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29 3d 3d  LAG_UseSorter)==
5020: 30 29 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20  0);.  int nExpr 
5030: 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  = pSort->pOrderB
5040: 79 2d 3e 6e 45 78 70 72 3b 20 20 20 20 20 20 20  y->nExpr;       
5050: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66         /* No. of
5060: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
5070: 2a 2f 0a 20 20 69 6e 74 20 6e 42 61 73 65 20 3d  */.  int nBase =
5080: 20 6e 45 78 70 72 20 2b 20 62 53 65 71 20 2b 20   nExpr + bSeq + 
5090: 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  nData;          
50a0: 20 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 73 20        /* Fields 
50b0: 69 6e 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  in sorter record
50c0: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73   */.  int regBas
50d0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50f0: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 73 20 66         /* Regs f
5100: 6f 72 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  or sorter record
5110: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63   */.  int regRec
5120: 6f 72 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ord = 0;        
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5140: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 65 6d 62         /* Assemb
5150: 6c 65 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72  led sorter recor
5160: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61  d */.  int nOBSa
5170: 74 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  t = pSort->nOBSa
5180: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
5190: 20 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52          /* ORDER
51a0: 20 42 59 20 74 65 72 6d 73 20 74 6f 20 73 6b 69   BY terms to ski
51b0: 70 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  p */.  int op;  
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63            /* Opc
51e0: 6f 64 65 20 74 6f 20 61 64 64 20 73 6f 72 74 65  ode to add sorte
51f0: 72 20 72 65 63 6f 72 64 20 74 6f 20 73 6f 72 74  r record to sort
5200: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6d  er */.  int iLim
5210: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
5220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49             /* LI
5230: 4d 49 54 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  MIT counter */. 
5240: 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 30 3b 20   int iSkip = 0; 
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5260: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68      /* End of th
5270: 65 20 73 6f 72 74 65 72 20 69 6e 73 65 72 74 20  e sorter insert 
5280: 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 61 73 73 65 72  loop */..  asser
5290: 74 28 20 62 53 65 71 3d 3d 30 20 7c 7c 20 62 53  t( bSeq==0 || bS
52a0: 65 71 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54  eq==1 );..  /* T
52b0: 68 72 65 65 20 63 61 73 65 73 3a 0a 20 20 2a 2a  hree cases:.  **
52c0: 20 20 20 28 31 29 20 54 68 65 20 64 61 74 61 20     (1) The data 
52d0: 74 6f 20 62 65 20 73 6f 72 74 65 64 20 68 61 73  to be sorted has
52e0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 61   already been pa
52f0: 63 6b 65 64 20 69 6e 74 6f 20 61 20 52 65 63 6f  cked into a Reco
5300: 72 64 0a 20 20 2a 2a 20 20 20 20 20 20 20 62 79  rd.  **       by
5310: 20 61 20 70 72 69 6f 72 20 4f 50 5f 4d 61 6b 65   a prior OP_Make
5320: 52 65 63 6f 72 64 2e 20 20 49 6e 20 74 68 69 73  Record.  In this
5330: 20 63 61 73 65 20 6e 44 61 74 61 3d 3d 31 20 61   case nData==1 a
5340: 6e 64 20 72 65 67 44 61 74 61 0a 20 20 2a 2a 20  nd regData.  ** 
5350: 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20 63 6f        will be co
5360: 6d 70 6c 65 74 65 6c 79 20 75 6e 72 65 6c 61 74  mpletely unrelat
5370: 65 64 20 74 6f 20 72 65 67 4f 72 69 67 44 61 74  ed to regOrigDat
5380: 61 2e 0a 20 20 2a 2a 20 20 20 28 32 29 20 41 6c  a..  **   (2) Al
5390: 6c 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73  l output columns
53a0: 20 61 72 65 20 69 6e 63 6c 75 64 65 64 20 69 6e   are included in
53b0: 20 74 68 65 20 73 6f 72 74 20 72 65 63 6f 72 64   the sort record
53c0: 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 2a 2a 20  .  In that.  ** 
53d0: 20 20 20 20 20 20 63 61 73 65 20 72 65 67 44 61        case regDa
53e0: 74 61 3d 3d 72 65 67 4f 72 69 67 44 61 74 61 2e  ta==regOrigData.
53f0: 0a 20 20 2a 2a 20 20 20 28 33 29 20 53 6f 6d 65  .  **   (3) Some
5400: 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 20   output columns 
5410: 61 72 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  are omitted from
5420: 20 74 68 65 20 73 6f 72 74 20 72 65 63 6f 72 64   the sort record
5430: 20 64 75 65 20 74 6f 0a 20 20 2a 2a 20 20 20 20   due to.  **    
5440: 20 20 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e     the SQLITE_EN
5450: 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45  ABLE_SORTER_REFE
5460: 52 45 4e 43 45 20 6f 70 74 69 6d 69 7a 61 74 69  RENCE optimizati
5470: 6f 6e 2c 20 6f 72 20 64 75 65 20 74 6f 20 74 68  on, or due to th
5480: 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 53 51 4c  e.  **       SQL
5490: 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46  ITE_ECEL_OMITREF
54a0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 6f   optimization, o
54b0: 72 20 64 75 65 20 74 6f 20 74 68 65 20 0a 20 20  r due to the .  
54c0: 2a 2a 20 20 20 20 20 20 20 53 6f 72 74 43 74 78  **       SortCtx
54d0: 2e 70 44 65 66 65 72 72 65 64 52 6f 77 4c 6f 61  .pDeferredRowLoa
54e0: 64 20 6f 70 74 69 6d 69 61 74 69 6f 6e 2e 20 20  d optimiation.  
54f0: 49 6e 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20  In any of these 
5500: 63 61 73 65 73 0a 20 20 2a 2a 20 20 20 20 20 20  cases.  **      
5510: 20 72 65 67 4f 72 69 67 44 61 74 61 20 69 73 20   regOrigData is 
5520: 30 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 69  0 to prevent thi
5530: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74  s routine from t
5540: 72 79 69 6e 67 20 74 6f 20 63 6f 70 79 0a 20 20  rying to copy.  
5550: 2a 2a 20 20 20 20 20 20 20 76 61 6c 75 65 73 20  **       values 
5560: 74 68 61 74 20 6d 69 67 68 74 20 6e 6f 74 20 79  that might not y
5570: 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2f 0a 20  et exist..  */. 
5580: 20 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d   assert( nData==
5590: 31 20 7c 7c 20 72 65 67 44 61 74 61 3d 3d 72 65  1 || regData==re
55a0: 67 4f 72 69 67 44 61 74 61 20 7c 7c 20 72 65 67  gOrigData || reg
55b0: 4f 72 69 67 44 61 74 61 3d 3d 30 20 29 3b 0a 0a  OrigData==0 );..
55c0: 20 20 69 66 28 20 6e 50 72 65 66 69 78 52 65 67    if( nPrefixReg
55d0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
55e0: 6e 50 72 65 66 69 78 52 65 67 3d 3d 6e 45 78 70  nPrefixReg==nExp
55f0: 72 2b 62 53 65 71 20 29 3b 0a 20 20 20 20 72 65  r+bSeq );.    re
5600: 67 42 61 73 65 20 3d 20 72 65 67 44 61 74 61 20  gBase = regData 
5610: 2d 20 6e 50 72 65 66 69 78 52 65 67 3b 0a 20 20  - nPrefixReg;.  
5620: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 42 61  }else{.    regBa
5630: 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  se = pParse->nMe
5640: 6d 20 2b 20 31 3b 0a 20 20 20 20 70 50 61 72 73  m + 1;.    pPars
5650: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 42 61 73 65  e->nMem += nBase
5660: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
5670: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
5680: 3d 3d 30 20 7c 7c 20 70 53 65 6c 65 63 74 2d 3e  ==0 || pSelect->
5690: 69 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69  iLimit!=0 );.  i
56a0: 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d  Limit = pSelect-
56b0: 3e 69 4f 66 66 73 65 74 20 3f 20 70 53 65 6c 65  >iOffset ? pSele
56c0: 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20  ct->iOffset+1 : 
56d0: 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b  pSelect->iLimit;
56e0: 0a 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44  .  pSort->labelD
56f0: 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  one = sqlite3Vdb
5700: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
5710: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
5720: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
5730: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
5740: 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67 4f 72  , regBase, regOr
5750: 69 67 44 61 74 61 2c 0a 20 20 20 20 20 20 20 20  igData,.        
5760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5770: 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55    SQLITE_ECEL_DU
5780: 50 20 7c 20 28 72 65 67 4f 72 69 67 44 61 74 61  P | (regOrigData
5790: 3f 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45  ? SQLITE_ECEL_RE
57a0: 46 20 3a 20 30 29 29 3b 0a 20 20 69 66 28 20 62  F : 0));.  if( b
57b0: 53 65 71 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Seq ){.    sqlit
57c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
57d0: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 53 6f  OP_Sequence, pSo
57e0: 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65  rt->iECursor, re
57f0: 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20 20  gBase+nExpr);.  
5800: 7d 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78 52  }.  if( nPrefixR
5810: 65 67 3d 3d 30 20 26 26 20 6e 44 61 74 61 3e 30  eg==0 && nData>0
5820: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
5830: 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
5840: 73 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65 67  se, regData, reg
5850: 42 61 73 65 2b 6e 45 78 70 72 2b 62 53 65 71 2c  Base+nExpr+bSeq,
5860: 20 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 69   nData);.  }.  i
5870: 66 28 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20  f( nOBSat>0 ){. 
5880: 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 4b 65     int regPrevKe
5890: 79 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  y;   /* The firs
58a0: 74 20 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e 73  t nOBSat columns
58b0: 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73   of the previous
58c0: 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20   row */.    int 
58d0: 61 64 64 72 46 69 72 73 74 3b 20 20 20 20 2f 2a  addrFirst;    /*
58e0: 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
58f0: 4f 50 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65 20  OP_IfNot opcode 
5900: 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4a  */.    int addrJ
5910: 6d 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  mp;      /* Addr
5920: 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a 75  ess of the OP_Ju
5930: 6d 70 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  mp opcode */.   
5940: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20   VdbeOp *pOp;   
5950: 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68 61     /* Opcode tha
5960: 74 20 6f 70 65 6e 73 20 74 68 65 20 73 6f 72 74  t opens the sort
5970: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4b  er */.    int nK
5980: 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ey;         /* N
5990: 75 6d 62 65 72 20 6f 66 20 73 6f 72 74 69 6e 67  umber of sorting
59a0: 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69 6e   key columns, in
59b0: 63 6c 75 64 69 6e 67 20 4f 50 5f 53 65 71 75 65  cluding OP_Seque
59c0: 6e 63 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e  nce */.    KeyIn
59d0: 66 6f 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a 20  fo *pKI;     /* 
59e0: 4f 72 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66 6f  Original KeyInfo
59f0: 20 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 20 74   on the sorter t
5a00: 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 65 67  able */..    reg
5a10: 52 65 63 6f 72 64 20 3d 20 6d 61 6b 65 53 6f 72  Record = makeSor
5a20: 74 65 72 52 65 63 6f 72 64 28 70 50 61 72 73 65  terRecord(pParse
5a30: 2c 20 70 53 6f 72 74 2c 20 70 53 65 6c 65 63 74  , pSort, pSelect
5a40: 2c 20 72 65 67 42 61 73 65 2c 20 6e 42 61 73 65  , regBase, nBase
5a50: 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76 4b 65  );.    regPrevKe
5a60: 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  y = pParse->nMem
5a70: 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  +1;.    pParse->
5a80: 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e 6e  nMem += pSort->n
5a90: 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65 79 20  OBSat;.    nKey 
5aa0: 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d  = nExpr - pSort-
5ab0: 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65 71 3b 0a  >nOBSat + bSeq;.
5ac0: 20 20 20 20 69 66 28 20 62 53 65 71 20 29 7b 0a      if( bSeq ){.
5ad0: 20 20 20 20 20 20 61 64 64 72 46 69 72 73 74 20        addrFirst 
5ae0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
5af0: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op1(v, OP_IfNot,
5b00: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b   regBase+nExpr);
5b10: 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20   .    }else{.   
5b20: 20 20 20 61 64 64 72 46 69 72 73 74 20 3d 20 73     addrFirst = s
5b30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
5b40: 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 54  (v, OP_SequenceT
5b50: 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75  est, pSort->iECu
5b60: 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rsor);.    }.   
5b70: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5b80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5b90: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
5ba0: 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76 4b 65  mpare, regPrevKe
5bb0: 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53 6f 72  y, regBase, pSor
5bc0: 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20  t->nOBSat);.    
5bd0: 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
5be0: 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d  eGetOp(v, pSort-
5bf0: 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b  >addrSortIndex);
5c00: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
5c10: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
5c20: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  d ) return;.    
5c30: 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20 2b  pOp->p2 = nKey +
5c40: 20 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b 49 20   nData;.    pKI 
5c50: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e  = pOp->p4.pKeyIn
5c60: 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  fo;.    memset(p
5c70: 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20  KI->aSortOrder, 
5c80: 30 2c 20 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c  0, pKI->nKeyFiel
5c90: 64 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50 5f  d); /* Makes OP_
5ca0: 4a 75 6d 70 20 74 65 73 74 61 62 6c 65 20 2a 2f  Jump testable */
5cb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5cc0: 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
5cd0: 28 63 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f 4b  (char*)pKI, P4_K
5ce0: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 74 65 73  EYINFO);.    tes
5cf0: 74 63 61 73 65 28 20 70 4b 49 2d 3e 6e 41 6c 6c  tcase( pKI->nAll
5d00: 46 69 65 6c 64 20 3e 20 70 4b 49 2d 3e 6e 4b 65  Field > pKI->nKe
5d10: 79 46 69 65 6c 64 2b 32 20 29 3b 0a 20 20 20 20  yField+2 );.    
5d20: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
5d30: 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
5d40: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
5d50: 61 72 73 65 2c 70 53 6f 72 74 2d 3e 70 4f 72 64  arse,pSort->pOrd
5d60: 65 72 42 79 2c 6e 4f 42 53 61 74 2c 0a 20 20 20  erBy,nOBSat,.   
5d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d90: 20 20 20 20 20 20 20 20 70 4b 49 2d 3e 6e 41 6c          pKI->nAl
5da0: 6c 46 69 65 6c 64 2d 70 4b 49 2d 3e 6e 4b 65 79  lField-pKI->nKey
5db0: 46 69 65 6c 64 2d 31 29 3b 0a 20 20 20 20 61 64  Field-1);.    ad
5dc0: 64 72 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33 56  drJmp = sqlite3V
5dd0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
5de0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5df0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
5e00: 75 6d 70 2c 20 61 64 64 72 4a 6d 70 2b 31 2c 20  ump, addrJmp+1, 
5e10: 30 2c 20 61 64 64 72 4a 6d 70 2b 31 29 3b 20 56  0, addrJmp+1); V
5e20: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
5e30: 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c      pSort->label
5e40: 42 6b 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 56  BkOut = sqlite3V
5e50: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
5e60: 0a 20 20 20 20 70 53 6f 72 74 2d 3e 72 65 67 52  .    pSort->regR
5e70: 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65  eturn = ++pParse
5e80: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
5e90: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5ea0: 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74   OP_Gosub, pSort
5eb0: 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f  ->regReturn, pSo
5ec0: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b  rt->labelBkOut);
5ed0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5ee0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73  AddOp1(v, OP_Res
5ef0: 65 74 53 6f 72 74 65 72 2c 20 70 53 6f 72 74 2d  etSorter, pSort-
5f00: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  >iECursor);.    
5f10: 69 66 28 20 69 4c 69 6d 69 74 20 29 7b 0a 20 20  if( iLimit ){.  
5f20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5f30: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp2(v, OP_IfNo
5f40: 74 2c 20 69 4c 69 6d 69 74 2c 20 70 53 6f 72 74  t, iLimit, pSort
5f50: 2d 3e 6c 61 62 65 6c 44 6f 6e 65 29 3b 0a 20 20  ->labelDone);.  
5f60: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
5f70: 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  (v);.    }.    s
5f80: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
5f90: 72 65 28 76 2c 20 61 64 64 72 46 69 72 73 74 29  re(v, addrFirst)
5fa0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
5fb0: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
5fc0: 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67 50 72  , regBase, regPr
5fd0: 65 76 4b 65 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f  evKey, pSort->nO
5fe0: 42 53 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  BSat);.    sqlit
5ff0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
6000: 2c 20 61 64 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a  , addrJmp);.  }.
6010: 20 20 69 66 28 20 69 4c 69 6d 69 74 20 29 7b 0a    if( iLimit ){.
6020: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
6030: 6f 69 6e 74 20 74 68 65 20 76 61 6c 75 65 73 20  oint the values 
6040: 66 6f 72 20 74 68 65 20 6e 65 77 20 73 6f 72 74  for the new sort
6050: 65 72 20 65 6e 74 72 79 20 61 72 65 20 73 74 6f  er entry are sto
6060: 72 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 61 6e  red.    ** in an
6070: 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
6080: 65 72 73 2e 20 54 68 65 79 20 6e 65 65 64 20 74  ers. They need t
6090: 6f 20 62 65 20 63 6f 6d 70 6f 73 65 64 20 69 6e  o be composed in
60a0: 74 6f 20 61 20 72 65 63 6f 72 64 0a 20 20 20 20  to a record.    
60b0: 2a 2a 20 61 6e 64 20 69 6e 73 65 72 74 65 64 20  ** and inserted 
60c0: 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 20  into the sorter 
60d0: 69 66 20 65 69 74 68 65 72 20 28 61 29 20 74 68  if either (a) th
60e0: 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ere are currentl
60f0: 79 0a 20 20 20 20 2a 2a 20 6c 65 73 73 20 74 68  y.    ** less th
6100: 61 6e 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20  an LIMIT+OFFSET 
6110: 69 74 65 6d 73 20 6f 72 20 28 62 29 20 74 68 65  items or (b) the
6120: 20 6e 65 77 20 72 65 63 6f 72 64 20 69 73 20 73   new record is s
6130: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 20 20 20  maller than .   
6140: 20 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20   ** the largest 
6150: 72 65 63 6f 72 64 20 63 75 72 72 65 6e 74 6c 79  record currently
6160: 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 2e 20   in the sorter. 
6170: 49 66 20 28 62 29 20 69 73 20 74 72 75 65 20 61  If (b) is true a
6180: 6e 64 20 74 68 65 72 65 0a 20 20 20 20 2a 2a 20  nd there.    ** 
6190: 61 72 65 20 61 6c 72 65 61 64 79 20 4c 49 4d 49  are already LIMI
61a0: 54 2b 4f 46 46 53 45 54 20 69 74 65 6d 73 20 69  T+OFFSET items i
61b0: 6e 20 74 68 65 20 73 6f 72 74 65 72 2c 20 64 65  n the sorter, de
61c0: 6c 65 74 65 20 74 68 65 20 6c 61 72 67 65 73 74  lete the largest
61d0: 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 62 65  .    ** entry be
61e0: 66 6f 72 65 20 69 6e 73 65 72 74 69 6e 67 20 74  fore inserting t
61f0: 68 65 20 6e 65 77 20 6f 6e 65 2e 20 54 68 69 73  he new one. This
6200: 20 77 61 79 20 74 68 65 72 65 20 61 72 65 20 6e   way there are n
6210: 65 76 65 72 20 6d 6f 72 65 20 0a 20 20 20 20 2a  ever more .    *
6220: 2a 20 74 68 61 6e 20 4c 49 4d 49 54 2b 4f 46 46  * than LIMIT+OFF
6230: 53 45 54 20 69 74 65 6d 73 20 69 6e 20 74 68 65  SET items in the
6240: 20 73 6f 72 74 65 72 2e 0a 20 20 20 20 2a 2a 0a   sorter..    **.
6250: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6e 65      ** If the ne
6260: 77 20 72 65 63 6f 72 64 20 64 6f 65 73 20 6e 6f  w record does no
6270: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e 73  t need to be ins
6280: 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 73  erted into the s
6290: 6f 72 74 65 72 2c 0a 20 20 20 20 2a 2a 20 6a 75  orter,.    ** ju
62a0: 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  mp to the next i
62b0: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
62c0: 6c 6f 6f 70 2e 20 49 66 20 74 68 65 20 70 53 6f  loop. If the pSo
62d0: 72 74 2d 3e 6c 61 62 65 6c 4f 42 4c 6f 70 74 0a  rt->labelOBLopt.
62e0: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 69 73 20      ** value is 
62f0: 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69  not zero, then i
6300: 74 20 69 73 20 61 20 6c 61 62 65 6c 20 6f 66 20  t is a label of 
6310: 77 68 65 72 65 20 74 6f 20 6a 75 6d 70 2e 20 20  where to jump.  
6320: 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 2a  Otherwise,.    *
6330: 2a 20 6a 75 73 74 20 62 79 70 61 73 73 20 74 68  * just bypass th
6340: 65 20 72 6f 77 20 69 6e 73 65 72 74 20 6c 6f 67  e row insert log
6350: 69 63 2e 20 20 53 65 65 20 74 68 65 20 68 65 61  ic.  See the hea
6360: 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74  der comment on t
6370: 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  he.    ** sqlite
6380: 33 57 68 65 72 65 4f 72 64 65 72 42 79 4c 69 6d  3WhereOrderByLim
6390: 69 74 4f 70 74 4c 61 62 65 6c 28 29 20 66 75 6e  itOptLabel() fun
63a0: 63 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69  ction for additi
63b0: 6f 6e 61 6c 20 69 6e 66 6f 2e 0a 20 20 20 20 2a  onal info..    *
63c0: 2f 0a 20 20 20 20 69 6e 74 20 69 43 73 72 20 3d  /.    int iCsr =
63d0: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
63e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
63f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
6400: 4e 6f 74 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c  NotZero, iLimit,
6410: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
6420: 65 6e 74 41 64 64 72 28 76 29 2b 34 29 3b 0a 20  entAddr(v)+4);. 
6430: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
6440: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
6450: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6460: 4c 61 73 74 2c 20 69 43 73 72 2c 20 30 29 3b 0a  Last, iCsr, 0);.
6470: 20 20 20 20 69 53 6b 69 70 20 3d 20 73 71 6c 69      iSkip = sqli
6480: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
6490: 28 76 2c 20 4f 50 5f 49 64 78 4c 45 2c 0a 20 20  (v, OP_IdxLE,.  
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
64c0: 43 73 72 2c 20 30 2c 20 72 65 67 42 61 73 65 2b  Csr, 0, regBase+
64d0: 6e 4f 42 53 61 74 2c 20 6e 45 78 70 72 2d 6e 4f  nOBSat, nExpr-nO
64e0: 42 53 61 74 29 3b 0a 20 20 20 20 56 64 62 65 43  BSat);.    VdbeC
64f0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
6500: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6510: 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  1(v, OP_Delete, 
6520: 69 43 73 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  iCsr);.  }.  if(
6530: 20 72 65 67 52 65 63 6f 72 64 3d 3d 30 20 29 7b   regRecord==0 ){
6540: 0a 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d  .    regRecord =
6550: 20 6d 61 6b 65 53 6f 72 74 65 72 52 65 63 6f 72   makeSorterRecor
6560: 64 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c  d(pParse, pSort,
6570: 20 70 53 65 6c 65 63 74 2c 20 72 65 67 42 61 73   pSelect, regBas
6580: 65 2c 20 6e 42 61 73 65 29 3b 0a 20 20 7d 0a 20  e, nBase);.  }. 
6590: 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74   if( pSort->sort
65a0: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
65b0: 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20  _UseSorter ){.  
65c0: 20 20 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72    op = OP_Sorter
65d0: 49 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b  Insert;.  }else{
65e0: 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78  .    op = OP_Idx
65f0: 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71  Insert;.  }.  sq
6600: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
6610: 6e 74 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d  nt(v, op, pSort-
6620: 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65  >iECursor, regRe
6630: 63 6f 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20  cord,.          
6640: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
6650: 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61  Base+nOBSat, nBa
6660: 73 65 2d 6e 4f 42 53 61 74 29 3b 0a 20 20 69 66  se-nOBSat);.  if
6670: 28 20 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 73  ( iSkip ){.    s
6680: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6690: 50 32 28 76 2c 20 69 53 6b 69 70 2c 0a 20 20 20  P2(v, iSkip,.   
66a0: 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61 62        pSort->lab
66b0: 65 6c 4f 42 4c 6f 70 74 20 3f 20 70 53 6f 72 74  elOBLopt ? pSort
66c0: 2d 3e 6c 61 62 65 6c 4f 42 4c 6f 70 74 20 3a 20  ->labelOBLopt : 
66d0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
66e0: 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 7d 0a  ntAddr(v));.  }.
66f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
6700: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
6710: 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61  he OFFSET.*/.sta
6720: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66  tic void codeOff
6730: 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  set(.  Vdbe *v, 
6740: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
6750: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
6760: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
6770: 69 4f 66 66 73 65 74 2c 20 20 20 20 20 20 2f 2a  iOffset,      /*
6780: 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
6790: 67 20 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75  g the offset cou
67a0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43  nter */.  int iC
67b0: 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a  ontinue     /* J
67c0: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
67d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63   the current rec
67e0: 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ord */.){.  if( 
67f0: 69 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20  iOffset>0 ){.   
6800: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6810: 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p3(v, OP_IfPos, 
6820: 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e  iOffset, iContin
6830: 75 65 2c 20 31 29 3b 20 56 64 62 65 43 6f 76 65  ue, 1); VdbeCove
6840: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62  rage(v);.    Vdb
6850: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46  eComment((v, "OF
6860: 46 53 45 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  FSET"));.  }.}..
6870: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
6880: 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74  hat will check t
6890: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
68a0: 4e 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  N registers star
68b0: 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20  ting at iMem.** 
68c0: 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20  form a distinct 
68d0: 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73 20  entry.  iTab is 
68e0: 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
68f0: 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69  that holds previ
6900: 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f  ously.** seen co
6910: 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68  mbinations of th
6920: 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e  e N values.  A n
6930: 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65  ew entry is made
6940: 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74   in iTab.** if t
6950: 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c  he current N val
6960: 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a  ues are new..**.
6970: 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64  ** A jump to add
6980: 72 52 65 70 65 61 74 20 69 73 20 6d 61 64 65 20  rRepeat is made 
6990: 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75  and the N+1 valu
69a0: 65 73 20 61 72 65 20 70 6f 70 70 65 64 20 66 72  es are popped fr
69b0: 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20  om the.** stack 
69c0: 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65  if the top N ele
69d0: 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69  ments are not di
69e0: 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  stinct..*/.stati
69f0: 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69  c void codeDisti
6a00: 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nct(.  Parse *pP
6a10: 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72  arse,     /* Par
6a20: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
6a30: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
6a40: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
6a50: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f           /* A so
6a60: 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64  rting index used
6a70: 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73   to test for dis
6a80: 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69  tinctness */.  i
6a90: 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c 20 20  nt addrRepeat,  
6aa0: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72    /* Jump to her
6ab0: 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63  e if not distinc
6ac0: 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20  t */.  int N,   
6ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6ae0: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
6af0: 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20  */.  int iMem   
6b00: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
6b10: 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20   element */.){. 
6b20: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
6b30: 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73  r1;..  v = pPars
6b40: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d  e->pVdbe;.  r1 =
6b50: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
6b60: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
6b70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
6b80: 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
6b90: 69 54 61 62 2c 20 61 64 64 72 52 65 70 65 61 74  iTab, addrRepeat
6ba0: 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65  , iMem, N); Vdbe
6bb0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
6bc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6bd0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
6be0: 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b  d, iMem, N, r1);
6bf0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
6c00: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64  dOp4Int(v, OP_Id
6c10: 78 49 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72  xInsert, iTab, r
6c20: 31 2c 20 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73  1, iMem, N);.  s
6c30: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6c40: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45  P5(v, OPFLAG_USE
6c50: 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73  SEEKRESULT);.  s
6c60: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
6c70: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
6c80: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
6c90: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
6ca0: 5f 52 45 46 45 52 45 4e 43 45 53 0a 2f 2a 0a 2a  _REFERENCES./*.*
6cb0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
6cc0: 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72  is called as par
6cd0: 74 20 6f 66 20 69 6e 6e 65 72 2d 6c 6f 6f 70 20  t of inner-loop 
6ce0: 67 65 6e 65 72 61 74 69 6f 6e 20 66 6f 72 20 61  generation for a
6cf0: 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
6d00: 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 4f 52 44  ment with an ORD
6d10: 45 52 20 42 59 20 74 68 61 74 20 69 73 20 6e 6f  ER BY that is no
6d20: 74 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 61  t optimized by a
6d30: 6e 20 69 6e 64 65 78 2e 20 49 74 20 0a 2a 2a 20  n index. It .** 
6d40: 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 65  determines the e
6d50: 78 70 72 65 73 73 69 6f 6e 73 2c 20 69 66 20 61  xpressions, if a
6d60: 6e 79 2c 20 74 68 61 74 20 74 68 65 20 73 6f 72  ny, that the sor
6d70: 74 65 72 2d 72 65 66 65 72 65 6e 63 65 20 0a 2a  ter-reference .*
6d80: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 73  * optimization s
6d90: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f  hould be used fo
6da0: 72 2e 20 54 68 65 20 73 6f 72 74 65 72 2d 72 65  r. The sorter-re
6db0: 66 65 72 65 6e 63 65 20 6f 70 74 69 6d 69 7a 61  ference optimiza
6dc0: 74 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 20  tion.** is used 
6dd0: 66 6f 72 20 53 45 4c 45 43 54 20 71 75 65 72 69  for SELECT queri
6de0: 65 73 20 6c 69 6b 65 3a 0a 2a 2a 0a 2a 2a 20 20  es like:.**.**  
6df0: 20 53 45 4c 45 43 54 20 61 2c 20 62 69 67 62 6c   SELECT a, bigbl
6e00: 6f 62 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52  ob FROM t1 ORDER
6e10: 20 42 59 20 61 20 4c 49 4d 49 54 20 31 30 0a 2a   BY a LIMIT 10.*
6e20: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69  *.** If the opti
6e30: 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64  mization is used
6e40: 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20   for expression 
6e50: 22 62 69 67 62 6c 6f 62 22 2c 20 74 68 65 6e 20  "bigblob", then 
6e60: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 73 74  instead of.** st
6e70: 6f 72 69 6e 67 20 76 61 6c 75 65 73 20 72 65 61  oring values rea
6e80: 64 20 66 72 6f 6d 20 74 68 61 74 20 63 6f 6c 75  d from that colu
6e90: 6d 6e 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72  mn in the sorter
6ea0: 20 72 65 63 6f 72 64 73 2c 20 74 68 65 20 50 4b   records, the PK
6eb0: 20 6f 66 0a 2a 2a 20 74 68 65 20 72 6f 77 20 66   of.** the row f
6ec0: 72 6f 6d 20 74 61 62 6c 65 20 74 31 20 69 73 20  rom table t1 is 
6ed0: 73 74 6f 72 65 64 20 69 6e 73 74 65 61 64 2e 20  stored instead. 
6ee0: 54 68 65 6e 2c 20 61 73 20 72 65 63 6f 72 64 73  Then, as records
6ef0: 20 61 72 65 20 65 78 74 72 61 63 74 65 64 20 66   are extracted f
6f00: 72 6f 6d 0a 2a 2a 20 74 68 65 20 73 6f 72 74 65  rom.** the sorte
6f10: 72 20 74 6f 20 72 65 74 75 72 6e 20 74 6f 20 74  r to return to t
6f20: 68 65 20 75 73 65 72 2c 20 74 68 65 20 72 65 71  he user, the req
6f30: 75 69 72 65 64 20 76 61 6c 75 65 20 6f 66 20 62  uired value of b
6f40: 69 67 62 6c 6f 62 20 69 73 0a 2a 2a 20 72 65 74  igblob is.** ret
6f50: 72 69 65 76 65 64 20 64 69 72 65 63 74 6c 79 20  rieved directly 
6f60: 66 72 6f 6d 20 74 61 62 6c 65 20 74 31 2e 20 49  from table t1. I
6f70: 66 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65  f the values are
6f80: 20 76 65 72 79 20 6c 61 72 67 65 2c 20 74 68 69   very large, thi
6f90: 73 20 0a 2a 2a 20 63 61 6e 20 62 65 20 6d 6f 72  s .** can be mor
6fa0: 65 20 65 66 66 69 63 69 65 6e 74 20 74 68 61 6e  e efficient than
6fb0: 20 73 74 6f 72 69 6e 67 20 74 68 65 6d 20 64 69   storing them di
6fc0: 72 65 63 74 6c 79 20 69 6e 20 74 68 65 20 73 6f  rectly in the so
6fd0: 72 74 65 72 20 72 65 63 6f 72 64 73 2e 0a 2a 2a  rter records..**
6fe0: 0a 2a 2a 20 54 68 65 20 45 78 70 72 4c 69 73 74  .** The ExprList
6ff0: 5f 69 74 65 6d 2e 62 53 6f 72 74 65 72 52 65 66  _item.bSorterRef
7000: 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72   flag is set for
7010: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
7020: 20 69 6e 20 70 45 4c 69 73 74 20 0a 2a 2a 20 66   in pEList .** f
7030: 6f 72 20 77 68 69 63 68 20 74 68 65 20 73 6f 72  or which the sor
7040: 74 65 72 2d 72 65 66 65 72 65 6e 63 65 20 6f 70  ter-reference op
7050: 74 69 6d 69 7a 61 74 69 6f 6e 20 73 68 6f 75 6c  timization shoul
7060: 64 20 62 65 20 65 6e 61 62 6c 65 64 2e 20 0a 2a  d be enabled. .*
7070: 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  * Additionally, 
7080: 74 68 65 20 70 53 6f 72 74 2d 3e 61 44 65 66 65  the pSort->aDefe
7090: 72 5b 5d 20 61 72 72 61 79 20 69 73 20 70 6f 70  r[] array is pop
70a0: 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 74 72  ulated with entr
70b0: 69 65 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 63  ies.** for all c
70c0: 75 72 73 6f 72 73 20 72 65 71 75 69 72 65 64 20  ursors required 
70d0: 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20  to evaluate all 
70e0: 73 65 6c 65 63 74 65 64 20 65 78 70 72 65 73 73  selected express
70f0: 69 6f 6e 73 2e 20 46 69 6e 61 6c 6c 79 2e 0a 2a  ions. Finally..*
7100: 2a 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  * output variabl
7110: 65 20 28 2a 70 70 45 78 74 72 61 29 20 69 73 20  e (*ppExtra) is 
7120: 73 65 74 20 74 6f 20 61 6e 20 65 78 70 72 65 73  set to an expres
7130: 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69  sion list contai
7140: 6e 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69  ning.** expressi
7150: 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 65 78 74 72  ons for all extr
7160: 61 20 50 4b 20 76 61 6c 75 65 73 20 74 68 61 74  a PK values that
7170: 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65   should be store
7180: 64 20 69 6e 20 74 68 65 0a 2a 2a 20 73 6f 72 74  d in the.** sort
7190: 65 72 20 72 65 63 6f 72 64 73 2e 0a 2a 2f 0a 73  er records..*/.s
71a0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
71b0: 74 45 78 70 72 44 65 66 65 72 28 0a 20 20 50 61  tExprDefer(.  Pa
71c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
71e0: 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72   Leave any error
71f0: 20 68 65 72 65 20 2a 2f 0a 20 20 53 6f 72 74 43   here */.  SortC
7200: 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20 20 20  tx *pSort,      
7210: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f             /* So
7220: 72 74 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rter context */.
7230: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
7240: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
7250: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
7260: 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 73 6f   destined for so
7270: 72 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69  rter */.  ExprLi
7280: 73 74 20 2a 2a 70 70 45 78 74 72 61 20 20 20 20  st **ppExtra    
7290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
72a0: 72 65 73 73 69 6f 6e 73 20 74 6f 20 61 70 70 65  ressions to appe
72b0: 6e 64 20 74 6f 20 73 6f 72 74 65 72 20 72 65 63  nd to sorter rec
72c0: 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ord */.){.  int 
72d0: 69 3b 0a 20 20 69 6e 74 20 6e 44 65 66 65 72 20  i;.  int nDefer 
72e0: 3d 20 30 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  = 0;.  ExprList 
72f0: 2a 70 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 66  *pExtra = 0;.  f
7300: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
7310: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
7320: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
7330: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
7340: 20 26 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a   &pEList->a[i];.
7350: 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75      if( pItem->u
7360: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d  .x.iOrderByCol==
7370: 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
7380: 2a 70 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e  *pExpr = pItem->
7390: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 54 61 62  pExpr;.      Tab
73a0: 6c 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72  le *pTab = pExpr
73b0: 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  ->y.pTab;.      
73c0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
73d0: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70  K_COLUMN && pExp
73e0: 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26  r->iColumn>=0 &&
73f0: 20 70 54 61 62 20 26 26 20 21 49 73 56 69 72 74   pTab && !IsVirt
7400: 75 61 6c 28 70 54 61 62 29 0a 20 20 20 20 20 20  ual(pTab).      
7410: 20 26 26 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b   && (pTab->aCol[
7420: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
7430: 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c  colFlags & COLFL
7440: 41 47 5f 53 4f 52 54 45 52 52 45 46 29 0a 20 20  AG_SORTERREF).  
7450: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
7460: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt j;.        fo
7470: 72 28 6a 3d 30 3b 20 6a 3c 6e 44 65 66 65 72 3b  r(j=0; j<nDefer;
7480: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
7490: 20 69 66 28 20 70 53 6f 72 74 2d 3e 61 44 65 66   if( pSort->aDef
74a0: 65 72 5b 6a 5d 2e 69 43 73 72 3d 3d 70 45 78 70  er[j].iCsr==pExp
74b0: 72 2d 3e 69 54 61 62 6c 65 20 29 20 62 72 65 61  r->iTable ) brea
74c0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
74d0: 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 44 65 66       if( j==nDef
74e0: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  er ){.          
74f0: 69 66 28 20 6e 44 65 66 65 72 3d 3d 41 72 72 61  if( nDefer==Arra
7500: 79 53 69 7a 65 28 70 53 6f 72 74 2d 3e 61 44 65  ySize(pSort->aDe
7510: 66 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  fer) ){.        
7520: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
7530: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
7540: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e             int n
7550: 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Key = 1;.       
7560: 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
7570: 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
7580: 50 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  Pk = 0;.        
7590: 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69      if( !HasRowi
75a0: 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  d(pTab) ){.     
75b0: 20 20 20 20 20 20 20 20 20 70 50 6b 20 3d 20 73           pPk = s
75c0: 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
75d0: 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20  Index(pTab);.   
75e0: 20 20 20 20 20 20 20 20 20 20 20 6e 4b 65 79 20             nKey 
75f0: 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a  = pPk->nKeyCol;.
7600: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
7610: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d            for(k=
7620: 30 3b 20 6b 3c 6e 4b 65 79 3b 20 6b 2b 2b 29 7b  0; k<nKey; k++){
7630: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45  .              E
7640: 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  xpr *pNew = sqli
7650: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
7660: 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30   TK_COLUMN, 0, 0
7670: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
7680: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
7690: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
76a0: 77 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70  w->iTable = pExp
76b0: 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  r->iTable;.     
76c0: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d             pNew-
76d0: 3e 79 2e 70 54 61 62 20 3d 20 70 45 78 70 72 2d  >y.pTab = pExpr-
76e0: 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  >y.pTab;.       
76f0: 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69           pNew->i
7700: 43 6f 6c 75 6d 6e 20 3d 20 70 50 6b 20 3f 20 70  Column = pPk ? p
7710: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20  Pk->aiColumn[k] 
7720: 3a 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  : -1;.          
7730: 20 20 20 20 20 20 70 45 78 74 72 61 20 3d 20 73        pExtra = s
7740: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
7750: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 45 78  pend(pParse, pEx
7760: 74 72 61 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  tra, pNew);.    
7770: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7780: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7790: 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 61 44 65        pSort->aDe
77a0: 66 65 72 5b 6e 44 65 66 65 72 5d 2e 70 54 61 62  fer[nDefer].pTab
77b0: 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54 61 62   = pExpr->y.pTab
77c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  ;.            pS
77d0: 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6e 44 65 66  ort->aDefer[nDef
77e0: 65 72 5d 2e 69 43 73 72 20 3d 20 70 45 78 70 72  er].iCsr = pExpr
77f0: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
7800: 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 61 44 65        pSort->aDe
7810: 66 65 72 5b 6e 44 65 66 65 72 5d 2e 6e 4b 65 79  fer[nDefer].nKey
7820: 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20   = nKey;.       
7830: 20 20 20 20 20 6e 44 65 66 65 72 2b 2b 3b 0a 20       nDefer++;. 
7840: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7850: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 49 74     }.        pIt
7860: 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66 20 3d  em->bSorterRef =
7870: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
7880: 7d 0a 20 20 7d 0a 20 20 70 53 6f 72 74 2d 3e 6e  }.  }.  pSort->n
7890: 44 65 66 65 72 20 3d 20 28 75 38 29 6e 44 65 66  Defer = (u8)nDef
78a0: 65 72 3b 0a 20 20 2a 70 70 45 78 74 72 61 20 3d  er;.  *ppExtra =
78b0: 20 70 45 78 74 72 61 3b 0a 7d 0a 23 65 6e 64 69   pExtra;.}.#endi
78c0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
78d0: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
78e0: 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  the code for the
78f0: 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69   inside of the i
7900: 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20  nner loop.** of 
7910: 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20  a SELECT..**.** 
7920: 49 66 20 73 72 63 54 61 62 20 69 73 20 6e 65 67  If srcTab is neg
7930: 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20  ative, then the 
7940: 70 2d 3e 70 45 4c 69 73 74 20 65 78 70 72 65 73  p->pEList expres
7950: 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61  sions.** are eva
7960: 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20  luated in order 
7970: 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20  to get the data 
7980: 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49  for this row.  I
7990: 66 20 73 72 63 54 61 62 20 69 73 0a 2a 2a 20 7a  f srcTab is.** z
79a0: 65 72 6f 20 6f 72 20 6d 6f 72 65 2c 20 74 68 65  ero or more, the
79b0: 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64  n data is pulled
79c0: 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64   from srcTab and
79d0: 20 70 2d 3e 70 45 4c 69 73 74 20 69 73 20 75 73   p->pEList is us
79e0: 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67  ed only .** to g
79f0: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
7a00: 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65   columns and the
7a10: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
7a20: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  nce for each col
7a30: 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  umn..*/.static v
7a40: 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  oid selectInnerL
7a50: 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  oop(.  Parse *pP
7a60: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
7a70: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
7a80: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
7a90: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
7aa0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74    /* The complet
7ab0: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
7ac0: 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  nt being coded *
7ad0: 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20  /.  int srcTab, 
7ae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7af0: 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68  ull data from th
7b00: 69 73 20 74 61 62 6c 65 20 69 66 20 6e 6f 6e 2d  is table if non-
7b10: 6e 65 67 61 74 69 76 65 20 2a 2f 0a 20 20 53 6f  negative */.  So
7b20: 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20  rtCtx *pSort,   
7b30: 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20        /* If not 
7b40: 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f  NULL, info on ho
7b50: 77 20 74 6f 20 70 72 6f 63 65 73 73 20 4f 52 44  w to process ORD
7b60: 45 52 20 42 59 20 2a 2f 0a 20 20 44 69 73 74 69  ER BY */.  Disti
7b70: 6e 63 74 43 74 78 20 2a 70 44 69 73 74 69 6e 63  nctCtx *pDistinc
7b80: 74 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c  t, /* If not NUL
7b90: 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74  L, info on how t
7ba0: 6f 20 70 72 6f 63 65 73 73 20 44 49 53 54 49 4e  o process DISTIN
7bb0: 43 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  CT */.  SelectDe
7bc0: 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20  st *pDest,      
7bd0: 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73  /* How to dispos
7be0: 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73  e of the results
7bf0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69   */.  int iConti
7c00: 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  nue,          /*
7c10: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f   Jump here to co
7c20: 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74  ntinue with next
7c30: 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42   row */.  int iB
7c40: 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20  reak            
7c50: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
7c60: 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
7c70: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f  he inner loop */
7c80: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
7c90: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
7ca0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61   int i;.  int ha
7cb0: 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20  sDistinct;      
7cc0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
7cd0: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
7ce0: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
7cf0: 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20   */.  int eDest 
7d00: 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20  = pDest->eDest; 
7d10: 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70    /* How to disp
7d20: 6f 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a  ose of results *
7d30: 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20  /.  int iParm = 
7d40: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20  pDest->iSDParm; 
7d50: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
7d60: 74 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65  t to disposal me
7d70: 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  thod */.  int nR
7d80: 65 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20  esultCol;       
7d90: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7da0: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
7db0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66  s */.  int nPref
7dc0: 69 78 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  ixReg = 0;      
7dd0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7de0: 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20  extra registers 
7df0: 62 65 66 6f 72 65 20 72 65 67 52 65 73 75 6c 74  before regResult
7e00: 20 2a 2f 0a 20 20 52 6f 77 4c 6f 61 64 49 6e 66   */.  RowLoadInf
7e10: 6f 20 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 3b 20  o sRowLoadInfo; 
7e20: 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 64 65    /* Info for de
7e30: 66 65 72 72 65 64 20 72 6f 77 20 6c 6f 61 64 69  ferred row loadi
7e40: 6e 67 20 2a 2f 0a 0a 20 20 2f 2a 20 55 73 75 61  ng */..  /* Usua
7e50: 6c 6c 79 2c 20 72 65 67 52 65 73 75 6c 74 20 69  lly, regResult i
7e60: 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c  s the first cell
7e70: 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
7e80: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 0a 20 20 2a  memory cells.  *
7e90: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
7ea0: 20 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74 20   current result 
7eb0: 72 6f 77 2e 20 49 6e 20 74 68 69 73 20 63 61 73  row. In this cas
7ec0: 65 20 72 65 67 4f 72 69 67 20 69 73 20 73 65 74  e regOrig is set
7ed0: 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d   to the.  ** sam
7ee0: 65 20 76 61 6c 75 65 2e 20 48 6f 77 65 76 65 72  e value. However
7ef0: 2c 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 73  , if the results
7f00: 20 61 72 65 20 62 65 69 6e 67 20 73 65 6e 74 20   are being sent 
7f10: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2c 20 74  to the sorter, t
7f20: 68 65 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 66  he.  ** values f
7f30: 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  or any expressio
7f40: 6e 73 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f  ns that are also
7f50: 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 6f 72   part of the sor
7f60: 74 2d 6b 65 79 20 61 72 65 20 6f 6d 69 74 74 65  t-key are omitte
7f70: 64 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 69 73  d.  ** from this
7f80: 20 61 72 72 61 79 2e 20 49 6e 20 74 68 69 73 20   array. In this 
7f90: 63 61 73 65 20 72 65 67 4f 72 69 67 20 69 73 20  case regOrig is 
7fa0: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 2a 2f  set to zero.  */
7fb0: 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74  .  int regResult
7fc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
7fd0: 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72  * Start of memor
7fe0: 79 20 68 6f 6c 64 69 6e 67 20 63 75 72 72 65 6e  y holding curren
7ff0: 74 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  t results */.  i
8000: 6e 74 20 72 65 67 4f 72 69 67 3b 20 20 20 20 20  nt regOrig;     
8010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
8020: 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f  art of memory ho
8030: 6c 64 69 6e 67 20 66 75 6c 6c 20 72 65 73 75 6c  lding full resul
8040: 74 20 28 6f 72 20 30 29 20 2a 2f 0a 0a 20 20 61  t (or 0) */..  a
8050: 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 61 73  ssert( v );.  as
8060: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21  sert( p->pEList!
8070: 3d 30 20 29 3b 0a 20 20 68 61 73 44 69 73 74 69  =0 );.  hasDisti
8080: 6e 63 74 20 3d 20 70 44 69 73 74 69 6e 63 74 20  nct = pDistinct 
8090: 3f 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e  ? pDistinct->eTn
80a0: 63 74 54 79 70 65 20 3a 20 57 48 45 52 45 5f 44  ctType : WHERE_D
80b0: 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20  ISTINCT_NOOP;.  
80c0: 69 66 28 20 70 53 6f 72 74 20 26 26 20 70 53 6f  if( pSort && pSo
80d0: 72 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  rt->pOrderBy==0 
80e0: 29 20 70 53 6f 72 74 20 3d 20 30 3b 0a 20 20 69  ) pSort = 0;.  i
80f0: 66 28 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 21  f( pSort==0 && !
8100: 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  hasDistinct ){. 
8110: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6e 74     assert( iCont
8120: 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20 20 20 63  inue!=0 );.    c
8130: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e  odeOffset(v, p->
8140: 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e  iOffset, iContin
8150: 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50  ue);.  }..  /* P
8160: 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65  ull the requeste
8170: 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a  d columns..  */.
8180: 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70    nResultCol = p
8190: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
81a0: 0a 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69  ..  if( pDest->i
81b0: 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Sdst==0 ){.    i
81c0: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
81d0: 20 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20 70    nPrefixReg = p
81e0: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Sort->pOrderBy->
81f0: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  nExpr;.      if(
8200: 20 21 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c   !(pSort->sortFl
8210: 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55  ags & SORTFLAG_U
8220: 73 65 53 6f 72 74 65 72 29 20 29 20 6e 50 72 65  seSorter) ) nPre
8230: 66 69 78 52 65 67 2b 2b 3b 0a 20 20 20 20 20 20  fixReg++;.      
8240: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
8250: 6e 50 72 65 66 69 78 52 65 67 3b 0a 20 20 20 20  nPrefixReg;.    
8260: 7d 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64  }.    pDest->iSd
8270: 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  st = pParse->nMe
8280: 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
8290: 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74  >nMem += nResult
82a0: 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  Col;.  }else if(
82b0: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 6e 52   pDest->iSdst+nR
82c0: 65 73 75 6c 74 43 6f 6c 20 3e 20 70 50 61 72 73  esultCol > pPars
82d0: 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 2f  e->nMem ){.    /
82e0: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 65 72 72  * This is an err
82f0: 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 74 68 61  or condition tha
8300: 74 20 63 61 6e 20 72 65 73 75 6c 74 2c 20 66 6f  t can result, fo
8310: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
8320: 61 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20  a SELECT.    ** 
8330: 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  on the right-han
8340: 64 20 73 69 64 65 20 6f 66 20 61 6e 20 49 4e 53  d side of an INS
8350: 45 52 54 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72  ERT contains mor
8360: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  e result columns
8370: 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65   than.    ** the
8380: 72 65 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20 69  re are columns i
8390: 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74  n the table on t
83a0: 68 65 20 6c 65 66 74 2e 20 20 54 68 65 20 65 72  he left.  The er
83b0: 72 6f 72 20 77 69 6c 6c 20 62 65 20 63 61 75 67  ror will be caug
83c0: 68 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  ht.    ** and re
83d0: 70 6f 72 74 65 64 20 6c 61 74 65 72 2e 20 20 42  ported later.  B
83e0: 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61  ut we need to ma
83f0: 6b 65 20 73 75 72 65 20 65 6e 6f 75 67 68 20 6d  ke sure enough m
8400: 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74  emory is allocat
8410: 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f  ed.    ** to avo
8420: 69 64 20 6f 74 68 65 72 20 73 70 75 72 69 6f 75  id other spuriou
8430: 73 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20  s errors in the 
8440: 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20 20  meantime. */.   
8450: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
8460: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d   nResultCol;.  }
8470: 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20  .  pDest->nSdst 
8480: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
8490: 72 65 67 4f 72 69 67 20 3d 20 72 65 67 52 65 73  regOrig = regRes
84a0: 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 53 64  ult = pDest->iSd
84b0: 73 74 3b 0a 20 20 69 66 28 20 73 72 63 54 61 62  st;.  if( srcTab
84c0: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
84d0: 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c  =0; i<nResultCol
84e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
84f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
8500: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72  v, OP_Column, sr
8510: 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75  cTab, i, regResu
8520: 6c 74 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62  lt+i);.      Vdb
8530: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
8540: 22 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  ", p->pEList->a[
8550: 69 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  i].zName));.    
8560: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44  }.  }else if( eD
8570: 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20  est!=SRT_Exists 
8580: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
8590: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
85a0: 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20 45 78  EFERENCES.    Ex
85b0: 70 72 4c 69 73 74 20 2a 70 45 78 74 72 61 20 3d  prList *pExtra =
85c0: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f   0;.#endif.    /
85d0: 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61  * If the destina
85e0: 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54  tion is an EXIST
85f0: 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f  S(...) expressio
8600: 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20  n, the actual.  
8610: 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75    ** values retu
8620: 72 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45  rned by the SELE
8630: 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69  CT are not requi
8640: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
8650: 75 38 20 65 63 65 6c 46 6c 61 67 73 3b 20 20 20  u8 ecelFlags;   
8660: 20 2f 2a 20 22 65 63 65 6c 22 20 69 73 20 61 6e   /* "ecel" is an
8670: 20 61 62 62 72 65 76 69 61 74 69 6f 6e 20 6f 66   abbreviation of
8680: 20 22 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69   "ExprCodeExprLi
8690: 73 74 22 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c  st" */.    ExprL
86a0: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20  ist *pEList;.   
86b0: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
86c0: 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  Mem || eDest==SR
86d0: 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73  T_Output || eDes
86e0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
86f0: 20 29 7b 0a 20 20 20 20 20 20 65 63 65 6c 46 6c   ){.      ecelFl
8700: 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 45 43 45  ags = SQLITE_ECE
8710: 4c 5f 44 55 50 3b 0a 20 20 20 20 7d 65 6c 73 65  L_DUP;.    }else
8720: 7b 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61 67  {.      ecelFlag
8730: 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  s = 0;.    }.   
8740: 20 69 66 28 20 70 53 6f 72 74 20 26 26 20 68 61   if( pSort && ha
8750: 73 44 69 73 74 69 6e 63 74 3d 3d 30 20 26 26 20  sDistinct==0 && 
8760: 65 44 65 73 74 21 3d 53 52 54 5f 45 70 68 65 6d  eDest!=SRT_Ephem
8770: 54 61 62 20 26 26 20 65 44 65 73 74 21 3d 53 52  Tab && eDest!=SR
8780: 54 5f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  T_Table ){.     
8790: 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70   /* For each exp
87a0: 72 65 73 73 69 6f 6e 20 69 6e 20 70 2d 3e 70 45  ression in p->pE
87b0: 4c 69 73 74 20 74 68 61 74 20 69 73 20 61 20 63  List that is a c
87c0: 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73  opy of an expres
87d0: 73 69 6f 6e 20 69 6e 0a 20 20 20 20 20 20 2a 2a  sion in.      **
87e0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
87f0: 61 75 73 65 20 28 70 53 6f 72 74 2d 3e 70 4f 72  ause (pSort->pOr
8800: 64 65 72 42 79 29 2c 20 73 65 74 20 74 68 65 20  derBy), set the 
8810: 61 73 73 6f 63 69 61 74 65 64 20 0a 20 20 20 20  associated .    
8820: 20 20 2a 2a 20 69 4f 72 64 65 72 42 79 43 6f 6c    ** iOrderByCol
8830: 20 76 61 6c 75 65 20 74 6f 20 6f 6e 65 20 6d 6f   value to one mo
8840: 72 65 20 74 68 61 6e 20 74 68 65 20 69 6e 64 65  re than the inde
8850: 78 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  x of the ORDER B
8860: 59 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72  Y .      ** expr
8870: 65 73 73 69 6f 6e 20 77 69 74 68 69 6e 20 74 68  ession within th
8880: 65 20 73 6f 72 74 2d 6b 65 79 20 74 68 61 74 20  e sort-key that 
8890: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 29  pushOntoSorter()
88a0: 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a   will generate..
88b0: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 61 6c        ** This al
88c0: 6c 6f 77 73 20 74 68 65 20 70 2d 3e 70 45 4c 69  lows the p->pELi
88d0: 73 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20 6f  st field to be o
88e0: 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mitted from the 
88f0: 73 6f 72 74 65 64 20 72 65 63 6f 72 64 2c 0a 20  sorted record,. 
8900: 20 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 73       ** saving s
8910: 70 61 63 65 20 61 6e 64 20 43 50 55 20 63 79 63  pace and CPU cyc
8920: 6c 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 65  les.  */.      e
8930: 63 65 6c 46 6c 61 67 73 20 7c 3d 20 28 53 51 4c  celFlags |= (SQL
8940: 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46  ITE_ECEL_OMITREF
8950: 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46  |SQLITE_ECEL_REF
8960: 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  );..      for(i=
8970: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 69  pSort->nOBSat; i
8980: 3c 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79  <pSort->pOrderBy
8990: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
89a0: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
89b0: 20 20 20 20 20 20 69 66 28 20 28 6a 20 3d 20 70        if( (j = p
89c0: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Sort->pOrderBy->
89d0: 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  a[i].u.x.iOrderB
89e0: 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20  yCol)>0 ){.     
89f0: 20 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e       p->pEList->
8a00: 61 5b 6a 2d 31 5d 2e 75 2e 78 2e 69 4f 72 64 65  a[j-1].u.x.iOrde
8a10: 72 42 79 43 6f 6c 20 3d 20 69 2b 31 2d 70 53 6f  rByCol = i+1-pSo
8a20: 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20  rt->nOBSat;.    
8a30: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69      }.      }.#i
8a40: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
8a50: 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45  LE_SORTER_REFERE
8a60: 4e 43 45 53 0a 20 20 20 20 20 20 73 65 6c 65 63  NCES.      selec
8a70: 74 45 78 70 72 44 65 66 65 72 28 70 50 61 72 73  tExprDefer(pPars
8a80: 65 2c 20 70 53 6f 72 74 2c 20 70 2d 3e 70 45 4c  e, pSort, p->pEL
8a90: 69 73 74 2c 20 26 70 45 78 74 72 61 29 3b 0a 20  ist, &pExtra);. 
8aa0: 20 20 20 20 20 69 66 28 20 70 45 78 74 72 61 20       if( pExtra 
8ab0: 26 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  && pParse->db->m
8ac0: 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
8ad0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
8ae0: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 65 78  there are any ex
8af0: 74 72 61 20 50 4b 20 63 6f 6c 75 6d 6e 73 20 74  tra PK columns t
8b00: 6f 20 61 64 64 20 74 6f 20 74 68 65 20 73 6f 72  o add to the sor
8b10: 74 65 72 20 72 65 63 6f 72 64 73 2c 0a 20 20 20  ter records,.   
8b20: 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
8b30: 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 63 65   extra memory ce
8b40: 6c 6c 73 20 61 6e 64 20 61 64 6a 75 73 74 20 74  lls and adjust t
8b50: 68 65 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  he OpenEphemeral
8b60: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73   .        ** ins
8b70: 74 72 75 63 74 69 6f 6e 20 74 6f 20 61 63 63 6f  truction to acco
8b80: 75 6e 74 20 66 6f 72 20 74 68 65 20 6c 61 72 67  unt for the larg
8b90: 65 72 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73  er records. This
8ba0: 20 69 73 20 6f 6e 6c 79 0a 20 20 20 20 20 20 20   is only.       
8bb0: 20 2a 2a 20 72 65 71 75 69 72 65 64 20 69 66 20   ** required if 
8bc0: 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72  there are one or
8bd0: 20 6d 6f 72 65 20 57 49 54 48 4f 55 54 20 52 4f   more WITHOUT RO
8be0: 57 49 44 20 74 61 62 6c 65 73 20 77 69 74 68 0a  WID tables with.
8bf0: 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 6f          ** compo
8c00: 73 69 74 65 20 70 72 69 6d 61 72 79 20 6b 65 79  site primary key
8c10: 73 20 69 6e 20 74 68 65 20 53 6f 72 74 43 74 78  s in the SortCtx
8c20: 2e 61 44 65 66 65 72 5b 5d 20 61 72 72 61 79 2e  .aDefer[] array.
8c30: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 56 64 62    */.        Vdb
8c40: 65 4f 70 20 2a 70 4f 70 20 3d 20 73 71 6c 69 74  eOp *pOp = sqlit
8c50: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
8c60: 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e  Sort->addrSortIn
8c70: 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  dex);.        pO
8c80: 70 2d 3e 70 32 20 2b 3d 20 28 70 45 78 74 72 61  p->p2 += (pExtra
8c90: 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d  ->nExpr - pSort-
8ca0: 3e 6e 44 65 66 65 72 29 3b 0a 20 20 20 20 20 20  >nDefer);.      
8cb0: 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e    pOp->p4.pKeyIn
8cc0: 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 2b 3d  fo->nAllField +=
8cd0: 20 28 70 45 78 74 72 61 2d 3e 6e 45 78 70 72 20   (pExtra->nExpr 
8ce0: 2d 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 29  - pSort->nDefer)
8cf0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
8d00: 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 45 78 74 72 61  ->nMem += pExtra
8d10: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 7d  ->nExpr;.      }
8d20: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f  .#endif..      /
8d30: 2a 20 41 64 6a 75 73 74 20 6e 52 65 73 75 6c 74  * Adjust nResult
8d40: 43 6f 6c 20 74 6f 20 61 63 63 6f 75 6e 74 20 66  Col to account f
8d50: 6f 72 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  or columns that 
8d60: 61 72 65 20 6f 6d 69 74 74 65 64 0a 20 20 20 20  are omitted.    
8d70: 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 6f    ** from the so
8d80: 72 74 65 72 20 62 79 20 74 68 65 20 6f 70 74 69  rter by the opti
8d90: 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  mizations in thi
8da0: 73 20 62 72 61 6e 63 68 20 2a 2f 0a 20 20 20 20  s branch */.    
8db0: 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
8dc0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 66 6f 72 28  List;.      for(
8dd0: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
8de0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
8df0: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
8e00: 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  a[i].u.x.iOrderB
8e10: 79 43 6f 6c 3e 30 0a 23 69 66 64 65 66 20 53 51  yCol>0.#ifdef SQ
8e20: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
8e30: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
8e40: 20 20 20 20 20 20 20 7c 7c 20 70 45 4c 69 73 74         || pEList
8e50: 2d 3e 61 5b 69 5d 2e 62 53 6f 72 74 65 72 52 65  ->a[i].bSorterRe
8e60: 66 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  f.#endif.       
8e70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 52   ){.          nR
8e80: 65 73 75 6c 74 43 6f 6c 2d 2d 3b 0a 20 20 20 20  esultCol--;.    
8e90: 20 20 20 20 20 20 72 65 67 4f 72 69 67 20 3d 20        regOrig = 
8ea0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
8eb0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 74 65 73 74     }..      test
8ec0: 63 61 73 65 28 20 72 65 67 4f 72 69 67 20 29 3b  case( regOrig );
8ed0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8ee0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 20   eDest==SRT_Set 
8ef0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
8f00: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65  e( eDest==SRT_Me
8f10: 6d 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  m );.      testc
8f20: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
8f30: 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20  Coroutine );.   
8f40: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
8f50: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
8f60: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8f70: 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 20 7c  eDest==SRT_Set |
8f80: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d  | eDest==SRT_Mem
8f90: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
8fa0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
8fb0: 74 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tine || eDest==S
8fc0: 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
8fd0: 20 7d 0a 20 20 20 20 73 52 6f 77 4c 6f 61 64 49   }.    sRowLoadI
8fe0: 6e 66 6f 2e 72 65 67 52 65 73 75 6c 74 20 3d 20  nfo.regResult = 
8ff0: 72 65 67 52 65 73 75 6c 74 3b 0a 20 20 20 20 73  regResult;.    s
9000: 52 6f 77 4c 6f 61 64 49 6e 66 6f 2e 65 63 65 6c  RowLoadInfo.ecel
9010: 46 6c 61 67 73 20 3d 20 65 63 65 6c 46 6c 61 67  Flags = ecelFlag
9020: 73 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  s;.#ifdef SQLITE
9030: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
9040: 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20 73 52  EFERENCES.    sR
9050: 6f 77 4c 6f 61 64 49 6e 66 6f 2e 70 45 78 74 72  owLoadInfo.pExtr
9060: 61 20 3d 20 70 45 78 74 72 61 3b 0a 20 20 20 20  a = pExtra;.    
9070: 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 2e 72 65 67  sRowLoadInfo.reg
9080: 45 78 74 72 61 52 65 73 75 6c 74 20 3d 20 72 65  ExtraResult = re
9090: 67 52 65 73 75 6c 74 20 2b 20 6e 52 65 73 75 6c  gResult + nResul
90a0: 74 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 70 45  tCol;.    if( pE
90b0: 78 74 72 61 20 29 20 6e 52 65 73 75 6c 74 43 6f  xtra ) nResultCo
90c0: 6c 20 2b 3d 20 70 45 78 74 72 61 2d 3e 6e 45 78  l += pExtra->nEx
90d0: 70 72 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  pr;.#endif.    i
90e0: 66 28 20 70 2d 3e 69 4c 69 6d 69 74 0a 20 20 20  f( p->iLimit.   
90f0: 20 20 26 26 20 28 65 63 65 6c 46 6c 61 67 73 20    && (ecelFlags 
9100: 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d  & SQLITE_ECEL_OM
9110: 49 54 52 45 46 29 21 3d 30 20 0a 20 20 20 20 20  ITREF)!=0 .     
9120: 26 26 20 6e 50 72 65 66 69 78 52 65 67 3e 30 0a  && nPrefixReg>0.
9130: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73      ){.      ass
9140: 65 72 74 28 20 70 53 6f 72 74 21 3d 30 20 29 3b  ert( pSort!=0 );
9150: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 68  .      assert( h
9160: 61 73 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b  asDistinct==0 );
9170: 0a 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 70 44  .      pSort->pD
9180: 65 66 65 72 72 65 64 52 6f 77 4c 6f 61 64 20 3d  eferredRowLoad =
9190: 20 26 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 3b 0a   &sRowLoadInfo;.
91a0: 20 20 20 20 20 20 72 65 67 4f 72 69 67 20 3d 20        regOrig = 
91b0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
91c0: 20 20 20 20 69 6e 6e 65 72 4c 6f 6f 70 4c 6f 61      innerLoopLoa
91d0: 64 52 6f 77 28 70 50 61 72 73 65 2c 20 70 2c 20  dRow(pParse, p, 
91e0: 26 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 29 3b 0a  &sRowLoadInfo);.
91f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
9200: 49 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  If the DISTINCT 
9210: 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73  keyword was pres
9220: 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43  ent on the SELEC
9230: 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  T statement.  **
9240: 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61   and this row ha
9250: 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f  s been seen befo
9260: 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  re, then do not 
9270: 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20  make this row.  
9280: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72  ** part of the r
9290: 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  esult..  */.  if
92a0: 28 20 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b  ( hasDistinct ){
92b0: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 44 69  .    switch( pDi
92c0: 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70  stinct->eTnctTyp
92d0: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
92e0: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
92f0: 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20  RDERED: {.      
9300: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20    VdbeOp *pOp;  
9310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
9320: 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 20  longer required 
9330: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
9340: 73 74 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  str. */.        
9350: 69 6e 74 20 69 4a 75 6d 70 3b 20 20 20 20 20 20  int iJump;      
9360: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
9370: 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20  destination */. 
9380: 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 50 72         int regPr
9390: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev;            /
93a0: 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 20 63  * Previous row c
93b0: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20  ontent */..     
93c0: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73     /* Allocate s
93d0: 70 61 63 65 20 66 6f 72 20 74 68 65 20 70 72 65  pace for the pre
93e0: 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20  vious row */.   
93f0: 20 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70       regPrev = p
9400: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
9410: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
9420: 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f  Mem += nResultCo
9430: 6c 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  l;..        /* C
9440: 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65  hange the OP_Ope
9450: 6e 45 70 68 65 6d 65 72 61 6c 20 63 6f 64 65 64  nEphemeral coded
9460: 20 65 61 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f   earlier to an O
9470: 50 5f 4e 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a  P_Null.        *
9480: 2a 20 73 65 74 73 20 74 68 65 20 4d 45 4d 5f 43  * sets the MEM_C
9490: 6c 65 61 72 65 64 20 62 69 74 20 6f 6e 20 74 68  leared bit on th
94a0: 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
94b0: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
94c0: 2a 2a 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75  ** previous valu
94d0: 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61  e.  This will ca
94e0: 75 73 65 20 74 68 65 20 4f 50 5f 4e 65 20 62 65  use the OP_Ne be
94f0: 6c 6f 77 20 74 6f 20 61 6c 77 61 79 73 0a 20 20  low to always.  
9500: 20 20 20 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e        ** fail on
9510: 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61   the first itera
9520: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tion of the loop
9530: 20 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 72   even if the fir
9540: 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f  st.        ** ro
9550: 77 20 69 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a  w is all NULLs..
9560: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
9570: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
9580: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44  angeToNoop(v, pD
9590: 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63  istinct->addrTnc
95a0: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 20  t);.        pOp 
95b0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
95c0: 4f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d  Op(v, pDistinct-
95d0: 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20  >addrTnct);.    
95e0: 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
95f0: 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20  = OP_Null;.     
9600: 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a     pOp->p1 = 1;.
9610: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
9620: 3d 20 72 65 67 50 72 65 76 3b 0a 0a 20 20 20 20  = regPrev;..    
9630: 20 20 20 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69      iJump = sqli
9640: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
9650: 64 72 28 76 29 20 2b 20 6e 52 65 73 75 6c 74 43  dr(v) + nResultC
9660: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ol;.        for(
9670: 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f  i=0; i<nResultCo
9680: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
9690: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
96a0: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
96b0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
96c0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  ->pEList->a[i].p
96d0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
96e0: 20 69 66 28 20 69 3c 6e 52 65 73 75 6c 74 43 6f   if( i<nResultCo
96f0: 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l-1 ){.         
9700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9710: 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72  dOp3(v, OP_Ne, r
9720: 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d  egResult+i, iJum
9730: 70 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20  p, regPrev+i);. 
9740: 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
9750: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
9760: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9770: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9780: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
9790: 5f 45 71 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  _Eq, regResult+i
97a0: 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67  , iContinue, reg
97b0: 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20  Prev+i);.       
97c0: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
97d0: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
97e0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
97f0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
9800: 28 76 2c 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63  (v, -1, (const c
9810: 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
9820: 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
9830: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
9840: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
9850: 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
9860: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
9870: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
9880: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3d 3d  CurrentAddr(v)==
9890: 69 4a 75 6d 70 20 7c 7c 20 70 50 61 72 73 65 2d  iJump || pParse-
98a0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
98b0: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  d );.        sql
98c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
98d0: 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 52 65  , OP_Copy, regRe
98e0: 73 75 6c 74 2c 20 72 65 67 50 72 65 76 2c 20 6e  sult, regPrev, n
98f0: 52 65 73 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20  ResultCol-1);.  
9900: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9910: 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65     }..      case
9920: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
9930: 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20  UNIQUE: {.      
9940: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
9950: 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69  ngeToNoop(v, pDi
9960: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
9970: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
9980: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
9990: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
99a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 69 73      assert( pDis
99b0: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
99c0: 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  ==WHERE_DISTINCT
99d0: 5f 55 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20 20  _UNORDERED );.  
99e0: 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e        codeDistin
99f0: 63 74 28 70 50 61 72 73 65 2c 20 70 44 69 73 74  ct(pParse, pDist
9a00: 69 6e 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69  inct->tabTnct, i
9a10: 43 6f 6e 74 69 6e 75 65 2c 20 6e 52 65 73 75 6c  Continue, nResul
9a20: 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  tCol,.          
9a30: 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65             regRe
9a40: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 62  sult);.        b
9a50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
9a60: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f 72    }.    if( pSor
9a70: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  t==0 ){.      co
9a80: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
9a90: 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75  Offset, iContinu
9aa0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
9ab0: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
9ac0: 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
9ad0: 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63   mode, write eac
9ae0: 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74  h query result t
9af0: 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  o the key of the
9b00: 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a   temporary.    *
9b10: 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  * table iParm.. 
9b20: 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
9b30: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
9b40: 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61  ND_SELECT.    ca
9b50: 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a  se SRT_Union: {.
9b60: 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20        int r1;.  
9b70: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
9b80: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
9b90: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
9ba0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
9bb0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
9bc0: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
9bd0: 43 6f 6c 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  Col, r1);.      
9be0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9bf0: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
9c00: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c  sert, iParm, r1,
9c10: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
9c20: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 73  ultCol);.      s
9c30: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
9c40: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
9c50: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9c60: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e     }..    /* Con
9c70: 73 74 72 75 63 74 20 61 20 72 65 63 6f 72 64 20  struct a record 
9c80: 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72  from the query r
9c90: 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65  esult, but inste
9ca0: 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76  ad of.    ** sav
9cb0: 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c  ing that record,
9cc0: 20 75 73 65 20 69 74 20 61 73 20 61 20 6b 65 79   use it as a key
9cd0: 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65   to delete eleme
9ce0: 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  nts from.    ** 
9cf0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
9d00: 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a  ble iParm..    *
9d10: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  /.    case SRT_E
9d20: 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 73  xcept: {.      s
9d30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
9d40: 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65 74 65  (v, OP_IdxDelete
9d50: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 65 73 75  , iParm, regResu
9d60: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
9d70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9d80: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
9d90: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
9da0: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20  ND_SELECT */..  
9db0: 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72    /* Store the r
9dc0: 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73  esult as data us
9dd0: 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79  ing a unique key
9de0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
9df0: 65 20 53 52 54 5f 46 69 66 6f 3a 0a 20 20 20 20  e SRT_Fifo:.    
9e00: 63 61 73 65 20 53 52 54 5f 44 69 73 74 46 69 66  case SRT_DistFif
9e10: 6f 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  o:.    case SRT_
9e20: 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
9e30: 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
9e40: 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
9e50: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
9e60: 67 65 28 70 50 61 72 73 65 2c 20 6e 50 72 65 66  ge(pParse, nPref
9e70: 69 78 52 65 67 2b 31 29 3b 0a 20 20 20 20 20 20  ixReg+1);.      
9e80: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
9e90: 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20  =SRT_Table );.  
9ea0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
9eb0: 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
9ec0: 62 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  b );.      testc
9ed0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
9ee0: 46 69 66 6f 20 29 3b 0a 20 20 20 20 20 20 74 65  Fifo );.      te
9ef0: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
9f00: 52 54 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a 20  RT_DistFifo );. 
9f10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9f20: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
9f30: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
9f40: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20  lt, nResultCol, 
9f50: 72 31 2b 6e 50 72 65 66 69 78 52 65 67 29 3b 0a  r1+nPrefixReg);.
9f60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9f70: 4d 49 54 5f 43 54 45 0a 20 20 20 20 20 20 69 66  MIT_CTE.      if
9f80: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
9f90: 74 46 69 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  tFifo ){.       
9fa0: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
9fb0: 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74 46 69  nation is DistFi
9fc0: 66 6f 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20  fo, then cursor 
9fd0: 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65  (iParm+1) is ope
9fe0: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20  n.        ** on 
9ff0: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  an ephemeral ind
a000: 65 78 2e 20 49 66 20 74 68 65 20 63 75 72 72 65  ex. If the curre
a010: 6e 74 20 72 6f 77 20 69 73 20 61 6c 72 65 61 64  nt row is alread
a020: 79 20 70 72 65 73 65 6e 74 0a 20 20 20 20 20 20  y present.      
a030: 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65    ** in the inde
a040: 78 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  x, do not write 
a050: 69 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  it to the output
a060: 2e 20 49 66 20 6e 6f 74 2c 20 61 64 64 20 74 68  . If not, add th
a070: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72  e.        ** cur
a080: 72 65 6e 74 20 72 6f 77 20 74 6f 20 74 68 65 20  rent row to the 
a090: 69 6e 64 65 78 20 61 6e 64 20 70 72 6f 63 65 65  index and procee
a0a0: 64 20 77 69 74 68 20 77 72 69 74 69 6e 67 20 69  d with writing i
a0b0: 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  t to the.       
a0c0: 20 2a 2a 20 6f 75 74 70 75 74 20 74 61 62 6c 65   ** output table
a0d0: 20 61 73 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20   as well.  */.  
a0e0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
a0f0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
a100: 65 6e 74 41 64 64 72 28 76 29 20 2b 20 34 3b 0a  entAddr(v) + 4;.
a110: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a120: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
a130: 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b  OP_Found, iParm+
a140: 31 2c 20 61 64 64 72 2c 20 72 31 2c 20 30 29 3b  1, addr, r1, 0);
a150: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
a160: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
a170: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a180: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78  Op4Int(v, OP_Idx
a190: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c  Insert, iParm+1,
a1a0: 20 72 31 2c 72 65 67 52 65 73 75 6c 74 2c 6e 52   r1,regResult,nR
a1b0: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
a1c0: 20 20 20 61 73 73 65 72 74 28 20 70 53 6f 72 74     assert( pSort
a1d0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23  ==0 );.      }.#
a1e0: 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
a1f0: 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  pSort ){.       
a200: 20 61 73 73 65 72 74 28 20 72 65 67 52 65 73 75   assert( regResu
a210: 6c 74 3d 3d 72 65 67 4f 72 69 67 20 29 3b 0a 20  lt==regOrig );. 
a220: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
a230: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53  orter(pParse, pS
a240: 6f 72 74 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66  ort, p, r1+nPref
a250: 69 78 52 65 67 2c 20 72 65 67 4f 72 69 67 2c 20  ixReg, regOrig, 
a260: 31 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a  1, nPrefixReg);.
a270: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a280: 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71       int r2 = sq
a290: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
a2a0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
a2b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a2c0: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
a2d0: 64 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20  d, iParm, r2);. 
a2e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a2f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
a300: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
a310: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73  , r2);.        s
a320: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
a330: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
a340: 45 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71  END);.        sq
a350: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
a360: 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
a370: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
a380: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
a390: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
a3a0: 31 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29  1, nPrefixReg+1)
a3b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a3c0: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
a3d0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
a3e0: 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  RY.    /* If we 
a3f0: 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73  are creating a s
a400: 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20  et for an "expr 
a410: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
a420: 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20   construct,.    
a430: 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68  ** then there sh
a440: 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65  ould be a single
a450: 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61   item on the sta
a460: 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a  ck.  Write this.
a470: 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f      ** item into
a480: 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77   the set table w
a490: 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a  ith bogus data..
a4a0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
a4b0: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
a4c0: 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20   if( pSort ){.  
a4d0: 20 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73        /* At firs
a4e0: 74 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75  t glance you wou
a4f0: 6c 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c  ld think we coul
a500: 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74  d optimize out t
a510: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52  he.        ** OR
a520: 44 45 52 20 42 59 20 69 6e 20 74 68 69 73 20 63  DER BY in this c
a530: 61 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72  ase since the or
a540: 64 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  der of entries i
a550: 6e 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20  n the set.      
a560: 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61    ** does not ma
a570: 74 74 65 72 2e 20 20 42 75 74 20 74 68 65 72 65  tter.  But there
a580: 20 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49   might be a LIMI
a590: 54 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69  T clause, in whi
a5a0: 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  ch.        ** ca
a5b0: 73 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65  se the order doe
a5c0: 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20  s matter */.    
a5d0: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
a5e0: 65 72 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  er(.            
a5f0: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
a600: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67  , regResult, reg
a610: 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  Orig, nResultCol
a620: 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20  , nPrefixReg);. 
a630: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a640: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
a650: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
a660: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
a670: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
a680: 74 72 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a  trlen30(pDest->z
a690: 41 66 66 53 64 73 74 29 3d 3d 6e 52 65 73 75 6c  AffSdst)==nResul
a6a0: 74 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  tCol );.        
a6b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a6c0: 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
a6d0: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
a6e0: 52 65 73 75 6c 74 43 6f 6c 2c 20 0a 20 20 20 20  ResultCol, .    
a6f0: 20 20 20 20 20 20 20 20 72 31 2c 20 70 44 65 73          r1, pDes
a700: 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e 52 65  t->zAffSdst, nRe
a710: 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20  sultCol);.      
a720: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a730: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78  Op4Int(v, OP_Idx
a740: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
a750: 31 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  1, regResult, nR
a760: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
a770: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
a780: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
a790: 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r1);.      }.  
a7a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
a7b0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20  ..    /* If any 
a7c0: 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68 65  row exist in the
a7d0: 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63   result set, rec
a7e0: 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61 6e  ord that fact an
a7f0: 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a  d abort..    */.
a800: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69      case SRT_Exi
a810: 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  sts: {.      sql
a820: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a830: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
a840: 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f   iParm);.      /
a850: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
a860: 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74  se will terminat
a870: 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  e the loop for u
a880: 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
a890: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
a8a0: 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61  If this is a sca
a8b0: 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20  lar select that 
a8c0: 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78  is part of an ex
a8d0: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20  pression, then. 
a8e0: 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20     ** store the 
a8f0: 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61  results in the a
a900: 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72  ppropriate memor
a910: 79 20 63 65 6c 6c 20 6f 72 20 61 72 72 61 79 20  y cell or array 
a920: 6f 66 20 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72  of .    ** memor
a930: 79 20 63 65 6c 6c 73 20 61 6e 64 20 62 72 65 61  y cells and brea
a940: 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 73 63 61  k out of the sca
a950: 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
a960: 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
a970: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f   {.      if( pSo
a980: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  rt ){.        as
a990: 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c  sert( nResultCol
a9a0: 3c 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 29  <=pDest->nSdst )
a9b0: 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  ;.        pushOn
a9c0: 74 6f 53 6f 72 74 65 72 28 0a 20 20 20 20 20 20  toSorter(.      
a9d0: 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 53        pParse, pS
a9e0: 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c  ort, p, regResul
a9f0: 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52 65 73  t, regOrig, nRes
aa00: 75 6c 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52  ultCol, nPrefixR
aa10: 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
aa20: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
aa30: 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 70 44  ( nResultCol==pD
aa40: 65 73 74 2d 3e 6e 53 64 73 74 20 29 3b 0a 20 20  est->nSdst );.  
aa50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65        assert( re
aa60: 67 52 65 73 75 6c 74 3d 3d 69 50 61 72 6d 20 29  gResult==iParm )
aa70: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;.        /* The
aa80: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
aa90: 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74  ll jump out of t
aaa0: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
aab0: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
aac0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
aad0: 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
aae0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
aaf0: 45 52 59 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65  ERY */..    case
ab00: 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20   SRT_Coroutine: 
ab10: 20 20 20 20 20 20 2f 2a 20 53 65 6e 64 20 64 61        /* Send da
ab20: 74 61 20 74 6f 20 61 20 63 6f 2d 72 6f 75 74 69  ta to a co-routi
ab30: 6e 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  ne */.    case S
ab40: 52 54 5f 4f 75 74 70 75 74 3a 20 7b 20 20 20 20  RT_Output: {    
ab50: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
ab60: 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20  e results */.   
ab70: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
ab80: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
ab90: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
aba0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
abb0: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
abc0: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
abd0: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
abe0: 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ter(pParse, pSor
abf0: 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c  t, p, regResult,
ac00: 20 72 65 67 4f 72 69 67 2c 20 6e 52 65 73 75 6c   regOrig, nResul
ac10: 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  tCol,.          
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 50 72               nPr
ac30: 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20  efixReg);.      
ac40: 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d  }else if( eDest=
ac50: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
ac60: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ac70: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
ac80: 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
ac90: 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
aca0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
acb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
acc0: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
acd0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
ace0: 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20  sultCol);.      
acf0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
ad00: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
ad10: 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
ad20: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72    /* Write the r
ad30: 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 20 70 72  esults into a pr
ad40: 69 6f 72 69 74 79 20 71 75 65 75 65 20 74 68 61  iority queue tha
ad50: 74 20 69 73 20 6f 72 64 65 72 20 61 63 63 6f 72  t is order accor
ad60: 64 69 6e 67 20 74 6f 0a 20 20 20 20 2a 2a 20 70  ding to.    ** p
ad70: 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 20 28  Dest->pOrderBy (
ad80: 69 6e 20 70 53 4f 29 2e 20 20 70 44 65 73 74 2d  in pSO).  pDest-
ad90: 3e 69 53 44 50 61 72 6d 20 28 69 6e 20 69 50 61  >iSDParm (in iPa
ada0: 72 6d 29 20 69 73 20 74 68 65 20 63 75 72 73 6f  rm) is the curso
adb0: 72 20 66 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20  r for an.    ** 
adc0: 69 6e 64 65 78 20 77 69 74 68 20 70 53 4f 2d 3e  index with pSO->
add0: 6e 45 78 70 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e  nExpr+2 columns.
ade0: 20 20 42 75 69 6c 64 20 61 20 6b 65 79 20 75 73    Build a key us
adf0: 69 6e 67 20 70 53 4f 20 66 6f 72 20 74 68 65 20  ing pSO for the 
ae00: 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 70 53 4f  first.    ** pSO
ae10: 2d 3e 6e 45 78 70 72 20 63 6f 6c 75 6d 6e 73 2c  ->nExpr columns,
ae20: 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
ae30: 61 6c 6c 20 6b 65 79 73 20 61 72 65 20 75 6e 69  all keys are uni
ae40: 71 75 65 20 62 79 20 61 64 64 69 6e 67 20 61 0a  que by adding a.
ae50: 20 20 20 20 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f      ** final OP_
ae60: 53 65 71 75 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e  Sequence column.
ae70: 20 20 54 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d    The last colum
ae80: 6e 20 69 73 20 74 68 65 20 72 65 63 6f 72 64 20  n is the record 
ae90: 61 73 20 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a  as a blob..    *
aea0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 44  /.    case SRT_D
aeb0: 69 73 74 51 75 65 75 65 3a 0a 20 20 20 20 63 61  istQueue:.    ca
aec0: 73 65 20 53 52 54 5f 51 75 65 75 65 3a 20 7b 0a  se SRT_Queue: {.
aed0: 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a        int nKey;.
aee0: 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32        int r1, r2
aef0: 2c 20 72 33 3b 0a 20 20 20 20 20 20 69 6e 74 20  , r3;.      int 
af00: 61 64 64 72 54 65 73 74 20 3d 20 30 3b 0a 20 20  addrTest = 0;.  
af10: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53      ExprList *pS
af20: 4f 3b 0a 20 20 20 20 20 20 70 53 4f 20 3d 20 70  O;.      pSO = p
af30: 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  Dest->pOrderBy;.
af40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
af50: 4f 20 29 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20  O );.      nKey 
af60: 3d 20 70 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20  = pSO->nExpr;.  
af70: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
af80: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
af90: 65 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  e);.      r2 = s
afa0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
afb0: 67 65 28 70 50 61 72 73 65 2c 20 6e 4b 65 79 2b  ge(pParse, nKey+
afc0: 32 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 72  2);.      r3 = r
afd0: 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20 20 20 20 20  2+nKey+1;.      
afe0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  if( eDest==SRT_D
aff0: 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20  istQueue ){.    
b000: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65      /* If the de
b010: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73  stination is Dis
b020: 74 51 75 65 75 65 2c 20 74 68 65 6e 20 63 75 72  tQueue, then cur
b030: 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73  sor (iParm+1) is
b040: 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
b050: 20 6f 6e 20 61 20 73 65 63 6f 6e 64 20 65 70 68   on a second eph
b060: 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 68 61  emeral index tha
b070: 74 20 68 6f 6c 64 73 20 61 6c 6c 20 76 61 6c 75  t holds all valu
b080: 65 73 20 65 76 65 72 79 20 70 72 65 76 69 6f 75  es every previou
b090: 73 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  sly.        ** a
b0a0: 64 64 65 64 20 74 6f 20 74 68 65 20 71 75 65 75  dded to the queu
b0b0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64  e. */.        ad
b0c0: 64 72 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33  drTest = sqlite3
b0d0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
b0e0: 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d   OP_Found, iParm
b0f0: 2b 31 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  +1, 0, .        
b100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b120: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
b130: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  ltCol);.        
b140: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
b150: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
b160: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
b170: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
b180: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
b190: 65 73 75 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a 20  esultCol, r3);. 
b1a0: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
b1b0: 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b  SRT_DistQueue ){
b1c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b1d0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b1e0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
b1f0: 6d 2b 31 2c 20 72 33 29 3b 0a 20 20 20 20 20 20  m+1, r3);.      
b200: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
b210: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
b220: 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a  USESEEKRESULT);.
b230: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
b240: 72 28 69 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69  r(i=0; i<nKey; i
b250: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
b260: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b270: 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a 20 20 20 20  , OP_SCopy,.    
b280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b290: 20 20 20 20 20 20 72 65 67 52 65 73 75 6c 74 20        regResult 
b2a0: 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78 2e  + pSO->a[i].u.x.
b2b0: 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 2c  iOrderByCol - 1,
b2c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b2d0: 20 20 20 20 20 20 20 20 20 20 20 72 32 2b 69 29             r2+i)
b2e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b2f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b300: 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  2(v, OP_Sequence
b310: 2c 20 69 50 61 72 6d 2c 20 72 32 2b 6e 4b 65 79  , iParm, r2+nKey
b320: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b330: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b340: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 32 2c  _MakeRecord, r2,
b350: 20 6e 4b 65 79 2b 32 2c 20 72 31 29 3b 0a 20 20   nKey+2, r1);.  
b360: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b370: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
b380: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
b390: 20 72 31 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29   r1, r2, nKey+2)
b3a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72  ;.      if( addr
b3b0: 54 65 73 74 20 29 20 73 71 6c 69 74 65 33 56 64  Test ) sqlite3Vd
b3c0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
b3d0: 64 72 54 65 73 74 29 3b 0a 20 20 20 20 20 20 73  drTest);.      s
b3e0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
b3f0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
b400: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
b410: 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
b420: 70 50 61 72 73 65 2c 20 72 32 2c 20 6e 4b 65 79  pParse, r2, nKey
b430: 2b 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  +2);.      break
b440: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
b450: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  * SQLITE_OMIT_CT
b460: 45 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66  E */....#if !def
b470: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b480: 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a  _TRIGGER).    /*
b490: 20 44 69 73 63 61 72 64 20 74 68 65 20 72 65 73   Discard the res
b4a0: 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20 75  ults.  This is u
b4b0: 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73  sed for SELECT s
b4c0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65  tatements inside
b4d0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79  .    ** the body
b4e0: 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20 20   of a TRIGGER.  
b4f0: 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73  The purpose of s
b500: 75 63 68 20 73 65 6c 65 63 74 73 20 69 73 20 74  uch selects is t
b510: 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73  o call.    ** us
b520: 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74  er-defined funct
b530: 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 73  ions that have s
b540: 69 64 65 20 65 66 66 65 63 74 73 2e 20 20 57 65  ide effects.  We
b550: 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20   do not care.   
b560: 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63   ** about the ac
b570: 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20  tual results of 
b580: 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20  the select..    
b590: 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  */.    default: 
b5a0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
b5b0: 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61  eDest==SRT_Disca
b5c0: 72 64 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rd );.      brea
b5d0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
b5e0: 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74    }..  /* Jump t
b5f0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
b600: 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d   loop if the LIM
b610: 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 20 20  IT is reached.  
b620: 45 78 63 65 70 74 2c 20 69 66 0a 20 20 2a 2a 20  Except, if.  ** 
b630: 74 68 65 72 65 20 69 73 20 61 20 73 6f 72 74 65  there is a sorte
b640: 72 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  r, in which case
b650: 20 74 68 65 20 73 6f 72 74 65 72 20 68 61 73 20   the sorter has 
b660: 61 6c 72 65 61 64 79 20 6c 69 6d 69 74 65 64 0a  already limited.
b670: 20 20 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 20    ** the output 
b680: 66 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 69  for us..  */.  i
b690: 66 28 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 70  f( pSort==0 && p
b6a0: 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
b6b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b6c0: 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70  2(v, OP_DecrJump
b6d0: 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Zero, p->iLimit,
b6e0: 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
b6f0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 7d  verage(v);.  }.}
b700: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
b710: 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63   a KeyInfo objec
b720: 74 20 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72  t sufficient for
b730: 20 61 6e 20 69 6e 64 65 78 20 6f 66 20 4e 20 6b   an index of N k
b740: 65 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a  ey columns and.*
b750: 2a 20 58 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e  * X extra column
b760: 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73  s..*/.KeyInfo *s
b770: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
b780: 6f 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  oc(sqlite3 *db, 
b790: 69 6e 74 20 4e 2c 20 69 6e 74 20 58 29 7b 0a 20  int N, int X){. 
b7a0: 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 28 4e   int nExtra = (N
b7b0: 2b 58 29 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c  +X)*(sizeof(Coll
b7c0: 53 65 71 2a 29 2b 31 29 20 2d 20 73 69 7a 65 6f  Seq*)+1) - sizeo
b7d0: 66 28 43 6f 6c 6c 53 65 71 2a 29 3b 0a 20 20 4b  f(CollSeq*);.  K
b7e0: 65 79 49 6e 66 6f 20 2a 70 20 3d 20 73 71 6c 69  eyInfo *p = sqli
b7f0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
b800: 28 64 62 2c 20 73 69 7a 65 6f 66 28 4b 65 79 49  (db, sizeof(KeyI
b810: 6e 66 6f 29 20 2b 20 6e 45 78 74 72 61 29 3b 0a  nfo) + nExtra);.
b820: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70    if( p ){.    p
b830: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
b840: 75 38 2a 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b  u8*)&p->aColl[N+
b850: 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 46  X];.    p->nKeyF
b860: 69 65 6c 64 20 3d 20 28 75 31 36 29 4e 3b 0a 20  ield = (u16)N;. 
b870: 20 20 20 70 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20     p->nAllField 
b880: 3d 20 28 75 31 36 29 28 4e 2b 58 29 3b 0a 20 20  = (u16)(N+X);.  
b890: 20 20 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64    p->enc = ENC(d
b8a0: 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20  b);.    p->db = 
b8b0: 64 62 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20  db;.    p->nRef 
b8c0: 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  = 1;.    memset(
b8d0: 26 70 5b 31 5d 2c 20 30 2c 20 6e 45 78 74 72 61  &p[1], 0, nExtra
b8e0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
b8f0: 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
b900: 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  db);.  }.  retur
b910: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  n p;.}../*.** De
b920: 61 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49 6e  allocate a KeyIn
b930: 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69  fo object.*/.voi
b940: 64 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  d sqlite3KeyInfo
b950: 55 6e 72 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70  Unref(KeyInfo *p
b960: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
b970: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65    assert( p->nRe
b980: 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52  f>0 );.    p->nR
b990: 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d  ef--;.    if( p-
b9a0: 3e 6e 52 65 66 3d 3d 30 20 29 20 73 71 6c 69 74  >nRef==0 ) sqlit
b9b0: 65 33 44 62 46 72 65 65 4e 4e 28 70 2d 3e 64 62  e3DbFreeNN(p->db
b9c0: 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , p);.  }.}../*.
b9d0: 2a 2a 20 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f  ** Make a new po
b9e0: 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e  inter to a KeyIn
b9f0: 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79  fo object.*/.Key
ba00: 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79  Info *sqlite3Key
ba10: 49 6e 66 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20  InfoRef(KeyInfo 
ba20: 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *p){.  if( p ){.
ba30: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
ba40: 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e  Ref>0 );.    p->
ba50: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  nRef++;.  }.  re
ba60: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65  turn p;.}..#ifde
ba70: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
ba80: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
ba90: 20 69 66 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62   if a KeyInfo ob
baa0: 6a 65 63 74 20 63 61 6e 20 62 65 20 63 68 61 6e  ject can be chan
bab0: 67 65 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f  ge.  The KeyInfo
bac0: 20 6f 62 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f   object.** can o
bad0: 6e 6c 79 20 62 65 20 63 68 61 6e 67 65 64 20 69  nly be changed i
bae0: 66 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 61  f this is just a
baf0: 20 73 69 6e 67 6c 65 20 72 65 66 65 72 65 6e 63   single referenc
bb00: 65 20 74 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e  e to the object.
bb10: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
bb20: 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ine is used only
bb30: 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72   inside of asser
bb40: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  t() statements..
bb50: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4b 65  */.int sqlite3Ke
bb60: 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
bb70: 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65  (KeyInfo *p){ re
bb80: 74 75 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b  turn p->nRef==1;
bb90: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
bba0: 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a  ITE_DEBUG */../*
bbb0: 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70  .** Given an exp
bbc0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65  ression list, ge
bbd0: 6e 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f  nerate a KeyInfo
bbe0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
bbf0: 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63  records.** the c
bc00: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
bc10: 65 20 66 6f 72 20 65 61 63 68 20 65 78 70 72 65  e for each expre
bc20: 73 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78  ssion in that ex
bc30: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
bc40: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72  *.** If the Expr
bc50: 4c 69 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52  List is an ORDER
bc60: 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
bc70: 63 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65 20  clause then the 
bc80: 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79  resulting.** Key
bc90: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
bca0: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
bcb0: 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61  r initializing a
bcc0: 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74   virtual index t
bcd0: 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74  o.** implement t
bce0: 68 61 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20  hat clause.  If 
bcf0: 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20  the ExprList is 
bd00: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
bd10: 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68  f a SELECT.** th
bd20: 65 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  en the KeyInfo s
bd30: 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72  tructure is appr
bd40: 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74  opriate for init
bd50: 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75  ializing a virtu
bd60: 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69  al.** index to i
bd70: 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49  mplement a DISTI
bd80: 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20  NCT test..**.** 
bd90: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
bda0: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
bdb0: 75 72 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ure is obtained 
bdc0: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68  from malloc.  Th
bdd0: 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
bde0: 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73  ction is respons
bdf0: 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20  ible for seeing 
be00: 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74  that this struct
be10: 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c  ure is eventuall
be20: 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 4b  y.** freed..*/.K
be30: 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b  eyInfo *sqlite3K
be40: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
be50: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
be60: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
be70: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
be80: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
be90: 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20  st,     /* Form 
bea0: 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  the KeyInfo obje
beb0: 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45 78 70  ct from this Exp
bec0: 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69  rList */.  int i
bed0: 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 20  Start,          
bee0: 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20 74 68  /* Begin with th
bef0: 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69  is column of pLi
bf00: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  st */.  int nExt
bf10: 72 61 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ra           /* 
bf20: 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 65 78  Add this many ex
bf30: 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74  tra columns to t
bf40: 68 65 20 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69  he end */.){.  i
bf50: 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49  nt nExpr;.  KeyI
bf60: 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74  nfo *pInfo;.  st
bf70: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
bf80: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c  em *pItem;.  sql
bf90: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
bfa0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  e->db;.  int i;.
bfb0: 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74  .  nExpr = pList
bfc0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f  ->nExpr;.  pInfo
bfd0: 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
bfe0: 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72  oAlloc(db, nExpr
bff0: 2d 69 53 74 61 72 74 2c 20 6e 45 78 74 72 61 2b  -iStart, nExtra+
c000: 31 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 20  1);.  if( pInfo 
c010: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
c020: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
c030: 72 69 74 65 61 62 6c 65 28 70 49 6e 66 6f 29 20  riteable(pInfo) 
c040: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 69 53 74  );.    for(i=iSt
c050: 61 72 74 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  art, pItem=pList
c060: 2d 3e 61 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45  ->a+iStart; i<nE
c070: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
c080: 2b 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  +){.      pInfo-
c090: 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74 61 72 74 5d  >aColl[i-iStart]
c0a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e   = sqlite3ExprNN
c0b0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
c0c0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
c0d0: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72       pInfo->aSor
c0e0: 74 4f 72 64 65 72 5b 69 2d 69 53 74 61 72 74 5d  tOrder[i-iStart]
c0f0: 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72   = pItem->sortOr
c100: 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  der;.    }.  }. 
c110: 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d   return pInfo;.}
c120: 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20  ../*.** Name of 
c130: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  the connection o
c140: 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f  perator, used fo
c150: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  r error messages
c160: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
c170: 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70  t char *selectOp
c180: 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20  Name(int id){.  
c190: 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63  char *z;.  switc
c1a0: 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73  h( id ){.    cas
c1b0: 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20  e TK_ALL:       
c1c0: 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b  z = "UNION ALL";
c1d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
c1e0: 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a  se TK_INTERSECT:
c1f0: 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22   z = "INTERSECT"
c200: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
c210: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20  ase TK_EXCEPT:  
c220: 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20    z = "EXCEPT"; 
c230: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c240: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
c250: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20     z = "UNION"; 
c260: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
c270: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
c280: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c290: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a  MIT_EXPLAIN./*.*
c2a0: 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50  * Unless an "EXP
c2b0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22  LAIN QUERY PLAN"
c2c0: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e   command is bein
c2d0: 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69  g processed, thi
c2e0: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  s function.** is
c2f0: 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77   a no-op. Otherw
c300: 69 73 65 2c 20 69 74 20 61 64 64 73 20 61 20 73  ise, it adds a s
c310: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74  ingle row of out
c320: 70 75 74 20 74 6f 20 74 68 65 20 45 51 50 20 72  put to the EQP r
c330: 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20  esult,.** where 
c340: 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f  the caption is o
c350: 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
c360: 2a 20 20 20 22 55 53 45 20 54 45 4d 50 20 42 2d  *   "USE TEMP B-
c370: 54 52 45 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a  TREE FOR xxx".**
c380: 0a 2a 2a 20 77 68 65 72 65 20 78 78 78 20 69 73  .** where xxx is
c390: 20 6f 6e 65 20 6f 66 20 22 44 49 53 54 49 4e 43   one of "DISTINC
c3a0: 54 22 2c 20 22 4f 52 44 45 52 20 42 59 22 20 6f  T", "ORDER BY" o
c3b0: 72 20 22 47 52 4f 55 50 20 42 59 22 2e 20 45 78  r "GROUP BY". Ex
c3c0: 61 63 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69  actly which.** i
c3d0: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
c3e0: 74 68 65 20 7a 55 73 61 67 65 20 61 72 67 75 6d  the zUsage argum
c3f0: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
c400: 6f 69 64 20 65 78 70 6c 61 69 6e 54 65 6d 70 54  oid explainTempT
c410: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
c420: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
c430: 7a 55 73 61 67 65 29 7b 0a 20 20 45 78 70 6c 61  zUsage){.  Expla
c440: 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
c450: 72 73 65 2c 20 30 2c 20 22 55 53 45 20 54 45 4d  rse, 0, "USE TEM
c460: 50 20 42 2d 54 52 45 45 20 46 4f 52 20 25 73 22  P B-TREE FOR %s"
c470: 2c 20 7a 55 73 61 67 65 29 29 3b 0a 7d 0a 0a 2f  , zUsage));.}../
c480: 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 65 78 70 72  *.** Assign expr
c490: 65 73 73 69 6f 6e 20 62 20 74 6f 20 6c 76 61 6c  ession b to lval
c4a0: 75 65 20 61 2e 20 41 20 73 65 63 6f 6e 64 2c 20  ue a. A second, 
c4b0: 6e 6f 2d 6f 70 2c 20 76 65 72 73 69 6f 6e 20 6f  no-op, version o
c4c0: 66 20 74 68 69 73 20 6d 61 63 72 6f 0a 2a 2a 20  f this macro.** 
c4d0: 69 73 20 70 72 6f 76 69 64 65 64 20 77 68 65 6e  is provided when
c4e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
c4f0: 4c 41 49 4e 20 69 73 20 64 65 66 69 6e 65 64 2e  LAIN is defined.
c500: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65   This allows the
c510: 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 73 71 6c 69   code.** in sqli
c520: 74 65 33 53 65 6c 65 63 74 28 29 20 74 6f 20 61  te3Select() to a
c530: 73 73 69 67 6e 20 76 61 6c 75 65 73 20 74 6f 20  ssign values to 
c540: 73 74 72 75 63 74 75 72 65 20 6d 65 6d 62 65 72  structure member
c550: 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 0a   variables that.
c560: 2a 2a 20 6f 6e 6c 79 20 65 78 69 73 74 20 69 66  ** only exist if
c570: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
c580: 4c 41 49 4e 20 69 73 20 6e 6f 74 20 64 65 66 69  LAIN is not defi
c590: 6e 65 64 20 77 69 74 68 6f 75 74 20 70 6f 6c 6c  ned without poll
c5a0: 75 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 64  uting the.** cod
c5b0: 65 20 77 69 74 68 20 23 69 66 6e 64 65 66 20 64  e with #ifndef d
c5c0: 69 72 65 63 74 69 76 65 73 2e 0a 2a 2f 0a 23 20  irectives..*/.# 
c5d0: 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65  define explainSe
c5e0: 74 49 6e 74 65 67 65 72 28 61 2c 20 62 29 20 61  tInteger(a, b) a
c5f0: 20 3d 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e   = b..#else./* N
c600: 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66  o-op versions of
c610: 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28   the explainXXX(
c620: 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  ) functions and 
c630: 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66  macros. */.# def
c640: 69 6e 65 20 65 78 70 6c 61 69 6e 54 65 6d 70 54  ine explainTempT
c650: 61 62 6c 65 28 79 2c 7a 29 0a 23 20 64 65 66 69  able(y,z).# defi
c660: 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74  ne explainSetInt
c670: 65 67 65 72 28 79 2c 7a 29 0a 23 65 6e 64 69 66  eger(y,z).#endif
c680: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .../*.** If the 
c690: 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67  inner loop was g
c6a0: 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61  enerated using a
c6b0: 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72   non-null pOrder
c6c0: 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  By argument,.** 
c6d0: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  then the results
c6e0: 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20   were placed in 
c6f0: 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72  a sorter.  After
c700: 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72   the loop is ter
c710: 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65  minated.** we ne
c720: 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f  ed to run the so
c730: 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20  rter and output 
c740: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
c750: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72  e following.** r
c760: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
c770: 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64   the code needed
c780: 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
c790: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
c7a0: 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20  rateSortTail(.  
c7b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
c7c0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
c7d0: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
c7e0: 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *p,        /* T
c7f0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
c800: 65 6e 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78  ent */.  SortCtx
c810: 20 2a 70 53 6f 72 74 2c 20 20 20 2f 2a 20 49 6e   *pSort,   /* In
c820: 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 65  formation on the
c830: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
c840: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d   */.  int nColum
c850: 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  n,      /* Numbe
c860: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  r of columns of 
c870: 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74  data */.  Select
c880: 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57  Dest *pDest /* W
c890: 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20  rite the sorted 
c8a0: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
c8b0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
c8c0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8e0: 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
c8f0: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
c900: 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b 20 3d   int addrBreak =
c910: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e   pSort->labelDon
c920: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
c930: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65 78   Jump here to ex
c940: 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  it loop */.  int
c950: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20   addrContinue = 
c960: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
c970: 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d  abel(v);  /* Jum
c980: 70 20 68 65 72 65 20 66 6f 72 20 6e 65 78 74 20  p here for next 
c990: 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61  cycle */.  int a
c9a0: 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ddr;            
c9b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
c9c0: 70 20 6f 66 20 6f 75 74 70 75 74 20 6c 6f 6f 70  p of output loop
c9d0: 2e 20 4a 75 6d 70 20 66 6f 72 20 4e 65 78 74 2e  . Jump for Next.
c9e0: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e   */.  int addrOn
c9f0: 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54  ce = 0;.  int iT
ca00: 61 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  ab;.  ExprList *
ca10: 70 4f 72 64 65 72 42 79 20 3d 20 70 53 6f 72 74  pOrderBy = pSort
ca20: 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e  ->pOrderBy;.  in
ca30: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
ca40: 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20 69 50  >eDest;.  int iP
ca50: 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44  arm = pDest->iSD
ca60: 50 61 72 6d 3b 0a 20 20 69 6e 74 20 72 65 67 52  Parm;.  int regR
ca70: 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77  ow;.  int regRow
ca80: 69 64 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a  id;.  int iCol;.
ca90: 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20    int nKey;     
caa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cab0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b    /* Number of k
cac0: 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 73 6f  ey columns in so
cad0: 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20  rter record */. 
cae0: 20 69 6e 74 20 69 53 6f 72 74 54 61 62 3b 20 20   int iSortTab;  
caf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb00: 20 2f 2a 20 53 6f 72 74 65 72 20 63 75 72 73 6f   /* Sorter curso
cb10: 72 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  r to read from *
cb20: 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  /.  int i;.  int
cb30: 20 62 53 65 71 3b 20 20 20 20 20 20 20 20 20 20   bSeq;          
cb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cb50: 54 72 75 65 20 69 66 20 73 6f 72 74 65 72 20 72  True if sorter r
cb60: 65 63 6f 72 64 20 69 6e 63 6c 75 64 65 73 20 73  ecord includes s
cb70: 65 71 2e 20 6e 6f 2e 20 2a 2f 0a 20 20 69 6e 74  eq. no. */.  int
cb80: 20 6e 52 65 66 4b 65 79 20 3d 20 30 3b 0a 20 20   nRefKey = 0;.  
cb90: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
cba0: 69 74 65 6d 20 2a 61 4f 75 74 45 78 20 3d 20 70  item *aOutEx = p
cbb0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 0a 20 20  ->pEList->a;..  
cbc0: 61 73 73 65 72 74 28 20 61 64 64 72 42 72 65 61  assert( addrBrea
cbd0: 6b 3c 30 20 29 3b 0a 20 20 69 66 28 20 70 53 6f  k<0 );.  if( pSo
cbe0: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29  rt->labelBkOut )
cbf0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
cc00: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
cc10: 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52  sub, pSort->regR
cc20: 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61  eturn, pSort->la
cc30: 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73  belBkOut);.    s
cc40: 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
cc50: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
cc60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
cc70: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 53 6f  olveLabel(v, pSo
cc80: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b  rt->labelBkOut);
cc90: 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
cca0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45  ITE_ENABLE_SORTE
ccb0: 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 2f  R_REFERENCES.  /
ccc0: 2a 20 4f 70 65 6e 20 61 6e 79 20 63 75 72 73 6f  * Open any curso
ccd0: 72 73 20 6e 65 65 64 65 64 20 66 6f 72 20 73 6f  rs needed for so
cce0: 72 74 65 72 2d 72 65 66 65 72 65 6e 63 65 20 65  rter-reference e
ccf0: 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20  xpressions */.  
cd00: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 6f 72 74  for(i=0; i<pSort
cd10: 2d 3e 6e 44 65 66 65 72 3b 20 69 2b 2b 29 7b 0a  ->nDefer; i++){.
cd20: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
cd30: 3d 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b  = pSort->aDefer[
cd40: 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20 69 6e 74  i].pTab;.    int
cd50: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
cd60: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
cd70: 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
cd80: 63 68 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69  chema);.    sqli
cd90: 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
cda0: 72 73 65 2c 20 70 53 6f 72 74 2d 3e 61 44 65 66  rse, pSort->aDef
cdb0: 65 72 5b 69 5d 2e 69 43 73 72 2c 20 69 44 62 2c  er[i].iCsr, iDb,
cdc0: 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
cdd0: 61 64 29 3b 0a 20 20 20 20 6e 52 65 66 4b 65 79  ad);.    nRefKey
cde0: 20 3d 20 4d 41 58 28 6e 52 65 66 4b 65 79 2c 20   = MAX(nRefKey, 
cdf0: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d  pSort->aDefer[i]
ce00: 2e 6e 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64  .nKey);.  }.#end
ce10: 69 66 0a 0a 20 20 69 54 61 62 20 3d 20 70 53 6f  if..  iTab = pSo
ce20: 72 74 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20  rt->iECursor;.  
ce30: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  if( eDest==SRT_O
ce40: 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d  utput || eDest==
ce50: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 7c 7c  SRT_Coroutine ||
ce60: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20   eDest==SRT_Mem 
ce70: 29 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20  ){.    regRowid 
ce80: 3d 20 30 3b 0a 20 20 20 20 72 65 67 52 6f 77 20  = 0;.    regRow 
ce90: 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a  = pDest->iSdst;.
cea0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67    }else{.    reg
ceb0: 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47  Rowid = sqlite3G
cec0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
ced0: 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20  );.    regRow = 
cee0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
cef0: 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c  nge(pParse, nCol
cf00: 75 6d 6e 29 3b 0a 20 20 7d 0a 20 20 6e 4b 65 79  umn);.  }.  nKey
cf10: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
cf20: 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53  pr - pSort->nOBS
cf30: 61 74 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d  at;.  if( pSort-
cf40: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
cf50: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20  TFLAG_UseSorter 
cf60: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 53 6f  ){.    int regSo
cf70: 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73 65  rtOut = ++pParse
cf80: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 53 6f 72  ->nMem;.    iSor
cf90: 74 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tTab = pParse->n
cfa0: 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  Tab++;.    if( p
cfb0: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
cfc0: 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4f 6e   ){.      addrOn
cfd0: 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ce = sqlite3Vdbe
cfe0: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp0(v, OP_Onc
cff0: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
d000: 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  (v);.    }.    s
d010: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d020: 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
d030: 6f 2c 20 69 53 6f 72 74 54 61 62 2c 20 72 65 67  o, iSortTab, reg
d040: 53 6f 72 74 4f 75 74 2c 20 0a 20 20 20 20 20 20  SortOut, .      
d050: 20 20 6e 4b 65 79 2b 31 2b 6e 43 6f 6c 75 6d 6e    nKey+1+nColumn
d060: 2b 6e 52 65 66 4b 65 79 29 3b 0a 20 20 20 20 69  +nRefKey);.    i
d070: 66 28 20 61 64 64 72 4f 6e 63 65 20 29 20 73 71  f( addrOnce ) sq
d080: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
d090: 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a  e(v, addrOnce);.
d0a0: 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73      addr = 1 + s
d0b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d0c0: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72  (v, OP_SorterSor
d0d0: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65  t, iTab, addrBre
d0e0: 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ak);.    VdbeCov
d0f0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f  erage(v);.    co
d100: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
d110: 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74  Offset, addrCont
d120: 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  inue);.    sqlit
d130: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d140: 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69  OP_SorterData, i
d150: 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c  Tab, regSortOut,
d160: 20 69 53 6f 72 74 54 61 62 29 3b 0a 20 20 20 20   iSortTab);.    
d170: 62 53 65 71 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  bSeq = 0;.  }els
d180: 65 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20  e{.    addr = 1 
d190: 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
d1a0: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20  Op2(v, OP_Sort, 
d1b0: 69 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29  iTab, addrBreak)
d1c0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
d1d0: 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  );.    codeOffse
d1e0: 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
d1f0: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
d200: 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 69      iSortTab = i
d210: 54 61 62 3b 0a 20 20 20 20 62 53 65 71 20 3d 20  Tab;.    bSeq = 
d220: 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  1;.  }.  for(i=0
d230: 2c 20 69 43 6f 6c 3d 6e 4b 65 79 2b 62 53 65 71  , iCol=nKey+bSeq
d240: 2d 31 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69  -1; i<nColumn; i
d250: 2b 2b 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ++){.#ifdef SQLI
d260: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
d270: 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20  _REFERENCES.    
d280: 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 62 53  if( aOutEx[i].bS
d290: 6f 72 74 65 72 52 65 66 20 29 20 63 6f 6e 74 69  orterRef ) conti
d2a0: 6e 75 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  nue;.#endif.    
d2b0: 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e  if( aOutEx[i].u.
d2c0: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30  x.iOrderByCol==0
d2d0: 20 29 20 69 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 23   ) iCol++;.  }.#
d2e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
d2f0: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
d300: 45 4e 43 45 53 0a 20 20 69 66 28 20 70 53 6f 72  ENCES.  if( pSor
d310: 74 2d 3e 6e 44 65 66 65 72 20 29 7b 0a 20 20 20  t->nDefer ){.   
d320: 20 69 6e 74 20 69 4b 65 79 20 3d 20 69 43 6f 6c   int iKey = iCol
d330: 2b 31 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 4b  +1;.    int regK
d340: 65 79 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ey = sqlite3GetT
d350: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
d360: 20 6e 52 65 66 4b 65 79 29 3b 0a 0a 20 20 20 20   nRefKey);..    
d370: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 6f 72 74  for(i=0; i<pSort
d380: 2d 3e 6e 44 65 66 65 72 3b 20 69 2b 2b 29 7b 0a  ->nDefer; i++){.
d390: 20 20 20 20 20 20 69 6e 74 20 69 43 73 72 20 3d        int iCsr =
d3a0: 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69   pSort->aDefer[i
d3b0: 5d 2e 69 43 73 72 3b 0a 20 20 20 20 20 20 54 61  ].iCsr;.      Ta
d3c0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 53 6f 72  ble *pTab = pSor
d3d0: 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 70 54 61  t->aDefer[i].pTa
d3e0: 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65  b;.      int nKe
d3f0: 79 20 3d 20 70 53 6f 72 74 2d 3e 61 44 65 66 65  y = pSort->aDefe
d400: 72 5b 69 5d 2e 6e 4b 65 79 3b 0a 0a 20 20 20 20  r[i].nKey;..    
d410: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d420: 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
d430: 77 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20  w, iCsr);.      
d440: 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
d450: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  b) ){.        sq
d460: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
d470: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53  v, OP_Column, iS
d480: 6f 72 74 54 61 62 2c 20 69 4b 65 79 2b 2b 2c 20  ortTab, iKey++, 
d490: 72 65 67 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  regKey);.       
d4a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d4b0: 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77  p3(v, OP_SeekRow
d4c0: 69 64 2c 20 69 43 73 72 2c 20 0a 20 20 20 20 20  id, iCsr, .     
d4d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d4e0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
d4f0: 2b 31 2c 20 72 65 67 4b 65 79 29 3b 0a 20 20 20  +1, regKey);.   
d500: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d510: 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
d520: 20 69 6e 74 20 69 4a 6d 70 3b 0a 20 20 20 20 20   int iJmp;.     
d530: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
d540: 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
d550: 78 28 70 54 61 62 29 2d 3e 6e 4b 65 79 43 6f 6c  x(pTab)->nKeyCol
d560: 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  ==nKey );.      
d570: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 4b 65    for(k=0; k<nKe
d580: 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; k++){.       
d590: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d5a0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
d5b0: 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 69 4b 65  n, iSortTab, iKe
d5c0: 79 2b 2b 2c 20 72 65 67 4b 65 79 2b 6b 29 3b 0a  y++, regKey+k);.
d5d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d5e0: 20 20 69 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33    iJmp = sqlite3
d5f0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
d600: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
d610: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
d620: 28 76 2c 20 4f 50 5f 53 65 65 6b 47 45 2c 20 69  (v, OP_SeekGE, i
d630: 43 73 72 2c 20 69 4a 6d 70 2b 32 2c 20 72 65 67  Csr, iJmp+2, reg
d640: 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20  Key, nKey);.    
d650: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d660: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
d670: 64 78 4c 45 2c 20 69 43 73 72 2c 20 69 4a 6d 70  dxLE, iCsr, iJmp
d680: 2b 33 2c 20 72 65 67 4b 65 79 2c 20 6e 4b 65 79  +3, regKey, nKey
d690: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d6a0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
d6b0: 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 73 72  OP_NullRow, iCsr
d6c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
d6d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
d6e0: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
d6f0: 72 73 65 2c 20 72 65 67 4b 65 79 2c 20 6e 52 65  rse, regKey, nRe
d700: 66 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  fKey);.  }.#endi
d710: 66 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 6c 75 6d  f.  for(i=nColum
d720: 6e 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  n-1; i>=0; i--){
d730: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d740: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
d750: 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20  ERENCES.    if( 
d760: 61 4f 75 74 45 78 5b 69 5d 2e 62 53 6f 72 74 65  aOutEx[i].bSorte
d770: 72 52 65 66 20 29 7b 0a 20 20 20 20 20 20 73 71  rRef ){.      sq
d780: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
d790: 61 72 73 65 2c 20 61 4f 75 74 45 78 5b 69 5d 2e  arse, aOutEx[i].
d7a0: 70 45 78 70 72 2c 20 72 65 67 52 6f 77 2b 69 29  pExpr, regRow+i)
d7b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
d7c0: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69  if.    {.      i
d7d0: 6e 74 20 69 52 65 61 64 3b 0a 20 20 20 20 20 20  nt iRead;.      
d7e0: 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e  if( aOutEx[i].u.
d7f0: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 29 7b  x.iOrderByCol ){
d800: 0a 20 20 20 20 20 20 20 20 69 52 65 61 64 20 3d  .        iRead =
d810: 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69   aOutEx[i].u.x.i
d820: 4f 72 64 65 72 42 79 43 6f 6c 2d 31 3b 0a 20 20  OrderByCol-1;.  
d830: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d840: 20 20 20 69 52 65 61 64 20 3d 20 69 43 6f 6c 2d     iRead = iCol-
d850: 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
d860: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d870: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
d880: 20 69 53 6f 72 74 54 61 62 2c 20 69 52 65 61 64   iSortTab, iRead
d890: 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20  , regRow+i);.   
d8a0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
d8b0: 76 2c 20 22 25 73 22 2c 20 61 4f 75 74 45 78 5b  v, "%s", aOutEx[
d8c0: 69 5d 2e 7a 4e 61 6d 65 3f 61 4f 75 74 45 78 5b  i].zName?aOutEx[
d8d0: 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45  i].zName : aOutE
d8e0: 78 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20  x[i].zSpan));.  
d8f0: 20 20 7d 0a 20 20 7d 0a 20 20 73 77 69 74 63 68    }.  }.  switch
d900: 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63  ( eDest ){.    c
d910: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
d920: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
d930: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73 71  mTab: {.      sq
d940: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
d950: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
d960: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29  iParm, regRowid)
d970: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d980: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d990: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
d9a0: 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29  egRow, regRowid)
d9b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d9c0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
d9d0: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
d9e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d9f0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
da00: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
da10: 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
da20: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
da30: 20 6e 43 6f 6c 75 6d 6e 3d 3d 73 71 6c 69 74 65   nColumn==sqlite
da40: 33 53 74 72 6c 65 6e 33 30 28 70 44 65 73 74 2d  3Strlen30(pDest-
da50: 3e 7a 41 66 66 53 64 73 74 29 20 29 3b 0a 20 20  >zAffSdst) );.  
da60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
da70: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
da80: 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20  Record, regRow, 
da90: 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 6f 77 69  nColumn, regRowi
daa0: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
dab0: 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
dac0: 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e 43 6f 6c  ->zAffSdst, nCol
dad0: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  umn);.      sqli
dae0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
daf0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
db00: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69  , iParm, regRowi
db10: 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75  d, regRow, nColu
db20: 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  mn);.      break
db30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
db40: 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
db50: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
db60: 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69  lause will termi
db70: 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f  nate the loop fo
db80: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
db90: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
dba0: 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  f.    default: {
dbb0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
dbc0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
dbd0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
dbe0: 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20  oroutine ); .   
dbf0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
dc00: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
dc10: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
dc20: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
dc30: 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20  outine );.      
dc40: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  if( eDest==SRT_O
dc50: 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
dc60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dc70: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
dc80: 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74  ow, pDest->iSdst
dc90: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
dca0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
dcb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dcc0: 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
dcd0: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b  pDest->iSDParm);
dce0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
dcf0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
dd00: 20 20 69 66 28 20 72 65 67 52 6f 77 69 64 20 29    if( regRowid )
dd10: 7b 0a 20 20 20 20 69 66 28 20 65 44 65 73 74 3d  {.    if( eDest=
dd20: 3d 53 52 54 5f 53 65 74 20 29 7b 0a 20 20 20 20  =SRT_Set ){.    
dd30: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
dd40: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
dd50: 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d  , regRow, nColum
dd60: 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
dd70: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
dd80: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
dd90: 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20  e, regRow);.    
dda0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  }.    sqlite3Rel
ddb0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
ddc0: 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  se, regRowid);. 
ddd0: 20 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74   }.  /* The bott
dde0: 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20  om of the loop. 
ddf0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
de00: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
de10: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
de20: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72    if( pSort->sor
de30: 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41  tFlags & SORTFLA
de40: 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20  G_UseSorter ){. 
de50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
de60: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
de70: 72 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  rNext, iTab, add
de80: 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
de90: 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  (v);.  }else{.  
dea0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
deb0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
dec0: 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62  iTab, addr); Vdb
ded0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
dee0: 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 72  }.  if( pSort->r
def0: 65 67 52 65 74 75 72 6e 20 29 20 73 71 6c 69 74  egReturn ) sqlit
df00: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
df10: 4f 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f 72 74  OP_Return, pSort
df20: 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
df30: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
df40: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42  veLabel(v, addrB
df50: 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  reak);.}../*.** 
df60: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
df70: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e   to a string con
df80: 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63  taining the 'dec
df90: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f  laration type' o
dfa0: 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  f the.** express
dfb0: 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73  ion pExpr. The s
dfc0: 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65  tring may be tre
dfd0: 61 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62  ated as static b
dfe0: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  y the caller..**
dff0: 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f 20  .** Also try to 
e000: 65 73 74 69 6d 61 74 65 20 74 68 65 20 73 69 7a  estimate the siz
e010: 65 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  e of the returne
e020: 64 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74 75  d value and retu
e030: 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c  rn that.** resul
e040: 74 20 69 6e 20 2a 70 45 73 74 57 69 64 74 68 2e  t in *pEstWidth.
e050: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61  .**.** The decla
e060: 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74  ration type is t
e070: 68 65 20 65 78 61 63 74 20 64 61 74 61 74 79 70  he exact datatyp
e080: 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74  e definition ext
e090: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a  racted from the.
e0a0: 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41  ** original CREA
e0b0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
e0c0: 6e 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73  nt if the expres
e0d0: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sion is a column
e0e0: 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61  . The.** declara
e0f0: 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20  tion type for a 
e100: 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49  ROWID field is I
e110: 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20  NTEGER. Exactly 
e120: 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  when an expressi
e130: 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65  on.** is conside
e140: 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e  red a column can
e150: 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74   be complex in t
e160: 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73  he presence of s
e170: 75 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a  ubqueries. The.*
e180: 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70  * result-set exp
e190: 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f  ression in all o
e1a0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
e1b0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
e1c0: 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65  s is .** conside
e1d0: 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20  red a column by 
e1e0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
e1f0: 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f  *.**   SELECT co
e200: 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20  l FROM tbl;.**  
e210: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
e220: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a  col FROM tbl;.**
e230: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
e240: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b  T col FROM tbl);
e250: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63  .**   SELECT abc
e260: 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f   FROM (SELECT co
e270: 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62  l AS abc FROM tb
e280: 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64  l);.** .** The d
e290: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
e2a0: 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69  for any expressi
e2b0: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  on other than a 
e2c0: 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a  column is NULL..
e2d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
e2e0: 6e 65 20 68 61 73 20 65 69 74 68 65 72 20 33 20  ne has either 3 
e2f0: 6f 72 20 36 20 70 61 72 61 6d 65 74 65 72 73 20  or 6 parameters 
e300: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
e310: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
e320: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
e330: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
e340: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
e350: 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2f  tion is used..*/
e360: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
e370: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
e380: 41 44 41 54 41 0a 23 20 64 65 66 69 6e 65 20 63  ADATA.# define c
e390: 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c  olumnType(A,B,C,
e3a0: 44 2c 45 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49  D,E) columnTypeI
e3b0: 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c 45 29 0a 23  mpl(A,B,C,D,E).#
e3c0: 65 6c 73 65 20 2f 2a 20 69 66 20 21 64 65 66 69  else /* if !defi
e3d0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
e3e0: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
e3f0: 41 29 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63  A) */.# define c
e400: 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c  olumnType(A,B,C,
e410: 44 2c 45 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49  D,E) columnTypeI
e420: 6d 70 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 0a  mpl(A,B).#endif.
e430: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
e440: 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70  r *columnTypeImp
e450: 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  l(.  NameContext
e460: 20 2a 70 4e 43 2c 20 0a 23 69 66 6e 64 65 66 20   *pNC, .#ifndef 
e470: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
e480: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20  LUMN_METADATA.  
e490: 45 78 70 72 20 2a 70 45 78 70 72 0a 23 65 6c 73  Expr *pExpr.#els
e4a0: 65 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  e.  Expr *pExpr,
e4b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
e4c0: 70 7a 4f 72 69 67 44 62 2c 0a 20 20 63 6f 6e 73  pzOrigDb,.  cons
e4d0: 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 54  t char **pzOrigT
e4e0: 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ab,.  const char
e4f0: 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c 0a 23 65 6e   **pzOrigCol.#en
e500: 64 69 66 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f  dif.){.  char co
e510: 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  nst *zType = 0;.
e520: 20 20 69 6e 74 20 6a 3b 0a 23 69 66 64 65 66 20    int j;.#ifdef 
e530: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
e540: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20  LUMN_METADATA.  
e550: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
e560: 67 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  gDb = 0;.  char 
e570: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62 20  const *zOrigTab 
e580: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
e590: 74 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b  t *zOrigCol = 0;
e5a0: 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
e5b0: 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  t( pExpr!=0 );. 
e5c0: 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53   assert( pNC->pS
e5d0: 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61  rcList!=0 );.  a
e5e0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
e5f0: 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  !=TK_AGG_COLUMN 
e600: 29 3b 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  );  /* This rout
e610: 69 6e 65 20 72 75 6e 65 73 20 62 65 66 6f 72 65  ine runes before
e620: 20 61 67 67 72 65 67 61 74 65 73 0a 20 20 20 20   aggregates.    
e630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e650: 20 20 20 2a 2a 20 61 72 65 20 70 72 6f 63 65 73     ** are proces
e660: 73 65 64 20 2a 2f 0a 20 20 73 77 69 74 63 68 28  sed */.  switch(
e670: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
e680: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
e690: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
e6a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
e6b0: 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20   column. Locate 
e6c0: 74 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f  the table the co
e6d0: 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20  lumn is being.  
e6e0: 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64      ** extracted
e6f0: 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e   from in NameCon
e700: 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54  text.pSrcList. T
e710: 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65  his table may be
e720: 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64   real.      ** d
e730: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
e740: 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20   a subquery..   
e750: 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c     */.      Tabl
e760: 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20  e *pTab = 0;    
e770: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
e780: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d   structure colum
e790: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
e7a0: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c  rom */.      Sel
e7b0: 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20  ect *pS = 0;    
e7c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
e7d0: 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  ct the column is
e7e0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
e7f0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  */.      int iCo
e800: 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  l = pExpr->iColu
e810: 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66  mn;  /* Index of
e820: 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20   column in pTab 
e830: 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  */.      while( 
e840: 70 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a  pNC && !pTab ){.
e850: 20 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20          SrcList 
e860: 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d  *pTabList = pNC-
e870: 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20  >pSrcList;.     
e880: 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61     for(j=0;j<pTa
e890: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70  bList->nSrc && p
e8a0: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
e8b0: 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54  ursor!=pExpr->iT
e8c0: 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20  able;j++);.     
e8d0: 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73     if( j<pTabLis
e8e0: 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20  t->nSrc ){.     
e8f0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
e900: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
e910: 0a 20 20 20 20 20 20 20 20 20 20 70 53 20 3d 20  .          pS = 
e920: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
e930: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
e940: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
e950: 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78   pNC = pNC->pNex
e960: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
e970: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
e980: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
e990: 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d     /* At one tim
e9a0: 65 2c 20 63 6f 64 65 20 73 75 63 68 20 61 73 20  e, code such as 
e9b0: 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77  "SELECT new.x" w
e9c0: 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 20  ithin a trigger 
e9d0: 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  would.        **
e9e0: 20 63 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64   cause this cond
e9f0: 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53  ition to run.  S
ea00: 69 6e 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61  ince then, we ha
ea10: 76 65 20 72 65 73 74 72 75 63 74 75 72 65 64 20  ve restructured 
ea20: 68 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  how.        ** t
ea30: 72 69 67 67 65 72 20 63 6f 64 65 20 69 73 20 67  rigger code is g
ea40: 65 6e 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20  enerated and so 
ea50: 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  this condition i
ea60: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20  s no longer .   
ea70: 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65       ** possible
ea80: 2e 20 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61  . However, it ca
ea90: 6e 20 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20  n still be true 
eaa0: 66 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c  for statements l
eab0: 69 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ike.        ** t
eac0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
ead0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
eae0: 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
eaf0: 4c 45 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45  LE t1(col INTEGE
eb00: 52 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  R);.        **  
eb10: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
eb20: 74 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f  t1.col) FROM FRO
eb30: 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a  M t1;.        **
eb40: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e  .        ** when
eb50: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73   columnType() is
eb60: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65   called on the e
eb70: 78 70 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f  xpression "t1.co
eb80: 6c 22 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20  l" in the .     
eb90: 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74     ** sub-select
eba0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
ebb0: 73 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74  set the column t
ebc0: 79 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65  ype to NULL, eve
ebd0: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f  n.        ** tho
ebe0: 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65  ugh it should re
ebf0: 61 6c 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52  ally be "INTEGER
ec00: 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  "..        **.  
ec10: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
ec20: 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20   not a problem, 
ec30: 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  as the column ty
ec40: 70 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69  pe of "t1.col" i
ec50: 73 20 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20  s never.        
ec60: 2a 2a 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f  ** used. When co
ec70: 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61  lumnType() is ca
ec80: 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72  lled on the expr
ec90: 65 73 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20  ession .        
eca0: 2a 2a 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63  ** "(SELECT t1.c
ecb0: 6f 6c 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63  ol)", the correc
ecc0: 74 20 74 79 70 65 20 69 73 20 72 65 74 75 72 6e  t type is return
ecd0: 65 64 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53  ed (see the TK_S
ece0: 45 4c 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a  ELECT.        **
ecf0: 20 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20   branch below.  
ed00: 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
ed10: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
ed20: 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26   assert( pTab &&
ed30: 20 70 45 78 70 72 2d 3e 79 2e 70 54 61 62 3d 3d   pExpr->y.pTab==
ed40: 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66  pTab );.      if
ed50: 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20  ( pS ){.        
ed60: 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22 20 69  /* The "table" i
ed70: 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62  s actually a sub
ed80: 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65  -select or a vie
ed90: 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  w in the FROM cl
eda0: 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  ause.        ** 
edb0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
edc0: 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20  atement. Return 
edd0: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
ede0: 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a  type and origin.
edf0: 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
ee00: 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73  for the result-s
ee10: 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  et column of the
ee20: 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20   sub-select..   
ee30: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
ee40: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69  if( iCol>=0 && i
ee50: 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e  Col<pS->pEList->
ee60: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
ee70: 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73     /* If iCol is
ee80: 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
ee90: 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
eea0: 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68  sion requests th
eeb0: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72  e.          ** r
eec0: 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d  owid of the sub-
eed0: 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20  select or view. 
eee0: 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  This expression 
eef0: 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20  is legal (see . 
ef00: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74           ** test
ef10: 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29   case misc2.2.2)
ef20: 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76 61   - it always eva
ef30: 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a  luates to NULL..
ef40: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
ef50: 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65         NameConte
ef60: 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20  xt sNC;.        
ef70: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e    Expr *p = pS->
ef80: 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
ef90: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
efa0: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
efb0: 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  pS->pSrc;.      
efc0: 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20      sNC.pNext = 
efd0: 70 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73  pNC;.          s
efe0: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  NC.pParse = pNC-
eff0: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20  >pParse;.       
f000: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
f010: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a  nType(&sNC, p,&z
f020: 4f 72 69 67 44 62 2c 26 7a 4f 72 69 67 54 61 62  OrigDb,&zOrigTab
f030: 2c 26 7a 4f 72 69 67 43 6f 6c 29 3b 20 0a 20 20  ,&zOrigCol); .  
f040: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
f050: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
f060: 41 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20  A real table or 
f070: 61 20 43 54 45 20 74 61 62 6c 65 20 2a 2f 0a 20  a CTE table */. 
f080: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
f090: 70 53 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  pS );.#ifdef SQL
f0a0: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
f0b0: 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20  N_METADATA.     
f0c0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
f0d0: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
f0e0: 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ey;.        asse
f0f0: 72 74 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57  rt( iCol==XN_ROW
f100: 49 44 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26  ID || (iCol>=0 &
f110: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
f120: 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  l) );.        if
f130: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
f140: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49        zType = "I
f150: 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20  NTEGER";.       
f160: 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 22 72     zOrigCol = "r
f170: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d  owid";.        }
f180: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
f190: 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54 61 62 2d  zOrigCol = pTab-
f1a0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
f1b0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e;.          zTy
f1c0: 70 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75  pe = sqlite3Colu
f1d0: 6d 6e 54 79 70 65 28 26 70 54 61 62 2d 3e 61 43  mnType(&pTab->aC
f1e0: 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20  ol[iCol],0);.   
f1f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
f200: 4f 72 69 67 54 61 62 20 3d 20 70 54 61 62 2d 3e  OrigTab = pTab->
f210: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
f220: 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20 26  f( pNC->pParse &
f230: 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  & pTab->pSchema 
f240: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
f250: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
f260: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d  hemaToIndex(pNC-
f270: 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  >pParse->db, pTa
f280: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
f290: 20 20 20 20 20 20 20 7a 4f 72 69 67 44 62 20 3d         zOrigDb =
f2a0: 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62   pNC->pParse->db
f2b0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
f2c0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  ame;.        }.#
f2d0: 65 6c 73 65 0a 20 20 20 20 20 20 20 20 61 73 73  else.        ass
f2e0: 65 72 74 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f  ert( iCol==XN_RO
f2f0: 57 49 44 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  WID || (iCol>=0 
f300: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
f310: 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ol) );.        i
f320: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
f330: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22         zType = "
f340: 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20  INTEGER";.      
f350: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f360: 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74     zType = sqlit
f370: 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54  e3ColumnType(&pT
f380: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30  ab->aCol[iCol],0
f390: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  );.        }.#en
f3a0: 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
f3b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
f3c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f3d0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
f3e0: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
f3f0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
f400: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73  xpression is a s
f410: 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72  ub-select. Retur
f420: 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  n the declaratio
f430: 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20  n type and.     
f440: 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20   ** origin info 
f450: 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63  for the single c
f460: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
f470: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
f480: 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73  ELECT.      ** s
f490: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
f4a0: 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e  */.      NameCon
f4b0: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20  text sNC;.      
f4c0: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78  Select *pS = pEx
f4d0: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20  pr->x.pSelect;. 
f4e0: 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70       Expr *p = p
f4f0: 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  S->pEList->a[0].
f500: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
f510: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
f520: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
f530: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
f540: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
f550: 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20  = pS->pSrc;.    
f560: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e    sNC.pNext = pN
f570: 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61  C;.      sNC.pPa
f580: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
f590: 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  e;.      zType =
f5a0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
f5b0: 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26  , p, &zOrigDb, &
f5c0: 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67  zOrigTab, &zOrig
f5d0: 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20 62 72 65  Col); .      bre
f5e0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
f5f0: 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
f600: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
f610: 4e 5f 4d 45 54 41 44 41 54 41 20 20 0a 20 20 69  N_METADATA  .  i
f620: 66 28 20 70 7a 4f 72 69 67 44 62 20 29 7b 0a 20  f( pzOrigDb ){. 
f630: 20 20 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69     assert( pzOri
f640: 67 54 61 62 20 26 26 20 70 7a 4f 72 69 67 43 6f  gTab && pzOrigCo
f650: 6c 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67  l );.    *pzOrig
f660: 44 62 20 3d 20 7a 4f 72 69 67 44 62 3b 0a 20 20  Db = zOrigDb;.  
f670: 20 20 2a 70 7a 4f 72 69 67 54 61 62 20 3d 20 7a    *pzOrigTab = z
f680: 4f 72 69 67 54 61 62 3b 0a 20 20 20 20 2a 70 7a  OrigTab;.    *pz
f690: 4f 72 69 67 43 6f 6c 20 3d 20 7a 4f 72 69 67 43  OrigCol = zOrigC
f6a0: 6f 6c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ol;.  }.#endif. 
f6b0: 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d   return zType;.}
f6c0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
f6d0: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
f6e0: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
f6f0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
f700: 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  pes of columns.*
f710: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
f720: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  set..*/.static v
f730: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
f740: 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65  mnTypes(.  Parse
f750: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
f760: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
f770: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
f780: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
f790: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
f7a0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
f7b0: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
f7c0: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
f7d0: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
f7e0: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
f7f0: 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20  _OMIT_DECLTYPE. 
f800: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
f810: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
f820: 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  i;.  NameContext
f830: 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63   sNC;.  sNC.pSrc
f840: 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
f850: 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20  .  sNC.pParse = 
f860: 70 50 61 72 73 65 3b 0a 20 20 73 4e 43 2e 70 4e  pParse;.  sNC.pN
f870: 65 78 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  ext = 0;.  for(i
f880: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
f890: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
f8a0: 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d  xpr *p = pEList-
f8b0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
f8c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
f8d0: 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  pe;.#ifdef SQLIT
f8e0: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
f8f0: 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e  METADATA.    con
f900: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62  st char *zOrigDb
f910: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
f920: 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d  char *zOrigTab =
f930: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
f940: 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30  ar *zOrigCol = 0
f950: 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  ;.    zType = co
f960: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
f970: 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72  , &zOrigDb, &zOr
f980: 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c  igTab, &zOrigCol
f990: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76  );..    /* The v
f9a0: 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74  dbe must make it
f9b0: 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68  s own copy of th
f9c0: 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e  e column-type an
f9d0: 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20  d other .    ** 
f9e0: 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20  column specific 
f9f0: 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65  strings, in case
fa00: 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 72   the schema is r
fa10: 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69 73  eset before this
fa20: 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  .    ** virtual 
fa30: 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74  machine is delet
fa40: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
fa50: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
fa60: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
fa70: 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72  ME_DATABASE, zOr
fa80: 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41  igDb, SQLITE_TRA
fa90: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
faa0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
fab0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
fac0: 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62  _TABLE, zOrigTab
fad0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
fae0: 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
faf0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
fb00: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c  , i, COLNAME_COL
fb10: 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53  UMN, zOrigCol, S
fb20: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
fb30: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70  ;.#else.    zTyp
fb40: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
fb50: 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29  sNC, p, 0, 0, 0)
fb60: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
fb70: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
fb80: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
fb90: 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65  _DECLTYPE, zType
fba0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
fbb0: 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  NT);.  }.#endif 
fbc0: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
fbd0: 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45  TE_OMIT_DECLTYPE
fbe0: 29 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  ) */.}.../*.** C
fbf0: 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d  ompute the colum
fc00: 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 53 45  n names for a SE
fc10: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
fc20: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 67  **.** The only g
fc30: 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 53 51  uarantee that SQ
fc40: 4c 69 74 65 20 6d 61 6b 65 73 20 61 62 6f 75 74  Lite makes about
fc50: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 73   column names is
fc60: 20 74 68 61 74 20 69 66 20 74 68 65 0a 2a 2a 20   that if the.** 
fc70: 63 6f 6c 75 6d 6e 20 68 61 73 20 61 6e 20 41 53  column has an AS
fc80: 20 63 6c 61 75 73 65 20 61 73 73 69 67 6e 69 6e   clause assignin
fc90: 67 20 69 74 20 61 20 6e 61 6d 65 2c 20 74 68 61  g it a name, tha
fca0: 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20 6e 61  t will be the na
fcb0: 6d 65 20 75 73 65 64 2e 0a 2a 2a 20 54 68 61 74  me used..** That
fcc0: 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63   is the only doc
fcd0: 75 6d 65 6e 74 65 64 20 67 75 61 72 61 6e 74 65  umented guarante
fce0: 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 63 6f 75  e.  However, cou
fcf0: 6e 74 6c 65 73 73 20 61 70 70 6c 69 63 61 74 69  ntless applicati
fd00: 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c 6f 70 65 64  ons.** developed
fd10: 20 6f 76 65 72 20 74 68 65 20 79 65 61 72 73 20   over the years 
fd20: 68 61 76 65 20 6d 61 64 65 20 62 61 73 65 6c 65  have made basele
fd30: 73 73 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 61  ss assumptions a
fd40: 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  bout column name
fd50: 73 0a 2a 2a 20 61 6e 64 20 77 69 6c 6c 20 62 72  s.** and will br
fd60: 65 61 6b 20 69 66 20 74 68 6f 73 65 20 61 73 73  eak if those ass
fd70: 75 6d 70 74 69 6f 6e 73 20 63 68 61 6e 67 65 73  umptions changes
fd80: 2e 20 20 48 65 6e 63 65 2c 20 75 73 65 20 65 78  .  Hence, use ex
fd90: 74 72 65 6d 65 20 63 61 75 74 69 6f 6e 0a 2a 2a  treme caution.**
fda0: 20 77 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20   when modifying 
fdb0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
fdc0: 61 76 6f 69 64 20 62 72 65 61 6b 69 6e 67 20 6c  avoid breaking l
fdd0: 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  egacy..**.** See
fde0: 20 41 6c 73 6f 3a 20 73 71 6c 69 74 65 33 43 6f   Also: sqlite3Co
fdf0: 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
fe00: 74 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 52  t().**.** The PR
fe10: 41 47 4d 41 20 73 68 6f 72 74 5f 63 6f 6c 75 6d  AGMA short_colum
fe20: 6e 5f 6e 61 6d 65 73 20 61 6e 64 20 50 52 41 47  n_names and PRAG
fe30: 4d 41 20 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e  MA full_column_n
fe40: 61 6d 65 73 20 73 65 74 74 69 6e 67 73 20 61 72  ames settings ar
fe50: 65 0a 2a 2a 20 64 65 70 72 65 63 61 74 65 64 2e  e.** deprecated.
fe60: 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 73 65    The default se
fe70: 74 74 69 6e 67 20 69 73 20 73 68 6f 72 74 3d 4f  tting is short=O
fe80: 4e 2c 20 66 75 6c 6c 3d 4f 46 46 2e 20 20 39 39  N, full=OFF.  99
fe90: 2e 39 25 20 6f 66 20 61 6c 6c 0a 2a 2a 20 61 70  .9% of all.** ap
fea0: 70 6c 69 63 61 74 69 6f 6e 73 20 73 68 6f 75 6c  plications shoul
feb0: 64 20 6f 70 65 72 61 74 65 20 74 68 69 73 20 77  d operate this w
fec0: 61 79 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73  ay.  Nevertheles
fed0: 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 73 75  s, we need to su
fee0: 70 70 6f 72 74 20 74 68 65 0a 2a 2a 20 6f 74 68  pport the.** oth
fef0: 65 72 20 6d 6f 64 65 73 20 66 6f 72 20 6c 65 67  er modes for leg
ff00: 61 63 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 68  acy:.**.**    sh
ff10: 6f 72 74 3d 4f 46 46 2c 20 66 75 6c 6c 3d 4f 46  ort=OFF, full=OF
ff20: 46 3a 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 6e  F:      Column n
ff30: 61 6d 65 20 69 73 20 74 68 65 20 74 65 78 74 20  ame is the text 
ff40: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
ff50: 6e 20 68 61 73 20 69 74 0a 2a 2a 20 20 20 20 20  n has it.**     
ff60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff70: 20 20 20 20 20 20 20 20 20 6f 72 69 67 69 6e 61           origina
ff80: 6c 6c 79 20 61 70 70 65 61 72 73 20 69 6e 20 74  lly appears in t
ff90: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
ffa0: 65 6e 74 2e 20 20 49 6e 0a 2a 2a 20 20 20 20 20  ent.  In.**     
ffb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffc0: 20 20 20 20 20 20 20 20 20 6f 74 68 65 72 20 77           other w
ffd0: 6f 72 64 73 2c 20 74 68 65 20 7a 53 70 61 6e 20  ords, the zSpan 
ffe0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 65 78  of the result ex
fff0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
10000 20 20 20 73 68 6f 72 74 3d 4f 4e 2c 20 66 75 6c     short=ON, ful
10010 6c 3d 4f 46 46 3a 20 20 20 20 20 20 20 28 54 68  l=OFF:       (Th
10020 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
10030 74 20 73 65 74 74 69 6e 67 29 2e 20 20 49 66 20  t setting).  If 
10040 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20  the result.**   
10050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10060 20 20 20 20 20 20 20 20 20 20 20 72 65 66 65 72             refer
10070 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 61 20  s directly to a 
10080 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 74 68  table column, th
10090 65 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  en the.**       
100a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100b0 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 63 6f         result co
100c0 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 6a 75 73  lumn name is jus
100d0 74 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75  t the table colu
100e0 6d 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  mn.**           
100f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10100 20 20 20 6e 61 6d 65 3a 20 43 4f 4c 55 4d 4e 2e     name: COLUMN.
10110 20 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 20    Otherwise use 
10120 7a 53 70 61 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  zSpan..**.**    
10130 66 75 6c 6c 3d 4f 4e 2c 20 73 68 6f 72 74 3d 41  full=ON, short=A
10140 4e 59 3a 20 20 20 20 20 20 20 49 66 20 74 68 65  NY:       If the
10150 20 72 65 73 75 6c 74 20 72 65 66 65 72 73 20 64   result refers d
10160 69 72 65 63 74 6c 79 20 74 6f 20 61 20 74 61 62  irectly to a tab
10170 6c 65 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 20 20  le column,.**   
10180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10190 20 20 20 20 20 20 20 20 20 20 20 74 68 65 6e 20             then 
101a0 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  the result colum
101b0 6e 20 6e 61 6d 65 20 77 69 74 68 20 74 68 65 20  n name with the 
101c0 74 61 62 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20  table name.**   
101d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101e0 20 20 20 20 20 20 20 20 20 20 20 70 72 65 66 69             prefi
101f0 78 2c 20 65 78 3a 20 54 41 42 4c 45 2e 43 4f 4c  x, ex: TABLE.COL
10200 55 4d 4e 2e 20 20 4f 74 68 65 72 77 69 73 65 20  UMN.  Otherwise 
10210 75 73 65 20 7a 53 70 61 6e 2e 0a 2a 2f 0a 73 74  use zSpan..*/.st
10220 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
10230 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20  teColumnNames(. 
10240 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
10250 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
10260 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
10270 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20  ct *pSelect     
10280 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 6c 75  /* Generate colu
10290 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69  mn names for thi
102a0 73 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  s SELECT stateme
102b0 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  nt */.){.  Vdbe 
102c0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
102d0 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 54  be;.  int i;.  T
102e0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 53 72  able *pTab;.  Sr
102f0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
10300 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
10310 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ist;.  sqlite3 *
10320 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
10330 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 3b  .  int fullName;
10340 20 20 20 20 2f 2a 20 54 41 42 4c 45 2e 43 4f 4c      /* TABLE.COL
10350 55 4d 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c 61  UMN if no AS cla
10360 75 73 65 20 61 6e 64 20 69 73 20 61 20 64 69 72  use and is a dir
10370 65 63 74 20 74 61 62 6c 65 20 72 65 66 20 2a 2f  ect table ref */
10380 0a 20 20 69 6e 74 20 73 72 63 4e 61 6d 65 3b 20  .  int srcName; 
10390 20 20 20 20 2f 2a 20 43 4f 4c 55 4d 4e 20 6f 72      /* COLUMN or
103a0 20 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e 20 69 66   TABLE.COLUMN if
103b0 20 6e 6f 20 41 53 20 63 6c 61 75 73 65 20 61 6e   no AS clause an
103c0 64 20 69 73 20 64 69 72 65 63 74 20 2a 2f 0a 0a  d is direct */..
103d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
103e0 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a  MIT_EXPLAIN.  /*
103f0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45   If this is an E
10400 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69  XPLAIN, skip thi
10410 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20  s step */.  if( 
10420 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
10430 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
10440 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
10450 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
10460 73 53 65 74 20 29 20 72 65 74 75 72 6e 3b 0a 20  sSet ) return;. 
10470 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73   /* Column names
10480 20 61 72 65 20 64 65 74 65 72 6d 69 6e 65 64 20   are determined 
10490 62 79 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  by the left-most
104a0 20 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70 6f   term of a compo
104b0 75 6e 64 20 73 65 6c 65 63 74 20 2a 2f 0a 20 20  und select */.  
104c0 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e  while( pSelect->
104d0 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74  pPrior ) pSelect
104e0 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69   = pSelect->pPri
104f0 6f 72 3b 0a 20 20 53 45 4c 45 43 54 54 52 41 43  or;.  SELECTTRAC
10500 45 28 31 2c 70 50 61 72 73 65 2c 70 53 65 6c 65  E(1,pParse,pSele
10510 63 74 2c 28 22 67 65 6e 65 72 61 74 69 6e 67 20  ct,("generating 
10520 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 5c 6e 22 29  column names\n")
10530 29 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  );.  pTabList = 
10540 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20  pSelect->pSrc;. 
10550 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63   pEList = pSelec
10560 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73 73  t->pEList;.  ass
10570 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61  ert( v!=0 );.  a
10580 73 73 65 72 74 28 20 70 54 61 62 4c 69 73 74 21  ssert( pTabList!
10590 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  =0 );.  pParse->
105a0 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b  colNamesSet = 1;
105b0 0a 20 20 66 75 6c 6c 4e 61 6d 65 20 3d 20 28 64  .  fullName = (d
105c0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
105d0 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21  E_FullColNames)!
105e0 3d 30 3b 0a 20 20 73 72 63 4e 61 6d 65 20 3d 20  =0;.  srcName = 
105f0 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
10600 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
10610 73 29 21 3d 30 20 7c 7c 20 66 75 6c 6c 4e 61 6d  s)!=0 || fullNam
10620 65 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  e;.  sqlite3Vdbe
10630 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45  SetNumCols(v, pE
10640 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
10650 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
10660 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
10670 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45      Expr *p = pE
10680 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
10690 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ;..    assert( p
106a0 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
106b0 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  t( p->op!=TK_AGG
106c0 5f 43 4f 4c 55 4d 4e 20 29 3b 20 20 2f 2a 20 41  _COLUMN );  /* A
106d0 67 67 20 70 72 6f 63 65 73 73 69 6e 67 20 68 61  gg processing ha
106e0 73 20 6e 6f 74 20 72 75 6e 20 79 65 74 20 2a 2f  s not run yet */
106f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
10700 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op!=TK_COLUMN ||
10710 20 70 2d 3e 79 2e 70 54 61 62 21 3d 30 20 29 3b   p->y.pTab!=0 );
10720 20 2f 2a 20 43 6f 76 65 72 69 6e 67 20 69 64 78   /* Covering idx
10730 20 6e 6f 74 20 79 65 74 20 63 6f 64 65 64 20 2a   not yet coded *
10740 2f 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  /.    if( pEList
10750 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
10760 20 20 20 20 20 20 2f 2a 20 41 6e 20 41 53 20 63        /* An AS c
10770 6c 61 75 73 65 20 61 6c 77 61 79 73 20 74 61 6b  lause always tak
10780 65 73 20 66 69 72 73 74 20 70 72 69 6f 72 69 74  es first priorit
10790 79 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20  y */.      char 
107a0 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d  *zName = pEList-
107b0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[i].zName;.   
107c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
107d0 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
107e0 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61  OLNAME_NAME, zNa
107f0 6d 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  me, SQLITE_TRANS
10800 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65  IENT);.    }else
10810 20 69 66 28 20 73 72 63 4e 61 6d 65 20 26 26 20   if( srcName && 
10820 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
10830 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
10840 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20  zCol;.      int 
10850 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d  iCol = p->iColum
10860 6e 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  n;.      pTab = 
10870 70 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20 20  p->y.pTab;.     
10880 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
10890 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43   );.      if( iC
108a0 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
108b0 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
108c0 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d   assert( iCol==-
108d0 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  1 || (iCol>=0 &&
108e0 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
108f0 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  ) );.      if( i
10900 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
10910 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b   zCol = "rowid";
10920 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10930 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61        zCol = pTa
10940 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
10950 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
10960 20 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 20     if( fullName 
10970 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
10980 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  *zName = 0;.    
10990 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
109a0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
109b0 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  %s.%s", pTab->zN
109c0 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20  ame, zCol);.    
109d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
109e0 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
109f0 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e  COLNAME_NAME, zN
10a00 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41  ame, SQLITE_DYNA
10a10 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  MIC);.      }els
10a20 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
10a30 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
10a40 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
10a50 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54  AME, zCol, SQLIT
10a60 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
10a70 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
10a80 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
10a90 72 20 2a 7a 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *z = pEList->a
10aa0 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20  [i].zSpan;.     
10ab0 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c 69   z = z==0 ? sqli
10ac0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
10ad0 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 20  column%d", i+1) 
10ae0 3a 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  : sqlite3DbStrDu
10af0 70 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  p(db, z);.      
10b00 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
10b10 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
10b20 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c  AME_NAME, z, SQL
10b30 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ITE_DYNAMIC);.  
10b40 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61    }.  }.  genera
10b50 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50  teColumnTypes(pP
10b60 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
10b70 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pEList);.}../*.*
10b80 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65  * Given an expre
10b90 73 73 69 6f 6e 20 6c 69 73 74 20 28 77 68 69 63  ssion list (whic
10ba0 68 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20  h is really the 
10bb0 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
10bc0 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d  ons.** that form
10bd0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
10be0 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
10bf0 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65 20 61  ement) compute a
10c00 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f  ppropriate.** co
10c10 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61  lumn names for a
10c20 20 74 61 62 6c 65 20 74 68 61 74 20 77 6f 75 6c   table that woul
10c30 64 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65  d hold the expre
10c40 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
10c50 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d  * All column nam
10c60 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75  es will be uniqu
10c70 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  e..**.** Only th
10c80 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
10c90 72 65 20 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f  re computed.  Co
10ca0 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75  lumn.zType, Colu
10cb0 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64  mn.zColl,.** and
10cc0 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66   other fields of
10cd0 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f   Column are zero
10ce0 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
10cf0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
10d00 63 63 65 73 73 2e 20 20 49 66 20 61 20 6d 65 6d  ccess.  If a mem
10d10 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
10d20 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  rror occurs,.** 
10d30 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70  store NULL in *p
10d40 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70  aCol and 0 in *p
10d50 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e 20  nCol and return 
10d60 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2a  SQLITE_NOMEM..**
10d70 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 67 75 61  .** The only gua
10d80 72 61 6e 74 65 65 20 74 68 61 74 20 53 51 4c 69  rantee that SQLi
10d90 74 65 20 6d 61 6b 65 73 20 61 62 6f 75 74 20 63  te makes about c
10da0 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 73 20 74  olumn names is t
10db0 68 61 74 20 69 66 20 74 68 65 0a 2a 2a 20 63 6f  hat if the.** co
10dc0 6c 75 6d 6e 20 68 61 73 20 61 6e 20 41 53 20 63  lumn has an AS c
10dd0 6c 61 75 73 65 20 61 73 73 69 67 6e 69 6e 67 20  lause assigning 
10de0 69 74 20 61 20 6e 61 6d 65 2c 20 74 68 61 74 20  it a name, that 
10df0 77 69 6c 6c 20 62 65 20 74 68 65 20 6e 61 6d 65  will be the name
10e00 20 75 73 65 64 2e 0a 2a 2a 20 54 68 61 74 20 69   used..** That i
10e10 73 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d  s the only docum
10e20 65 6e 74 65 64 20 67 75 61 72 61 6e 74 65 65 2e  ented guarantee.
10e30 20 20 48 6f 77 65 76 65 72 2c 20 63 6f 75 6e 74    However, count
10e40 6c 65 73 73 20 61 70 70 6c 69 63 61 74 69 6f 6e  less application
10e50 73 0a 2a 2a 20 64 65 76 65 6c 6f 70 65 64 20 6f  s.** developed o
10e60 76 65 72 20 74 68 65 20 79 65 61 72 73 20 68 61  ver the years ha
10e70 76 65 20 6d 61 64 65 20 62 61 73 65 6c 65 73 73  ve made baseless
10e80 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 61 62 6f   assumptions abo
10e90 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a  ut column names.
10ea0 2a 2a 20 61 6e 64 20 77 69 6c 6c 20 62 72 65 61  ** and will brea
10eb0 6b 20 69 66 20 74 68 6f 73 65 20 61 73 73 75 6d  k if those assum
10ec0 70 74 69 6f 6e 73 20 63 68 61 6e 67 65 73 2e 20  ptions changes. 
10ed0 20 48 65 6e 63 65 2c 20 75 73 65 20 65 78 74 72   Hence, use extr
10ee0 65 6d 65 20 63 61 75 74 69 6f 6e 0a 2a 2a 20 77  eme caution.** w
10ef0 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  hen modifying th
10f00 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 61 76  is routine to av
10f10 6f 69 64 20 62 72 65 61 6b 69 6e 67 20 6c 65 67  oid breaking leg
10f20 61 63 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 41  acy..**.** See A
10f30 6c 73 6f 3a 20 67 65 6e 65 72 61 74 65 43 6f 6c  lso: generateCol
10f40 75 6d 6e 4e 61 6d 65 73 28 29 0a 2a 2f 0a 69 6e  umnNames().*/.in
10f50 74 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73  t sqlite3Columns
10f60 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20  FromExprList(.  
10f70 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
10f80 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
10f90 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
10fa0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
10fb0 2c 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20  ,       /* Expr 
10fc0 6c 69 73 74 20 66 72 6f 6d 20 77 68 69 63 68 20  list from which 
10fd0 74 6f 20 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e  to derive column
10fe0 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 31 36 20   names */.  i16 
10ff0 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  *pnCol,         
11000 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
11010 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
11020 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c  ns here */.  Col
11030 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20  umn **paCol     
11040 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
11050 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73  e new column lis
11060 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73  t here */.){.  s
11070 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
11080 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61  rse->db;   /* Da
11090 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
110a0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  n */.  int i, j;
110b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110c0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
110d0 65 72 73 20 2a 2f 0a 20 20 75 33 32 20 63 6e 74  ers */.  u32 cnt
110e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
110f0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 61 64       /* Index ad
11100 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  ded to make the 
11110 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20  name unique */. 
11120 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a   Column *aCol, *
11130 70 43 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20  pCol;        /* 
11140 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
11150 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
11160 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  */.  int nCol;  
11170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11180 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
11190 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
111a0 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 63 68 61  ult set */.  cha
111b0 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
111c0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
111d0 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  mn name */.  int
111e0 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
111f0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
11200 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d   of name in zNam
11210 65 5b 5d 20 2a 2f 0a 20 20 48 61 73 68 20 68 74  e[] */.  Hash ht
11220 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11230 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62       /* Hash tab
11240 6c 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d  le of column nam
11250 65 73 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33  es */..  sqlite3
11260 48 61 73 68 49 6e 69 74 28 26 68 74 29 3b 0a 20  HashInit(&ht);. 
11270 20 69 66 28 20 70 45 4c 69 73 74 20 29 7b 0a 20   if( pEList ){. 
11280 20 20 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74     nCol = pEList
11290 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 43 6f  ->nExpr;.    aCo
112a0 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  l = sqlite3DbMal
112b0 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
112c0 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c  of(aCol[0])*nCol
112d0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
112e0 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20   aCol==0 );.    
112f0 69 66 28 20 6e 43 6f 6c 3e 33 32 37 36 37 20 29  if( nCol>32767 )
11300 20 6e 43 6f 6c 20 3d 20 33 32 37 36 37 3b 0a 20   nCol = 32767;. 
11310 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c   }else{.    nCol
11320 20 3d 20 30 3b 0a 20 20 20 20 61 43 6f 6c 20 3d   = 0;.    aCol =
11330 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
11340 28 20 6e 43 6f 6c 3d 3d 28 69 31 36 29 6e 43 6f  ( nCol==(i16)nCo
11350 6c 20 29 3b 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20  l );.  *pnCol = 
11360 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d  nCol;.  *paCol =
11370 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d   aCol;..  for(i=
11380 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c  0, pCol=aCol; i<
11390 6e 43 6f 6c 20 26 26 20 21 64 62 2d 3e 6d 61 6c  nCol && !db->mal
113a0 6c 6f 63 46 61 69 6c 65 64 3b 20 69 2b 2b 2c 20  locFailed; i++, 
113b0 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20  pCol++){.    /* 
113c0 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61  Get an appropria
113d0 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  te name for the 
113e0 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20  column.    */.  
113f0 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70    if( (zName = p
11400 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
11410 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  e)!=0 ){.      /
11420 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
11430 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20  contains an "AS 
11440 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20  <name>" phrase, 
11450 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68  use <name> as th
11460 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 7d 65  e name */.    }e
11470 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
11480 2a 70 43 6f 6c 45 78 70 72 20 3d 20 73 71 6c 69  *pColExpr = sqli
11490 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
114a0 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  te(pEList->a[i].
114b0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 77 68  pExpr);.      wh
114c0 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f  ile( pColExpr->o
114d0 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20  p==TK_DOT ){.   
114e0 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20 3d 20       pColExpr = 
114f0 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68 74  pColExpr->pRight
11500 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
11510 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b  ( pColExpr!=0 );
11520 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
11530 73 73 65 72 74 28 20 70 43 6f 6c 45 78 70 72 2d  ssert( pColExpr-
11540 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op!=TK_AGG_COLU
11550 4d 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  MN );.      if( 
11560 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
11570 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
11580 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e     /* For column
11590 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  s use the column
115a0 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   name name */.  
115b0 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
115c0 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75   pColExpr->iColu
115d0 6d 6e 3b 0a 20 20 20 20 20 20 20 20 54 61 62 6c  mn;.        Tabl
115e0 65 20 2a 70 54 61 62 20 3d 20 70 43 6f 6c 45 78  e *pTab = pColEx
115f0 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20  pr->y.pTab;.    
11600 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
11610 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !=0 );.        i
11620 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
11630 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
11640 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
11650 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e  iCol>=0 ? pTab->
11660 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
11670 20 3a 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20   : "rowid";.    
11680 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c    }else if( pCol
11690 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
116a0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
116b0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
116c0 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50  rty(pColExpr, EP
116d0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
116e0 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 43        zName = pC
116f0 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  olExpr->u.zToken
11700 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11710 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68         /* Use th
11720 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20  e original text 
11730 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78  of the column ex
11740 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20  pression as its 
11750 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
11760 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
11770 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[i].zSpan;.    
11780 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
11790 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ( zName ){.     
117a0 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
117b0 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61  DbStrDup(db, zNa
117c0 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
117d0 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
117e0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
117f0 22 63 6f 6c 75 6d 6e 25 64 22 2c 69 2b 31 29 3b  "column%d",i+1);
11800 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
11810 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c  ake sure the col
11820 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71  umn name is uniq
11830 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65  ue.  If the name
11840 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a   is not unique,.
11850 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 6e      ** append an
11860 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20   integer to the 
11870 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20  name so that it 
11880 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a  becomes unique..
11890 20 20 20 20 2a 2f 0a 20 20 20 20 63 6e 74 20 3d      */.    cnt =
118a0 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a   0;.    while( z
118b0 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 48  Name && sqlite3H
118c0 61 73 68 46 69 6e 64 28 26 68 74 2c 20 7a 4e 61  ashFind(&ht, zNa
118d0 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
118e0 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
118f0 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
11900 20 20 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3e        if( nName>
11910 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  0 ){.        for
11920 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20 6a 3e 30 20  (j=nName-1; j>0 
11930 26 26 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  && sqlite3Isdigi
11940 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d  t(zName[j]); j--
11950 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ){}.        if( 
11960 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a 27 20 29 20  zName[j]==':' ) 
11970 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20 20 20 20 20  nName = j;.     
11980 20 7d 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d   }.      zName =
11990 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
119a0 64 62 2c 20 22 25 2e 2a 7a 3a 25 75 22 2c 20 6e  db, "%.*z:%u", n
119b0 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63  Name, zName, ++c
119c0 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  nt);.      if( c
119d0 6e 74 3e 33 20 29 20 73 71 6c 69 74 65 33 5f 72  nt>3 ) sqlite3_r
119e0 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
119f0 28 63 6e 74 29 2c 20 26 63 6e 74 29 3b 0a 20 20  (cnt), &cnt);.  
11a00 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e    }.    pCol->zN
11a10 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
11a20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72   sqlite3ColumnPr
11a30 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65  opertiesFromName
11a40 28 30 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 69  (0, pCol);.    i
11a50 66 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69  f( zName && sqli
11a60 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 68  te3HashInsert(&h
11a70 74 2c 20 7a 4e 61 6d 65 2c 20 70 43 6f 6c 29 3d  t, zName, pCol)=
11a80 3d 70 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73  =pCol ){.      s
11a90 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
11aa0 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
11ab0 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
11ac0 28 26 68 74 29 3b 0a 20 20 69 66 28 20 64 62 2d  (&ht);.  if( db-
11ad0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
11ae0 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
11af0 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  i; j++){.      s
11b00 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
11b10 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b   aCol[j].zName);
11b20 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
11b30 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f  e3DbFree(db, aCo
11b40 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d  l);.    *paCol =
11b50 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d   0;.    *pnCol =
11b60 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
11b70 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
11b80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
11b90 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11ba0 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64 20  ** Add type and 
11bb0 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
11bc0 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d  ation to a colum
11bd0 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a  n list based on.
11be0 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ** a SELECT stat
11bf0 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  ement..** .** Th
11c00 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72  e column list pr
11c10 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72  esumably came fr
11c20 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e  om selectColumnN
11c30 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  amesFromExprList
11c40 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ()..** The colum
11c50 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20  n list has only 
11c60 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73  names, not types
11c70 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20   or collations. 
11c80 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
11c90 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e   goes through an
11ca0 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65 73  d adds the types
11cb0 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e   and collations.
11cc0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
11cd0 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68 61  ine requires tha
11ce0 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72  t all identifier
11cf0 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a  s in the SELECT.
11d00 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20  ** statement be 
11d10 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 76 6f 69  resolved..*/.voi
11d20 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41  d sqlite3SelectA
11d30 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
11d40 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73  ollation(.  Pars
11d50 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
11d60 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
11d70 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65  texts */.  Table
11d80 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
11d90 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74   /* Add column t
11da0 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ype information 
11db0 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
11dc0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
11dd0 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45  ct       /* SELE
11de0 43 54 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  CT used to deter
11df0 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20 63  mine types and c
11e00 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  ollations */.){.
11e10 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
11e20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61  pParse->db;.  Na
11e30 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
11e40 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
11e50 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
11e60 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72  .  int i;.  Expr
11e70 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45 78   *p;.  struct Ex
11e80 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
11e90 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65  .  assert( pSele
11ea0 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ct!=0 );.  asser
11eb0 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c  t( (pSelect->sel
11ec0 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c  Flags & SF_Resol
11ed0 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61 73 73  ved)!=0 );.  ass
11ee0 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d  ert( pTab->nCol=
11ef0 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  =pSelect->pEList
11f00 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d  ->nExpr || db->m
11f10 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
11f20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
11f30 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
11f40 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
11f50 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
11f60 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
11f70 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a   pSelect->pSrc;.
11f80 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70    a = pSelect->p
11f90 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28  EList->a;.  for(
11fa0 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e  i=0, pCol=pTab->
11fb0 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  aCol; i<pTab->nC
11fc0 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
11fd0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
11fe0 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 69 6e 74   *zType;.    int
11ff0 20 6e 2c 20 6d 3b 0a 20 20 20 20 70 20 3d 20 61   n, m;.    p = a
12000 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7a  [i].pExpr;.    z
12010 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
12020 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c  e(&sNC, p, 0, 0,
12030 20 30 29 3b 0a 20 20 20 20 2f 2a 20 70 43 6f 6c   0);.    /* pCol
12040 2d 3e 73 7a 45 73 74 20 3d 20 2e 2e 2e 20 2f 2f  ->szEst = ... //
12050 20 43 6f 6c 75 6d 6e 20 73 69 7a 65 20 65 73 74   Column size est
12060 20 66 6f 72 20 53 45 4c 45 43 54 20 74 61 62 6c   for SELECT tabl
12070 65 73 20 6e 65 76 65 72 20 75 73 65 64 20 2a 2f  es never used */
12080 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  .    pCol->affin
12090 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
120a0 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20  rAffinity(p);.  
120b0 20 20 69 66 28 20 7a 54 79 70 65 20 29 7b 0a 20    if( zType ){. 
120c0 20 20 20 20 20 6d 20 3d 20 73 71 6c 69 74 65 33       m = sqlite3
120d0 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b  Strlen30(zType);
120e0 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  .      n = sqlit
120f0 65 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 2d  e3Strlen30(pCol-
12100 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  >zName);.      p
12110 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  Col->zName = sql
12120 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
12130 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e  ree(db, pCol->zN
12140 61 6d 65 2c 20 6e 2b 6d 2b 32 29 3b 0a 20 20 20  ame, n+m+2);.   
12150 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 7a 4e 61     if( pCol->zNa
12160 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  me ){.        me
12170 6d 63 70 79 28 26 70 43 6f 6c 2d 3e 7a 4e 61 6d  mcpy(&pCol->zNam
12180 65 5b 6e 2b 31 5d 2c 20 7a 54 79 70 65 2c 20 6d  e[n+1], zType, m
12190 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  +1);.        pCo
121a0 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l->colFlags |= C
121b0 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a  OLFLAG_HASTYPE;.
121c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
121d0 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69    if( pCol->affi
121e0 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e  nity==0 ) pCol->
121f0 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
12200 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20  E_AFF_BLOB;.    
12210 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
12220 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
12230 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  e, p);.    if( p
12240 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 2d 3e 7a 43  Coll && pCol->zC
12250 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  oll==0 ){.      
12260 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71  pCol->zColl = sq
12270 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
12280 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
12290 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61  .    }.  }.  pTa
122a0 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 31 3b  b->szTabRow = 1;
122b0 20 2f 2a 20 41 6e 79 20 6e 6f 6e 2d 7a 65 72 6f   /* Any non-zero
122c0 20 76 61 6c 75 65 20 77 6f 72 6b 73 20 2a 2f 0a   value works */.
122d0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
122e0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
122f0 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54 61  t, generate a Ta
12300 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
12310 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20  at describes.** 
12320 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
12330 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a  f that SELECT..*
12340 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
12350 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
12360 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
12370 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
12380 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
12390 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
123a0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
123b0 75 36 34 20 73 61 76 65 64 46 6c 61 67 73 3b 0a  u64 savedFlags;.
123c0 0a 20 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20  .  savedFlags = 
123d0 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d  db->flags;.  db-
123e0 3e 66 6c 61 67 73 20 26 3d 20 7e 28 75 36 34 29  >flags &= ~(u64)
123f0 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
12400 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  mes;.  db->flags
12410 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74   |= SQLITE_Short
12420 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69  ColNames;.  sqli
12430 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
12440 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30  arse, pSelect, 0
12450 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
12460 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30  >nErr ) return 0
12470 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  ;.  while( pSele
12480 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  ct->pPrior ) pSe
12490 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  lect = pSelect->
124a0 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c  pPrior;.  db->fl
124b0 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73  ags = savedFlags
124c0 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
124d0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
124e0 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
124f0 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   );.  if( pTab==
12500 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
12510 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20  0;.  }.  /* The 
12520 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
12530 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e  OfSelect() is on
12540 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78  ly used n contex
12550 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69  ts where lookasi
12560 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62  de.  ** is disab
12570 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  led */.  assert(
12580 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
12590 44 69 73 61 62 6c 65 20 29 3b 0a 20 20 70 54 61  Disable );.  pTa
125a0 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a  b->nTabRef = 1;.
125b0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
125c0 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c  0;.  pTab->nRowL
125d0 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
125e0 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
125f0 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
12600 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c   );.  sqlite3Col
12610 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
12620 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
12630 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d  ->pEList, &pTab-
12640 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43  >nCol, &pTab->aC
12650 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ol);.  sqlite3Se
12660 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
12670 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
12680 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c  arse, pTab, pSel
12690 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50  ect);.  pTab->iP
126a0 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  Key = -1;.  if( 
126b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
126c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
126d0 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
126e0 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Tab);.    return
126f0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
12700 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pTab;.}../*.** 
12710 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74  Get a VDBE for t
12720 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20  he given parser 
12730 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65  context.  Create
12740 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
12750 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61  cessary..** If a
12760 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
12770 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20  return NULL and 
12780 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20  leave a message 
12790 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64  in pParse..*/.Vd
127a0 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64  be *sqlite3GetVd
127b0 62 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  be(Parse *pParse
127c0 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
127d0 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 72 65  >pVdbe ){.    re
127e0 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 70 56 64  turn pParse->pVd
127f0 62 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  be;.  }.  if( pP
12800 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d  arse->pToplevel=
12810 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  =0.   && Optimiz
12820 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61  ationEnabled(pPa
12830 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 46  rse->db,SQLITE_F
12840 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29 0a 20  actorOutConst). 
12850 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
12860 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20  okConstFactor = 
12870 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
12880 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74  sqlite3VdbeCreat
12890 65 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a 0a 2f  e(pParse);.}.../
128a0 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
128b0 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
128c0 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  set fields of th
128d0 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f  e SELECT based o
128e0 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20  n the.** pLimit 
128f0 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c  expressions.  pL
12900 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e 64 20  imit->pLeft and 
12910 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 20 68  pLimit->pRight h
12920 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69  old the expressi
12930 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65  ons.** that appe
12940 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ar in the origin
12950 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
12960 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54   after the LIMIT
12970 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b   and OFFSET.** k
12980 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c  eywords.  Or NUL
12990 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f  L if those keywo
129a0 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e  rds are omitted.
129b0 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
129c0 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20  set .** are the 
129d0 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72  integer memory r
129e0 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20  egister numbers 
129f0 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65  for counters use
12a00 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a  d to compute .**
12a10 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f   the limit and o
12a20 66 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65  ffset.  If there
12a30 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64   is no limit and
12a40 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e  /or offset, then
12a50 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20   .** iLimit and 
12a60 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61  iOffset are nega
12a70 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tive..**.** This
12a80 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73   routine changes
12a90 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69   the values of i
12aa0 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
12ab0 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c  t only if.** a l
12ac0 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69  imit or offset i
12ad0 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69  s defined by pLi
12ae0 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70  mit->pLeft and p
12af0 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 2e 20 20  Limit->pRight.  
12b00 69 4c 69 6d 69 74 0a 2a 2a 20 61 6e 64 20 69 4f  iLimit.** and iO
12b10 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76  ffset should hav
12b20 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f  e been preset to
12b30 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66   appropriate def
12b40 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a 65 72  ault values (zer
12b50 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63  o).** prior to c
12b60 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
12b70 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ine..**.** The i
12b80 4f 66 66 73 65 74 20 72 65 67 69 73 74 65 72 20  Offset register 
12b90 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69  (if it exists) i
12ba0 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
12bb0 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66   the value.** of
12bc0 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20 54 68   the OFFSET.  Th
12bd0 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73 74 65  e iLimit registe
12be0 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  r is initialized
12bf0 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67 69   to LIMIT.  Regi
12c00 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74 2b  ster.** iOffset+
12c10 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  1 is initialized
12c20 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54   to LIMIT+OFFSET
12c30 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20  ..**.** Only if 
12c40 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21 3d 30  pLimit->pLeft!=0
12c50 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65   do the limit re
12c60 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72  gisters get.** r
12c70 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55  edefined.  The U
12c80 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
12c90 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70  r uses this prop
12ca0 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a  erty to force.**
12cb0 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68   the reuse of th
12cc0 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64  e same limit and
12cd0 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72   offset register
12ce0 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c  s across multipl
12cf0 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  e.** SELECT stat
12d00 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  ements..*/.stati
12d10 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69  c void computeLi
12d20 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72  mitRegisters(Par
12d30 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
12d40 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61  ct *p, int iBrea
12d50 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  k){.  Vdbe *v = 
12d60 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20  0;.  int iLimit 
12d70 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73  = 0;.  int iOffs
12d80 65 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 45  et;.  int n;.  E
12d90 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d  xpr *pLimit = p-
12da0 3e 70 4c 69 6d 69 74 3b 0a 0a 20 20 69 66 28 20  >pLimit;..  if( 
12db0 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75  p->iLimit ) retu
12dc0 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  rn;..  /* .  ** 
12dd0 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79  "LIMIT -1" alway
12de0 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73  s shows all rows
12df0 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65  .  There is some
12e00 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72 73  .  ** controvers
12e10 79 20 61 62 6f 75 74 20 77 68 61 74 20 74 68 65  y about what the
12e20 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f   correct behavio
12e30 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a  r should be..  *
12e40 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d  * The current im
12e50 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74  plementation int
12e60 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30  erprets "LIMIT 0
12e70 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e  " to mean.  ** n
12e80 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69  o rows..  */.  i
12e90 66 28 20 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  f( pLimit ){.   
12ea0 20 61 73 73 65 72 74 28 20 70 4c 69 6d 69 74 2d   assert( pLimit-
12eb0 3e 6f 70 3d 3d 54 4b 5f 4c 49 4d 49 54 20 29 3b  >op==TK_LIMIT );
12ec0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
12ed0 6d 69 74 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b  mit->pLeft!=0 );
12ee0 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  .    p->iLimit =
12ef0 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72   iLimit = ++pPar
12f00 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20  se->nMem;.    v 
12f10 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
12f20 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 61 73  (pParse);.    as
12f30 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
12f40 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
12f50 72 49 73 49 6e 74 65 67 65 72 28 70 4c 69 6d 69  rIsInteger(pLimi
12f60 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 29 20 29 7b  t->pLeft, &n) ){
12f70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12f80 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
12f90 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69  nteger, n, iLimi
12fa0 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
12fb0 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
12fc0 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
12fd0 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
12fe0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
12ff0 62 65 47 6f 74 6f 28 76 2c 20 69 42 72 65 61 6b  beGoto(v, iBreak
13000 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
13010 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d 3e 6e 53  f( n>=0 && p->nS
13020 65 6c 65 63 74 52 6f 77 3e 73 71 6c 69 74 65 33  electRow>sqlite3
13030 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29 20 29  LogEst((u64)n) )
13040 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65  {.        p->nSe
13050 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  lectRow = sqlite
13060 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29 3b  3LogEst((u64)n);
13070 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46  .        p->selF
13080 6c 61 67 73 20 7c 3d 20 53 46 5f 46 69 78 65 64  lags |= SF_Fixed
13090 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Limit;.      }. 
130a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
130b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
130c0 70 50 61 72 73 65 2c 20 70 4c 69 6d 69 74 2d 3e  pParse, pLimit->
130d0 70 4c 65 66 74 2c 20 69 4c 69 6d 69 74 29 3b 0a  pLeft, iLimit);.
130e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
130f0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75  eAddOp1(v, OP_Mu
13100 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29  stBeInt, iLimit)
13110 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
13120 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
13130 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20  ment((v, "LIMIT 
13140 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
13150 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13160 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op2(v, OP_IfNot,
13170 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29   iLimit, iBreak)
13180 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
13190 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
131a0 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 20   pLimit->pRight 
131b0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  ){.      p->iOff
131c0 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d 20  set = iOffset = 
131d0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
131e0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
131f0 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63  em++;   /* Alloc
13200 61 74 65 20 61 6e 20 65 78 74 72 61 20 72 65 67  ate an extra reg
13210 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b  ister for limit+
13220 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20  offset */.      
13230 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
13240 70 50 61 72 73 65 2c 20 70 4c 69 6d 69 74 2d 3e  pParse, pLimit->
13250 70 52 69 67 68 74 2c 20 69 4f 66 66 73 65 74 29  pRight, iOffset)
13260 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
13270 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
13280 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73  MustBeInt, iOffs
13290 65 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  et); VdbeCoverag
132a0 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
132b0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46  Comment((v, "OFF
132c0 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  SET counter"));.
132d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
132e0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66  eAddOp3(v, OP_Of
132f0 66 73 65 74 4c 69 6d 69 74 2c 20 69 4c 69 6d 69  fsetLimit, iLimi
13300 74 2c 20 69 4f 66 66 73 65 74 2b 31 2c 20 69 4f  t, iOffset+1, iO
13310 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64  ffset);.      Vd
13320 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
13330 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a  IMIT+OFFSET"));.
13340 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66      }.  }.}..#if
13350 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13360 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
13370 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
13380 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f  e appropriate co
13390 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
133a0 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68   for the iCol-th
133b0 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68   column of.** th
133c0 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72  e result set for
133d0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65   the compound-se
133e0 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22  lect statement "
133f0 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  p".  Return NULL
13400 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   if.** the colum
13410 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74  n has no default
13420 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
13430 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  nce..**.** The c
13440 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
13450 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  e for the compou
13460 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b  nd select is tak
13470 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c  en from the.** l
13480 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66  eft-most term of
13490 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74   the select that
134a0 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
134b0 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74   sequence..*/.st
134c0 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75  atic CollSeq *mu
134d0 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
134e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
134f0 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
13500 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  Col){.  CollSeq 
13510 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e  *pRet;.  if( p->
13520 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52  pPrior ){.    pR
13530 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  et = multiSelect
13540 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
13550 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29  p->pPrior, iCol)
13560 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
13570 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  Ret = 0;.  }.  a
13580 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29  ssert( iCol>=0 )
13590 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20 6d 75 73 74  ;.  /* iCol must
135a0 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 70 2d   be less than p-
135b0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2e 20  >pEList->nExpr. 
135c0 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72   Otherwise an er
135d0 72 6f 72 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 68  ror would.  ** h
135e0 61 76 65 20 62 65 65 6e 20 74 68 72 6f 77 6e 20  ave been thrown 
135f0 64 75 72 69 6e 67 20 6e 61 6d 65 20 72 65 73 6f  during name reso
13600 6c 75 74 69 6f 6e 20 61 6e 64 20 77 65 20 77 6f  lution and we wo
13610 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 67 6f 74  uld not have got
13620 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20 66 61  ten.  ** this fa
13630 72 20 2a 2f 0a 20 20 69 66 28 20 70 52 65 74 3d  r */.  if( pRet=
13640 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69 43 6f  =0 && ALWAYS(iCo
13650 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  l<p->pEList->nEx
13660 70 72 29 20 29 7b 0a 20 20 20 20 70 52 65 74 20  pr) ){.    pRet 
13670 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
13680 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
13690 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
136a0 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65  pExpr);.  }.  re
136b0 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
136c0 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73  .** The select s
136d0 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
136e0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  as the second pa
136f0 72 61 6d 65 74 65 72 20 69 73 20 61 20 63 6f 6d  rameter is a com
13700 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a 2a 20  pound SELECT.** 
13710 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  with an ORDER BY
13720 20 63 6c 61 75 73 65 2e 20 54 68 69 73 20 66 75   clause. This fu
13730 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73  nction allocates
13740 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 4b   and returns a K
13750 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74  eyInfo.** struct
13760 75 72 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ure suitable for
13770 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
13780 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2a 0a 2a  e ORDER BY..**.*
13790 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
137a0 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
137b0 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 65  cture is obtaine
137c0 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 54  d from malloc. T
137d0 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
137e0 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e  nction is respon
137f0 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72 69  sible for ensuri
13800 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72  ng that this str
13810 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75  ucture is eventu
13820 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a  ally.** freed..*
13830 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f  /.static KeyInfo
13840 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64   *multiSelectOrd
13850 65 72 42 79 4b 65 79 49 6e 66 6f 28 50 61 72 73  erByKeyInfo(Pars
13860 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
13870 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78 74 72 61  t *p, int nExtra
13880 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
13890 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
138a0 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 4f 72  derBy;.  int nOr
138b0 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
138c0 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 71  rBy->nExpr;.  sq
138d0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
138e0 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66  se->db;.  KeyInf
138f0 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65  o *pRet = sqlite
13900 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
13910 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45 78 74 72  , nOrderBy+nExtr
13920 61 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 52 65  a, 1);.  if( pRe
13930 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
13940 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
13950 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
13960 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
13970 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
13980 20 3d 20 26 70 4f 72 64 65 72 42 79 2d 3e 61 5b   = &pOrderBy->a[
13990 69 5d 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  i];.      Expr *
139a0 70 54 65 72 6d 20 3d 20 70 49 74 65 6d 2d 3e 70  pTerm = pItem->p
139b0 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  Expr;.      Coll
139c0 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 20  Seq *pColl;..   
139d0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c     if( pTerm->fl
139e0 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
139f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
13a00 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
13a10 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
13a20 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Term);.      }el
13a30 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  se{.        pCol
13a40 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
13a50 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
13a60 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  , pItem->u.x.iOr
13a70 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a 20 20 20  derByCol-1);.   
13a80 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d       if( pColl==
13a90 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  0 ) pColl = db->
13aa0 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
13ab0 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69     pOrderBy->a[i
13ac0 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20 20 20 20  ].pExpr =.      
13ad0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
13ae0 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28  ddCollateString(
13af0 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
13b00 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
13b10 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
13b20 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
13b30 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 52  foIsWriteable(pR
13b40 65 74 29 20 29 3b 0a 20 20 20 20 20 20 70 52 65  et) );.      pRe
13b50 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43  t->aColl[i] = pC
13b60 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52 65 74 2d  oll;.      pRet-
13b70 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
13b80 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
13b90 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d  sortOrder;.    }
13ba0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
13bb0 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  Ret;.}..#ifndef 
13bc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
13bd0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
13be0 6e 65 20 67 65 6e 65 72 61 74 65 73 20 56 44 42  ne generates VDB
13bf0 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74  E code to comput
13c00 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
13c10 20 61 20 57 49 54 48 20 52 45 43 55 52 53 49 56   a WITH RECURSIV
13c20 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74 68  E.** query of th
13c30 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
13c40 3c 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65  <recursive-table
13c50 3e 20 41 53 20 28 3c 73 65 74 75 70 2d 71 75 65  > AS (<setup-que
13c60 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20  ry> UNION [ALL] 
13c70 3c 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79  <recursive-query
13c80 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  >).**           
13c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f                \_
13ca0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
13cb0 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
13cc0 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20  ________/.**    
13cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ce0 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
13cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d00 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a        p.**.**.**
13d10 20 54 68 65 72 65 20 69 73 20 65 78 61 63 74 6c   There is exactl
13d20 79 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20  y one reference 
13d30 74 6f 20 74 68 65 20 72 65 63 75 72 73 69 76 65  to the recursive
13d40 2d 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52  -table in the FR
13d50 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 6f 66 20  OM clause.** of 
13d60 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 2c  recursive-query,
13d70 20 6d 61 72 6b 65 64 20 77 69 74 68 20 74 68 65   marked with the
13d80 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d 2e 66 67   SrcList->a[].fg
13d90 2e 69 73 52 65 63 75 72 73 69 76 65 20 66 6c 61  .isRecursive fla
13da0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 74  g..**.** The set
13db0 75 70 2d 71 75 65 72 79 20 72 75 6e 73 20 6f 6e  up-query runs on
13dc0 63 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ce to generate a
13dd0 6e 20 69 6e 69 74 69 61 6c 20 73 65 74 20 6f 66  n initial set of
13de0 20 72 6f 77 73 20 74 68 61 74 20 67 6f 0a 2a 2a   rows that go.**
13df0 20 69 6e 74 6f 20 61 20 51 75 65 75 65 20 74 61   into a Queue ta
13e00 62 6c 65 2e 20 20 52 6f 77 73 20 61 72 65 20 65  ble.  Rows are e
13e10 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
13e20 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 6f 6e  e Queue table on
13e30 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45 61  e by.** one.  Ea
13e40 63 68 20 72 6f 77 20 65 78 74 72 61 63 74 65 64  ch row extracted
13e50 20 66 72 6f 6d 20 51 75 65 75 65 20 69 73 20 6f   from Queue is o
13e60 75 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20  utput to pDest. 
13e70 20 54 68 65 6e 20 74 68 65 20 73 69 6e 67 6c 65   Then the single
13e80 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20 72 6f  .** extracted ro
13e90 77 20 28 6e 6f 77 20 69 6e 20 74 68 65 20 69 43  w (now in the iC
13ea0 75 72 72 65 6e 74 20 74 61 62 6c 65 29 20 62 65  urrent table) be
13eb0 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e 74 65 6e  comes the conten
13ec0 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63 75  t of the.** recu
13ed0 72 73 69 76 65 2d 74 61 62 6c 65 20 66 6f 72 20  rsive-table for 
13ee0 61 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72  a recursive-quer
13ef0 79 20 72 75 6e 2e 20 20 54 68 65 20 6f 75 74 70  y run.  The outp
13f00 75 74 20 6f 66 20 74 68 65 20 72 65 63 75 72 73  ut of the recurs
13f10 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20 69 73 20  ive-query.** is 
13f20 61 64 64 65 64 20 62 61 63 6b 20 69 6e 74 6f 20  added back into 
13f30 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e  the Queue table.
13f40 20 20 54 68 65 6e 20 61 6e 6f 74 68 65 72 20 72    Then another r
13f50 6f 77 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ow is extracted 
13f60 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a 20 61 6e  from Queue.** an
13f70 64 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20  d the iteration 
13f80 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74 69 6c 20  continues until 
13f90 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
13fa0 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20  is empty..**.** 
13fb0 49 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  If the compound 
13fc0 71 75 65 72 79 20 6f 70 65 72 61 74 6f 72 20 69  query operator i
13fd0 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f 20  s UNION then no 
13fe0 64 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20 61  duplicate rows a
13ff0 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e 73 65 72  re ever.** inser
14000 74 65 64 20 69 6e 74 6f 20 74 68 65 20 51 75 65  ted into the Que
14010 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 69  ue table.  The i
14020 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6b  Distinct table k
14030 65 65 70 73 20 61 20 63 6f 70 79 20 6f 66 20 61  eeps a copy of a
14040 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68 61 74 20  ll rows.** that 
14050 68 61 76 65 20 65 76 65 72 20 62 65 65 6e 20 69  have ever been i
14060 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 51 75 65  nserted into Que
14070 75 65 20 61 6e 64 20 63 61 75 73 65 73 20 64 75  ue and causes du
14080 70 6c 69 63 61 74 65 73 20 74 6f 20 62 65 0a 2a  plicates to be.*
14090 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20 49 66  * discarded.  If
140a0 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73   the operator is
140b0 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74 68 65 6e   UNION ALL, then
140c0 20 64 75 70 6c 69 63 61 74 65 73 20 61 72 65 20   duplicates are 
140d0 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a 20  allowed..** .** 
140e0 49 66 20 74 68 65 20 71 75 65 72 79 20 68 61 73  If the query has
140f0 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68   an ORDER BY, th
14100 65 6e 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  en entries in th
14110 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 61 72  e Queue table ar
14120 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20 4f 52 44  e kept in.** ORD
14130 45 52 20 42 59 20 6f 72 64 65 72 20 61 6e 64 20  ER BY order and 
14140 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
14150 69 73 20 65 78 74 72 61 63 74 65 64 20 66 6f 72  is extracted for
14160 20 65 61 63 68 20 63 79 63 6c 65 2e 20 20 57 69   each cycle.  Wi
14170 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f 52 44 45  thout.** an ORDE
14180 52 20 42 59 2c 20 74 68 65 20 51 75 65 75 65 20  R BY, the Queue 
14190 74 61 62 6c 65 20 69 73 20 6a 75 73 74 20 61 20  table is just a 
141a0 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  FIFO..**.** If a
141b0 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 69 73   LIMIT clause is
141c0 20 70 72 6f 76 69 64 65 64 2c 20 74 68 65 6e 20   provided, then 
141d0 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20 73 74  the iteration st
141e0 6f 70 73 20 61 66 74 65 72 20 4c 49 4d 49 54 20  ops after LIMIT 
141f0 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20 62 65 65  rows.** have bee
14200 6e 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73  n output to pDes
14210 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f 66 20 7a  t.  A LIMIT of z
14220 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74  ero means to out
14230 70 75 74 20 6e 6f 20 72 6f 77 73 20 61 6e 64 20  put no rows and 
14240 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 4c 49  a.** negative LI
14250 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74  MIT means to out
14260 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49  put all rows.  I
14270 66 20 74 68 65 72 65 20 69 73 20 61 6c 73 6f 20  f there is also 
14280 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  an OFFSET clause
14290 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f 73 69 74  .** with a posit
142a0 69 76 65 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  ive value, then 
142b0 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54  the first OFFSET
142c0 20 6f 75 74 70 75 74 73 20 61 72 65 20 64 69 73   outputs are dis
142d0 63 61 72 64 65 64 20 72 61 74 68 65 72 0a 2a 2a  carded rather.**
142e0 20 74 68 61 6e 20 62 65 69 6e 67 20 73 65 6e 74   than being sent
142f0 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65 20   to pDest.  The 
14300 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64 6f 65 73  LIMIT count does
14310 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e 74 69 6c   not begin until
14320 20 61 66 74 65 72 20 4f 46 46 53 45 54 0a 2a 2a   after OFFSET.**
14330 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20   rows have been 
14340 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74  skipped..*/.stat
14350 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
14360 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75 65  WithRecursiveQue
14370 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ry(.  Parse *pPa
14380 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
14390 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
143a0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
143b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
143c0 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43   recursive SELEC
143d0 54 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  T to be coded */
143e0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
143f0 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
14400 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
14410 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
14420 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
14430 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20 20 20 20  = p->pSrc;      
14440 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
14450 73 65 20 6f 66 20 74 68 65 20 72 65 63 75 72 73  se of the recurs
14460 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ive query */.  i
14470 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c  nt nCol = p->pEL
14480 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a 20  ist->nExpr;  /* 
14490 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
144a0 73 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69  s in the recursi
144b0 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 56 64  ve table */.  Vd
144c0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
144d0 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54  pVdbe;      /* T
144e0 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
144f0 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73  ement under cons
14500 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65  truction */.  Se
14510 6c 65 63 74 20 2a 70 53 65 74 75 70 20 3d 20 70  lect *pSetup = p
14520 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f 2a 20 54  ->pPrior;   /* T
14530 68 65 20 73 65 74 75 70 20 71 75 65 72 79 20 2a  he setup query *
14540 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b  /.  int addrTop;
14550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14560 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
14570 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
14580 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61  drCont, addrBrea
14590 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f 4e 54 49  k;      /* CONTI
145a0 4e 55 45 20 61 6e 64 20 42 52 45 41 4b 20 61 64  NUE and BREAK ad
145b0 64 72 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e 74  dresses */.  int
145c0 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20 20   iCurrent = 0;  
145d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
145e0 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e Current table 
145f0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43 75 72 72  */.  int regCurr
14600 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
14610 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
14620 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e 74 20 74  olding Current t
14630 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 51  able */.  int iQ
14640 75 65 75 65 3b 20 20 20 20 20 20 20 20 20 20 20  ueue;           
14650 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 51          /* The Q
14660 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ueue table */.  
14670 69 6e 74 20 69 44 69 73 74 69 6e 63 74 20 3d 20  int iDistinct = 
14680 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
14690 20 54 6f 20 65 6e 73 75 72 65 20 75 6e 69 71 75   To ensure uniqu
146a0 65 20 72 65 73 75 6c 74 73 20 69 66 20 55 4e 49  e results if UNI
146b0 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  ON */.  int eDes
146c0 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b 20 20 20  t = SRT_Fifo;   
146d0 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
146e0 77 72 69 74 65 20 74 6f 20 51 75 65 75 65 20 2a  write to Queue *
146f0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
14700 65 73 74 51 75 65 75 65 3b 20 20 20 20 20 20 20  estQueue;       
14710 20 20 2f 2a 20 53 65 6c 65 63 74 44 65 73 74 20    /* SelectDest 
14720 74 61 72 67 65 74 74 69 6e 67 20 74 68 65 20 51  targetting the Q
14730 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ueue table */.  
14740 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
14750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14760 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
14770 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
14780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14790 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
147a0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
147b0 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
147c0 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
147d0 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  BY clause */.  E
147e0 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20  xpr *pLimit;    
147f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14800 53 61 76 65 64 20 4c 49 4d 49 54 20 61 6e 64 20  Saved LIMIT and 
14810 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 6e 74 20  OFFSET */.  int 
14820 72 65 67 4c 69 6d 69 74 2c 20 72 65 67 4f 66 66  regLimit, regOff
14830 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 52 65 67  set;      /* Reg
14840 69 73 74 65 72 73 20 75 73 65 64 20 62 79 20 4c  isters used by L
14850 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
14860 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
14870 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
14880 4e 43 0a 20 20 69 66 28 20 70 2d 3e 70 57 69 6e  NC.  if( p->pWin
14890 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
148a0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
148b0 22 63 61 6e 6e 6f 74 20 75 73 65 20 77 69 6e 64  "cannot use wind
148c0 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20  ow functions in 
148d0 72 65 63 75 72 73 69 76 65 20 71 75 65 72 69 65  recursive querie
148e0 73 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  s");.    return;
148f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
14900 2a 20 4f 62 74 61 69 6e 20 61 75 74 68 6f 72 69  * Obtain authori
14910 7a 61 74 69 6f 6e 20 74 6f 20 64 6f 20 61 20 72  zation to do a r
14920 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a  ecursive query *
14930 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  /.  if( sqlite3A
14940 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
14950 20 53 51 4c 49 54 45 5f 52 45 43 55 52 53 49 56   SQLITE_RECURSIV
14960 45 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  E, 0, 0, 0) ) re
14970 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63  turn;..  /* Proc
14980 65 73 73 20 74 68 65 20 4c 49 4d 49 54 20 61 6e  ess the LIMIT an
14990 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  d OFFSET clauses
149a0 2c 20 69 66 20 74 68 65 79 20 65 78 69 73 74 20  , if they exist 
149b0 2a 2f 0a 20 20 61 64 64 72 42 72 65 61 6b 20 3d  */.  addrBreak =
149c0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
149d0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e  Label(v);.  p->n
149e0 53 65 6c 65 63 74 52 6f 77 20 3d 20 33 32 30 3b  SelectRow = 320;
149f0 20 20 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e 20 72    /* 4 billion r
14a00 6f 77 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65  ows */.  compute
14a10 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
14a20 50 61 72 73 65 2c 20 70 2c 20 61 64 64 72 42 72  Parse, p, addrBr
14a30 65 61 6b 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d  eak);.  pLimit =
14a40 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 72 65   p->pLimit;.  re
14a50 67 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d  gLimit = p->iLim
14a60 69 74 3b 0a 20 20 72 65 67 4f 66 66 73 65 74 20  it;.  regOffset 
14a70 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  = p->iOffset;.  
14a80 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
14a90 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e   p->iLimit = p->
14aa0 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70  iOffset = 0;.  p
14ab0 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
14ac0 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  derBy;..  /* Loc
14ad0 61 74 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e  ate the cursor n
14ae0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 43 75 72  umber of the Cur
14af0 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  rent table */.  
14b00 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59 53 28  for(i=0; ALWAYS(
14b10 69 3c 70 53 72 63 2d 3e 6e 53 72 63 29 3b 20 69  i<pSrc->nSrc); i
14b20 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 53 72  ++){.    if( pSr
14b30 63 2d 3e 61 5b 69 5d 2e 66 67 2e 69 73 52 65 63  c->a[i].fg.isRec
14b40 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
14b50 69 43 75 72 72 65 6e 74 20 3d 20 70 53 72 63 2d  iCurrent = pSrc-
14b60 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  >a[i].iCursor;. 
14b70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14b80 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
14b90 63 61 74 65 20 63 75 72 73 6f 72 73 20 6e 75 6d  cate cursors num
14ba0 62 65 72 73 20 66 6f 72 20 51 75 65 75 65 20 61  bers for Queue a
14bb0 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 20 54 68  nd Distinct.  Th
14bc0 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
14bd0 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44 69 73  for.  ** the Dis
14be0 74 69 6e 63 74 20 74 61 62 6c 65 20 6d 75 73 74  tinct table must
14bf0 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20   be exactly one 
14c00 67 72 65 61 74 65 72 20 74 68 61 6e 20 51 75 65  greater than Que
14c10 75 65 20 69 6e 20 6f 72 64 65 72 0a 20 20 2a 2a  ue in order.  **
14c20 20 66 6f 72 20 74 68 65 20 53 52 54 5f 44 69 73   for the SRT_Dis
14c30 74 46 69 66 6f 20 61 6e 64 20 53 52 54 5f 44 69  tFifo and SRT_Di
14c40 73 74 51 75 65 75 65 20 64 65 73 74 69 6e 61 74  stQueue destinat
14c50 69 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f  ions to work. */
14c60 0a 20 20 69 51 75 65 75 65 20 3d 20 70 50 61 72  .  iQueue = pPar
14c70 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 66  se->nTab++;.  if
14c80 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
14c90 4e 20 29 7b 0a 20 20 20 20 65 44 65 73 74 20 3d  N ){.    eDest =
14ca0 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f   pOrderBy ? SRT_
14cb0 44 69 73 74 51 75 65 75 65 20 3a 20 53 52 54 5f  DistQueue : SRT_
14cc0 44 69 73 74 46 69 66 6f 3b 0a 20 20 20 20 69 44  DistFifo;.    iD
14cd0 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65  istinct = pParse
14ce0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73  ->nTab++;.  }els
14cf0 65 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70  e{.    eDest = p
14d00 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f 51 75  OrderBy ? SRT_Qu
14d10 65 75 65 20 3a 20 53 52 54 5f 46 69 66 6f 3b 0a  eue : SRT_Fifo;.
14d20 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c    }.  sqlite3Sel
14d30 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
14d40 74 51 75 65 75 65 2c 20 65 44 65 73 74 2c 20 69  tQueue, eDest, i
14d50 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c  Queue);..  /* Al
14d60 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 66  locate cursors f
14d70 6f 72 20 43 75 72 72 65 6e 74 2c 20 51 75 65 75  or Current, Queu
14d80 65 2c 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e  e, and Distinct.
14d90 20 2a 2f 0a 20 20 72 65 67 43 75 72 72 65 6e 74   */.  regCurrent
14da0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
14db0 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  m;.  sqlite3Vdbe
14dc0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
14dd0 6e 50 73 65 75 64 6f 2c 20 69 43 75 72 72 65 6e  nPseudo, iCurren
14de0 74 2c 20 72 65 67 43 75 72 72 65 6e 74 2c 20 6e  t, regCurrent, n
14df0 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4f 72 64  Col);.  if( pOrd
14e00 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49  erBy ){.    KeyI
14e10 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
14e20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
14e30 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  ByKeyInfo(pParse
14e40 2c 20 70 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  , p, 1);.    sql
14e50 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
14e60 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
14e70 61 6c 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64  al, iQueue, pOrd
14e80 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30  erBy->nExpr+2, 0
14e90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14ea0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
14eb0 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
14ec0 4e 46 4f 29 3b 0a 20 20 20 20 64 65 73 74 51 75  NFO);.    destQu
14ed0 65 75 65 2e 70 4f 72 64 65 72 42 79 20 3d 20 70  eue.pOrderBy = p
14ee0 4f 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65  OrderBy;.  }else
14ef0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
14f00 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
14f10 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75  enEphemeral, iQu
14f20 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a  eue, nCol);.  }.
14f30 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
14f40 2c 20 22 51 75 65 75 65 20 74 61 62 6c 65 22 29  , "Queue table")
14f50 29 3b 0a 20 20 69 66 28 20 69 44 69 73 74 69 6e  );.  if( iDistin
14f60 63 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61 64 64  ct ){.    p->add
14f70 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 73  rOpenEphm[0] = s
14f80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14f90 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
14fa0 65 72 61 6c 2c 20 69 44 69 73 74 69 6e 63 74 2c  eral, iDistinct,
14fb0 20 30 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46   0);.    p->selF
14fc0 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
14fd0 70 68 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20  phemeral;.  }.. 
14fe0 20 2f 2a 20 44 65 74 61 63 68 20 74 68 65 20 4f   /* Detach the O
14ff0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66  RDER BY clause f
15000 72 6f 6d 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  rom the compound
15010 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 70 2d 3e   SELECT */.  p->
15020 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20  pOrderBy = 0;.. 
15030 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
15040 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 74  sults of the set
15050 75 70 2d 71 75 65 72 79 20 69 6e 20 51 75 65 75  up-query in Queu
15060 65 2e 20 2a 2f 0a 20 20 70 53 65 74 75 70 2d 3e  e. */.  pSetup->
15070 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 45 78 70  pNext = 0;.  Exp
15080 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
15090 50 61 72 73 65 2c 20 31 2c 20 22 53 45 54 55 50  Parse, 1, "SETUP
150a0 22 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  "));.  rc = sqli
150b0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
150c0 2c 20 70 53 65 74 75 70 2c 20 26 64 65 73 74 51  , pSetup, &destQ
150d0 75 65 75 65 29 3b 0a 20 20 70 53 65 74 75 70 2d  ueue);.  pSetup-
150e0 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 69 66  >pNext = p;.  if
150f0 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
15100 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65  of_recursive_que
15110 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74  ry;..  /* Find t
15120 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 74  he next row in t
15130 68 65 20 51 75 65 75 65 20 61 6e 64 20 6f 75 74  he Queue and out
15140 70 75 74 20 74 68 61 74 20 72 6f 77 20 2a 2f 0a  put that row */.
15150 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69    addrTop = sqli
15160 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15170 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 51 75 65   OP_Rewind, iQue
15180 75 65 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 20  ue, addrBreak); 
15190 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
151a0 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20  ..  /* Transfer 
151b0 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20  the next row in 
151c0 51 75 65 75 65 20 6f 76 65 72 20 74 6f 20 43 75  Queue over to Cu
151d0 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74  rrent */.  sqlit
151e0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
151f0 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 75 72  OP_NullRow, iCur
15200 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72 65 73  rent); /* To res
15210 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  et column cache 
15220 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
15230 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
15240 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
15250 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75 65 2c  _Column, iQueue,
15260 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
15270 2b 31 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b  +1, regCurrent);
15280 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
15290 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
152a0 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 69  v, OP_RowData, i
152b0 51 75 65 75 65 2c 20 72 65 67 43 75 72 72 65 6e  Queue, regCurren
152c0 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
152d0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
152e0 50 5f 44 65 6c 65 74 65 2c 20 69 51 75 65 75 65  P_Delete, iQueue
152f0 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20  );..  /* Output 
15300 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69  the single row i
15310 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 61  n Current */.  a
15320 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65  ddrCont = sqlite
15330 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
15340 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28  );.  codeOffset(
15350 76 2c 20 72 65 67 4f 66 66 73 65 74 2c 20 61 64  v, regOffset, ad
15360 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c 65 63  drCont);.  selec
15370 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
15380 65 2c 20 70 2c 20 69 43 75 72 72 65 6e 74 2c 0a  e, p, iCurrent,.
15390 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44 65 73        0, 0, pDes
153a0 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64  t, addrCont, add
153b0 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 72  rBreak);.  if( r
153c0 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  egLimit ){.    s
153d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
153e0 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a  (v, OP_DecrJumpZ
153f0 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c 20 61  ero, regLimit, a
15400 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56  ddrBreak);.    V
15410 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
15420 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
15430 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
15440 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f   addrCont);..  /
15450 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 72 65  * Execute the re
15460 63 75 72 73 69 76 65 20 53 45 4c 45 43 54 20 74  cursive SELECT t
15470 61 6b 69 6e 67 20 74 68 65 20 73 69 6e 67 6c 65  aking the single
15480 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20   row in Current 
15490 61 73 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  as.  ** the valu
154a0 65 20 66 6f 72 20 74 68 65 20 72 65 63 75 72 73  e for the recurs
154b0 69 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72 65  ive-table. Store
154c0 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
154d0 74 68 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f 0a  the Queue..  */.
154e0 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
154f0 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
15500 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
15510 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
15520 22 72 65 63 75 72 73 69 76 65 20 61 67 67 72 65  "recursive aggre
15530 67 61 74 65 20 71 75 65 72 69 65 73 20 6e 6f 74  gate queries not
15540 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20   supported");.  
15550 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 70 50  }else{.    p->pP
15560 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 45 78  rior = 0;.    Ex
15570 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
15580 70 50 61 72 73 65 2c 20 31 2c 20 22 52 45 43 55  pParse, 1, "RECU
15590 52 53 49 56 45 20 53 54 45 50 22 29 29 3b 0a 20  RSIVE STEP"));. 
155a0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
155b0 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
155c0 74 51 75 65 75 65 29 3b 0a 20 20 20 20 61 73 73  tQueue);.    ass
155d0 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  ert( p->pPrior==
155e0 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69  0 );.    p->pPri
155f0 6f 72 20 3d 20 70 53 65 74 75 70 3b 0a 20 20 7d  or = pSetup;.  }
15600 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e  ..  /* Keep runn
15610 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74  ing the loop unt
15620 69 6c 20 74 68 65 20 51 75 65 75 65 20 69 73 20  il the Queue is 
15630 65 6d 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74  empty */.  sqlit
15640 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64  e3VdbeGoto(v, ad
15650 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65  drTop);.  sqlite
15660 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
15670 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  l(v, addrBreak);
15680 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69  ..end_of_recursi
15690 76 65 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c 69  ve_query:.  sqli
156a0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
156b0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d  e(pParse->db, p-
156c0 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 2d  >pOrderBy);.  p-
156d0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
156e0 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69  erBy;.  p->pLimi
156f0 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 72 65  t = pLimit;.  re
15700 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  turn;.}.#endif /
15710 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  * SQLITE_OMIT_CT
15720 45 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  E */../* Forward
15730 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 73   references */.s
15740 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
15750 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20  electOrderBy(.  
15760 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
15770 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
15780 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
15790 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
157a0 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
157b0 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
157c0 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
157d0 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
157e0 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
157f0 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
15800 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a   results */.);..
15810 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 20 74 68 65  /*.** Handle the
15820 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66   special case of
15830 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65   a compound-sele
15840 63 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74  ct that originat
15850 65 73 20 66 72 6f 6d 20 61 0a 2a 2a 20 56 41 4c  es from a.** VAL
15860 55 45 53 20 63 6c 61 75 73 65 2e 20 20 42 79 20  UES clause.  By 
15870 68 61 6e 64 6c 69 6e 67 20 74 68 69 73 20 61 73  handling this as
15880 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 2c   a special case,
15890 20 77 65 20 61 76 6f 69 64 20 64 65 65 70 0a 2a   we avoid deep.*
158a0 2a 20 72 65 63 75 72 73 69 6f 6e 2c 20 61 6e 64  * recursion, and
158b0 20 74 68 75 73 20 64 6f 20 6e 6f 74 20 6e 65 65   thus do not nee
158c0 64 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 65  d to enforce the
158d0 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f   SQLITE_LIMIT_CO
158e0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2a 2a  MPOUND_SELECT.**
158f0 20 6f 6e 20 61 20 56 41 4c 55 45 53 20 63 6c 61   on a VALUES cla
15900 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 63 61 75  use..**.** Becau
15910 73 65 20 74 68 65 20 53 65 6c 65 63 74 20 6f 62  se the Select ob
15920 6a 65 63 74 20 6f 72 69 67 69 6e 61 74 65 73 20  ject originates 
15930 66 72 6f 6d 20 61 20 56 41 4c 55 45 53 20 63 6c  from a VALUES cl
15940 61 75 73 65 3a 0a 2a 2a 20 20 20 28 31 29 20 54  ause:.**   (1) T
15950 68 65 72 65 20 69 73 20 6e 6f 20 4c 49 4d 49 54  here is no LIMIT
15960 20 6f 72 20 4f 46 46 53 45 54 20 6f 72 20 65 6c   or OFFSET or el
15970 73 65 20 74 68 65 72 65 20 69 73 20 61 20 4c 49  se there is a LI
15980 4d 49 54 20 6f 66 20 65 78 61 63 74 6c 79 20 31  MIT of exactly 1
15990 0a 2a 2a 20 20 20 28 32 29 20 41 6c 6c 20 74 65  .**   (2) All te
159a0 72 6d 73 20 61 72 65 20 55 4e 49 4f 4e 20 41 4c  rms are UNION AL
159b0 4c 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 72 65  L.**   (3) There
159c0 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
159d0 63 6c 61 75 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65  clause.**.** The
159e0 20 22 4c 49 4d 49 54 20 6f 66 20 65 78 61 63 74   "LIMIT of exact
159f0 6c 79 20 31 22 20 63 61 73 65 20 6f 66 20 63 6f  ly 1" case of co
15a00 6e 64 69 74 69 6f 6e 20 28 31 29 20 63 6f 6d 65  ndition (1) come
15a10 73 20 61 62 6f 75 74 20 77 68 65 6e 20 61 20 56  s about when a V
15a20 41 4c 55 45 53 0a 2a 2a 20 63 6c 61 75 73 65 20  ALUES.** clause 
15a30 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 73 63  occurs within sc
15a40 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20  alar expression 
15a50 28 65 78 3a 20 22 53 45 4c 45 43 54 20 28 56 41  (ex: "SELECT (VA
15a60 4c 55 45 53 28 31 29 2c 28 32 29 2c 28 33 29 29  LUES(1),(2),(3))
15a70 22 29 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  ")..** The sqlit
15a80 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 20  e3CodeSubselect 
15a90 77 69 6c 6c 20 68 61 76 65 20 61 64 64 65 64 20  will have added 
15aa0 74 68 65 20 4c 49 4d 49 54 20 31 20 63 6c 61 75  the LIMIT 1 clau
15ab0 73 65 20 69 6e 20 74 68 74 20 63 61 73 65 2e 0a  se in tht case..
15ac0 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 6c 69 6d  ** Since the lim
15ad0 69 74 20 69 73 20 65 78 61 63 74 6c 79 20 31 2c  it is exactly 1,
15ae0 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f   we only need to
15af0 20 65 76 61 6c 75 74 65 73 20 74 68 65 20 6c 65   evalutes the le
15b00 66 74 2d 6d 6f 73 74 20 56 41 4c 55 45 53 2e 0a  ft-most VALUES..
15b10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
15b20 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28  ltiSelectValues(
15b30 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
15b40 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
15b50 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
15b60 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
15b70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
15b80 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
15b90 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
15ba0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
15bb0 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
15bc0 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
15bd0 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
15be0 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 20 3d 20 31  {.  int nRow = 1
15bf0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
15c00 20 20 69 6e 74 20 62 53 68 6f 77 41 6c 6c 20 3d    int bShowAll =
15c10 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 3b 0a 20   p->pLimit==0;. 
15c20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46   assert( p->selF
15c30 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56  lags & SF_MultiV
15c40 61 6c 75 65 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  alue );.  do{.  
15c50 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c    assert( p->sel
15c60 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65  Flags & SF_Value
15c70 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  s );.    assert(
15c80 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c   p->op==TK_ALL |
15c90 7c 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  | (p->op==TK_SEL
15ca0 45 43 54 20 26 26 20 70 2d 3e 70 50 72 69 6f 72  ECT && p->pPrior
15cb0 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ==0) );.    asse
15cc0 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20  rt( p->pNext==0 
15cd0 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  || p->pEList->nE
15ce0 78 70 72 3d 3d 70 2d 3e 70 4e 65 78 74 2d 3e 70  xpr==p->pNext->p
15cf0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
15d00 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f      if( p->pPrio
15d10 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  r==0 ) break;.  
15d20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72    assert( p->pPr
15d30 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 20 29 3b  ior->pNext==p );
15d40 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69  .    p = p->pPri
15d50 6f 72 3b 0a 20 20 20 20 6e 52 6f 77 20 2b 3d 20  or;.    nRow += 
15d60 62 53 68 6f 77 41 6c 6c 3b 0a 20 20 7d 77 68 69  bShowAll;.  }whi
15d70 6c 65 28 31 29 3b 0a 20 20 45 78 70 6c 61 69 6e  le(1);.  Explain
15d80 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
15d90 65 2c 20 30 2c 20 22 53 43 41 4e 20 25 64 20 43  e, 0, "SCAN %d C
15da0 4f 4e 53 54 41 4e 54 20 52 4f 57 25 73 22 2c 20  ONSTANT ROW%s", 
15db0 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  nRow,.          
15dc0 20 20 20 20 20 20 20 20 20 20 6e 52 6f 77 3d 3d            nRow==
15dd0 31 20 3f 20 22 22 20 3a 20 22 53 22 29 29 3b 0a  1 ? "" : "S"));.
15de0 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
15df0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
15e00 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c  p(pParse, p, -1,
15e10 20 30 2c 20 30 2c 20 70 44 65 73 74 2c 20 31 2c   0, 0, pDest, 1,
15e20 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21 62 53   1);.    if( !bS
15e30 68 6f 77 41 6c 6c 20 29 20 62 72 65 61 6b 3b 0a  howAll ) break;.
15e40 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
15e50 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 70 20  w = nRow;.    p 
15e60 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
15e70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15e80 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
15e90 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
15ea0 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75  process a compou
15eb0 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72  nd query form fr
15ec0 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72  om.** two or mor
15ed0 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69  e separate queri
15ee0 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20  es using UNION, 
15ef0 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50  UNION ALL, EXCEP
15f00 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45  T, or.** INTERSE
15f10 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69  CT.**.** "p" poi
15f20 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68 74  nts to the right
15f30 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f  -most of the two
15f40 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20 71   queries.  the q
15f50 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c  uery on the.** l
15f60 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72  eft is p->pPrior
15f70 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72  .  The left quer
15f80 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20  y could also be 
15f90 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
15fa0 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73  .** in which cas
15fb0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
15fc0 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65  ill be called re
15fd0 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a  cursively. .**.*
15fe0 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66  * The results of
15ff0 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79   the total query
16000 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74 74   are to be writt
16010 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e  en into a destin
16020 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65  ation.** of type
16030 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61   eDest with para
16040 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a  meter iParm..**.
16050 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43  ** Example 1:  C
16060 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65 2d  onsider a three-
16070 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c  way compound SQL
16080 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
16090 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
160a0 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c  ROM t1 UNION SEL
160b0 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e  ECT b FROM t2 UN
160c0 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f  ION SELECT c FRO
160d0 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  M t3.**.** This 
160e0 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
160f0 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77  sed up as follow
16100 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
16110 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a  ECT c FROM t3.**
16120 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16130 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20  `----->  SELECT 
16140 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20  b FROM t2.**    
16150 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
16160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16170 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54  `------>  SELECT
16180 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a   a FROM t1.**.**
16190 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74   The arrows in t
161a0 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65  he diagram above
161b0 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 53   represent the S
161c0 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69  elect.pPrior poi
161d0 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74  nter..** So if t
161e0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
161f0 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71 75  alled with p equ
16200 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75 65  al to the t3 que
16210 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69  ry, then.** pPri
16220 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74  or will be the t
16230 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20  2 query.  p->op 
16240 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e  will be TK_UNION
16250 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
16260 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74  *.** Notice that
16270 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
16280 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73 65  way SQLite parse
16290 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  s compound SELEC
162a0 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  Ts, the.** indiv
162b0 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c  idual selects al
162c0 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20  ways group from 
162d0 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a  left to right..*
162e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
162f0 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  tiSelect(.  Pars
16300 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
16310 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
16320 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
16330 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
16340 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
16350 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
16360 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
16370 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
16380 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
16390 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
163a0 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
163b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
163c0 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f     /* Success co
163d0 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75  de from a subrou
163e0 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tine */.  Select
163f0 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20   *pPrior;       
16400 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
16410 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  T immediately to
16420 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56   our left */.  V
16430 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
16440 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
16450 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44   code to this VD
16460 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  BE */.  SelectDe
16470 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a  st dest;      /*
16480 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74   Alternative dat
16490 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f  a destination */
164a0 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65  .  Select *pDele
164b0 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69  te = 0;  /* Chai
164c0 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65  n of simple sele
164d0 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f  cts to delete */
164e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
164f0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
16500 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
16510 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  */..  /* Make su
16520 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f  re there is no O
16530 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54  RDER BY or LIMIT
16540 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72   clause on prior
16550 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a   SELECTs.  Only.
16560 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72    ** the last (r
16570 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43  ight-most) SELEC
16580 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20  T in the series 
16590 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45  may have an ORDE
165a0 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20  R BY or LIMIT.. 
165b0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20   */.  assert( p 
165c0 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20  && p->pPrior ); 
165d0 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63   /* Calling func
165e0 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20  tion guarantees 
165f0 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61  this much */.  a
16600 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c  ssert( (p->selFl
16610 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
16620 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d  ve)==0 || p->op=
16630 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70  =TK_ALL || p->op
16640 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
16650 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
16660 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
16670 50 72 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20  Prior;.  dest = 
16680 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50  *pDest;.  if( pP
16690 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 7c  rior->pOrderBy |
166a0 7c 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  | pPrior->pLimit
166b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
166c0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
166d0 25 73 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  %s clause should
166e0 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e   come after %s n
166f0 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20  ot before",.    
16700 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72    pPrior->pOrder
16710 42 79 21 3d 30 20 3f 20 22 4f 52 44 45 52 20 42  By!=0 ? "ORDER B
16720 59 22 20 3a 20 22 4c 49 4d 49 54 22 2c 20 73 65  Y" : "LIMIT", se
16730 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
16740 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
16750 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
16760 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
16770 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
16780 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
16790 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20  assert( v!=0 ); 
167a0 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61 6c 72   /* The VDBE alr
167b0 65 61 64 79 20 63 72 65 61 74 65 64 20 62 79 20  eady created by 
167c0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
167d0 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65   */..  /* Create
167e0 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
167f0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
16800 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20   if necessary.  
16810 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44  */.  if( dest.eD
16820 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
16830 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
16840 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
16850 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16860 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
16870 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 53  hemeral, dest.iS
16880 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74  DParm, p->pEList
16890 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 64 65  ->nExpr);.    de
168a0 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54  st.eDest = SRT_T
168b0 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  able;.  }..  /* 
168c0 53 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67  Special handling
168d0 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 2d   for a compound-
168e0 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67  select that orig
168f0 69 6e 61 74 65 73 20 61 73 20 61 20 56 41 4c 55  inates as a VALU
16900 45 53 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a  ES clause..  */.
16910 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
16920 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75  s & SF_MultiValu
16930 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75  e ){.    rc = mu
16940 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28  ltiSelectValues(
16950 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
16960 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  );.    goto mult
16970 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
16980 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
16990 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e  e all SELECTs in
169a0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68   the statement h
169b0 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
169c0 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a  ber of elements.
169d0 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65    ** in their re
169e0 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a  sult sets..  */.
169f0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
16a00 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70  ist && pPrior->p
16a10 45 4c 69 73 74 20 29 3b 0a 20 20 61 73 73 65 72  EList );.  asser
16a20 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  t( p->pEList->nE
16a30 78 70 72 3d 3d 70 50 72 69 6f 72 2d 3e 70 45 4c  xpr==pPrior->pEL
16a40 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 0a 23  ist->nExpr );..#
16a50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16a60 49 54 5f 43 54 45 0a 20 20 69 66 28 20 70 2d 3e  IT_CTE.  if( p->
16a70 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
16a80 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 67  cursive ){.    g
16a90 65 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72  enerateWithRecur
16aa0 73 69 76 65 51 75 65 72 79 28 70 50 61 72 73 65  siveQuery(pParse
16ab0 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d  , p, &dest);.  }
16ac0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  else.#endif..  /
16ad0 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  * Compound SELEC
16ae0 54 73 20 74 68 61 74 20 68 61 76 65 20 61 6e 20  Ts that have an 
16af0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
16b00 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61  are handled sepa
16b10 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69  rately..  */.  i
16b20 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
16b30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c  {.    return mul
16b40 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
16b50 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74  pParse, p, pDest
16b60 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 23 69 66  );.  }else{..#if
16b70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16b80 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20 69 66 28  _EXPLAIN.    if(
16b90 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d   pPrior->pPrior=
16ba0 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 6c  =0 ){.      Expl
16bb0 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
16bc0 61 72 73 65 2c 20 31 2c 20 22 43 4f 4d 50 4f 55  arse, 1, "COMPOU
16bd0 4e 44 20 51 55 45 52 59 22 29 29 3b 0a 20 20 20  ND QUERY"));.   
16be0 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50     ExplainQueryP
16bf0 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20  lan((pParse, 1, 
16c00 22 4c 45 46 54 2d 4d 4f 53 54 20 53 55 42 51 55  "LEFT-MOST SUBQU
16c10 45 52 59 22 29 29 3b 0a 20 20 20 20 7d 0a 23 65  ERY"));.    }.#e
16c20 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 47 65 6e  ndif..    /* Gen
16c30 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
16c40 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
16c50 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
16c60 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nts..    */.    
16c70 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
16c80 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 41  .      case TK_A
16c90 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e  LL: {.        in
16ca0 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  t addr = 0;.    
16cb0 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a      int nLimit;.
16cc0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16cd0 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20  !pPrior->pLimit 
16ce0 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f  );.        pPrio
16cf0 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69  r->iLimit = p->i
16d00 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70  Limit;.        p
16d10 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 20 3d  Prior->iOffset =
16d20 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20   p->iOffset;.   
16d30 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69       pPrior->pLi
16d40 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
16d50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
16d60 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
16d70 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73  se, pPrior, &des
16d80 74 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  t);.        p->p
16d90 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
16da0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
16db0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
16dc0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
16dd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16de0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
16df0 20 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74         p->iLimit
16e00 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69   = pPrior->iLimi
16e10 74 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f  t;.        p->iO
16e20 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e  ffset = pPrior->
16e30 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  iOffset;.       
16e40 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
16e50 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 72  {.          addr
16e60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
16e70 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
16e80 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56 64  , p->iLimit); Vd
16e90 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
16ea0 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d           VdbeCom
16eb0 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61  ment((v, "Jump a
16ec0 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65  head if LIMIT re
16ed0 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ached"));.      
16ee0 20 20 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73      if( p->iOffs
16ef0 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  et ){.          
16f00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16f10 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74  Op3(v, OP_Offset
16f20 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20  Limit,.         
16f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f40 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 2c 20       p->iLimit, 
16f50 70 2d 3e 69 4f 66 66 73 65 74 2b 31 2c 20 70 2d  p->iOffset+1, p-
16f60 3e 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  >iOffset);.     
16f70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
16f80 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e  .        Explain
16f90 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
16fa0 65 2c 20 31 2c 20 22 55 4e 49 4f 4e 20 41 4c 4c  e, 1, "UNION ALL
16fb0 22 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  "));.        rc 
16fc0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
16fd0 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
16fe0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
16ff0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
17000 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44  OK );.        pD
17010 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
17020 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50  r;.        p->pP
17030 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
17040 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63         p->nSelec
17050 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  tRow = sqlite3Lo
17060 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65  gEstAdd(p->nSele
17070 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e  ctRow, pPrior->n
17080 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20  SelectRow);.    
17090 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e      if( pPrior->
170a0 70 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 20 20  pLimit.         
170b0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
170c0 49 6e 74 65 67 65 72 28 70 50 72 69 6f 72 2d 3e  Integer(pPrior->
170d0 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 26  pLimit->pLeft, &
170e0 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20 20 20  nLimit).        
170f0 20 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20   && nLimit>0 && 
17100 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20  p->nSelectRow > 
17110 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75  sqlite3LogEst((u
17120 36 34 29 6e 4c 69 6d 69 74 29 20 0a 20 20 20 20  64)nLimit) .    
17130 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
17140 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
17150 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28   sqlite3LogEst((
17160 75 36 34 29 6e 4c 69 6d 69 74 29 3b 0a 20 20 20  u64)nLimit);.   
17170 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
17180 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20  f( addr ){.     
17190 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
171a0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
171b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
171c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
171d0 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54    }.      case T
171e0 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 20 20  K_EXCEPT:.      
171f0 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b  case TK_UNION: {
17200 0a 20 20 20 20 20 20 20 20 69 6e 74 20 75 6e 69  .        int uni
17210 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72  onTab;    /* Cur
17220 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
17230 65 20 74 65 6d 70 20 74 61 62 6c 65 20 68 6f 6c  e temp table hol
17240 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20  ding result */. 
17250 20 20 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30         u8 op = 0
17260 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  ;       /* One o
17270 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61  f the SRT_ opera
17280 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74  tions to apply t
17290 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20  o self */.      
172a0 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20    int priorOp;  
172b0 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f     /* The SRT_ o
172c0 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c  peration to appl
172d0 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63  y to prior selec
172e0 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78  ts */.        Ex
172f0 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20 2f  pr *pLimit;    /
17300 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f  * Saved values o
17310 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 20 2a 2f 0a  f p->nLimit  */.
17320 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
17330 3b 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  ;.        Select
17340 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a  Dest uniondest;.
17350 20 20 0a 20 20 20 20 20 20 20 20 74 65 73 74 63    .        testc
17360 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45  ase( p->op==TK_E
17370 58 43 45 50 54 20 29 3b 0a 20 20 20 20 20 20 20  XCEPT );.       
17380 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70   testcase( p->op
17390 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
173a0 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20        priorOp = 
173b0 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20  SRT_Union;.     
173c0 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
173d0 74 3d 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20  t==priorOp ){.  
173e0 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61          /* We ca
173f0 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72  n reuse a tempor
17400 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61  ary table genera
17410 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20  ted by a SELECT 
17420 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 20  to our.         
17430 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20   ** right..     
17440 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
17450 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69    assert( p->pLi
17460 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  mit==0 );      /
17470 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e  * Not allowed on
17480 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e   leftward elemen
17490 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ts */.          
174a0 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e  unionTab = dest.
174b0 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 20  iSDParm;.       
174c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
174d0 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65    /* We will nee
174e0 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20  d to create our 
174f0 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  own temporary ta
17500 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ble to hold the.
17510 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74            ** int
17520 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
17530 73 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  s..          */.
17540 20 20 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54            unionT
17550 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
17560 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 61  b++;.          a
17570 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
17580 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  By==0 );.       
17590 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
175a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
175b0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
175c0 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
175d0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
175e0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
175f0 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [0] == -1 );.   
17600 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70         p->addrOp
17610 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72  enEphm[0] = addr
17620 3b 0a 20 20 20 20 20 20 20 20 20 20 66 69 6e 64  ;.          find
17630 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65  Rightmost(p)->se
17640 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
17650 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  sEphemeral;.    
17660 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
17670 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
17680 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
17690 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
176a0 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  CT statements to
176b0 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20   our left.      
176c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
176d0 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f  ert( !pPrior->pO
176e0 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20  rderBy );.      
176f0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
17700 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65  estInit(&unionde
17710 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69  st, priorOp, uni
17720 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20  onTab);.        
17730 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
17740 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
17750 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a  r, &uniondest);.
17760 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
17770 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
17780 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
17790 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a  d;.        }.  .
177a0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20          /* Code 
177b0 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
177c0 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  CT statement.   
177d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
177e0 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  if( p->op==TK_EX
177f0 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  CEPT ){.        
17800 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70    op = SRT_Excep
17810 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  t;.        }else
17820 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
17830 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  rt( p->op==TK_UN
17840 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ION );.         
17850 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b   op = SRT_Union;
17860 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17870 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
17880 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 6d 69 74  ;.        pLimit
17890 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
178a0 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
178b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 6e 69  = 0;.        uni
178c0 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f  ondest.eDest = o
178d0 70 3b 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61  p;.        Expla
178e0 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
178f0 72 73 65 2c 20 31 2c 20 22 25 73 20 55 53 49 4e  rse, 1, "%s USIN
17900 47 20 54 45 4d 50 20 42 2d 54 52 45 45 22 2c 0a  G TEMP B-TREE",.
17910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17920 20 20 20 20 20 20 20 20 20 20 73 65 6c 65 63 74            select
17930 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 29 3b  OpName(p->op)));
17940 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
17950 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
17960 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73  se, p, &uniondes
17970 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  t);.        test
17980 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
17990 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 2f  _OK );.        /
179a0 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69  * Query flatteni
179b0 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c  ng in sqlite3Sel
179c0 65 63 74 28 29 20 6d 69 67 68 74 20 72 65 66 69  ect() might refi
179d0 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a  ll p->pOrderBy..
179e0 20 20 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75          ** Be su
179f0 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e  re to delete p->
17a00 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65 66  pOrderBy, theref
17a10 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20  ore, to avoid a 
17a20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a  memory leak. */.
17a30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
17a40 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
17a50 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
17a60 20 20 20 20 20 20 20 20 70 44 65 6c 65 74 65 20          pDelete 
17a70 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
17a80 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
17a90 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20   pPrior;.       
17aa0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
17ab0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
17ac0 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b  >op==TK_UNION ){
17ad0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 53  .          p->nS
17ae0 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
17af0 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e  e3LogEstAdd(p->n
17b00 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f  SelectRow, pPrio
17b10 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a  r->nSelectRow);.
17b20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17b30 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
17b40 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
17b50 74 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  t);.        p->p
17b60 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
17b70 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69          p->iLimi
17b80 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  t = 0;.        p
17b90 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->iOffset = 0;. 
17ba0 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e   .        /* Con
17bb0 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e  vert the data in
17bc0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
17bd0 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76  able into whatev
17be0 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 20 20  er form.        
17bf0 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65  ** it is that we
17c00 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e   currently need.
17c10 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
17c20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 6f      assert( unio
17c30 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53 44 50 61  nTab==dest.iSDPa
17c40 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74  rm || dest.eDest
17c50 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20  !=priorOp );.   
17c60 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
17c70 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a  est!=priorOp ){.
17c80 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 43            int iC
17c90 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
17ca0 61 72 74 3b 0a 20 20 20 20 20 20 20 20 20 20 61  art;.          a
17cb0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
17cc0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 42   );.          iB
17cd0 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
17ce0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
17cf0 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20            iCont 
17d00 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
17d10 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
17d20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
17d30 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
17d40 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20  e, p, iBreak);. 
17d50 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17d60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17d70 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61  _Rewind, unionTa
17d80 62 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65  b, iBreak); Vdbe
17d90 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
17da0 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
17db0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
17dc0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
17dd0 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
17de0 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
17df0 75 6e 69 6f 6e 54 61 62 2c 0a 20 20 20 20 20 20  unionTab,.      
17e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e10 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c      0, 0, &dest,
17e20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b   iCont, iBreak);
17e30 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
17e40 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
17e50 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
17e60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
17e70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17e80 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  Next, unionTab, 
17e90 69 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76  iStart); VdbeCov
17ea0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
17eb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
17ec0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
17ed0 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
17ee0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17ef0 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
17f00 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
17f10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17f20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
17f30 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61        default: a
17f40 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b  ssert( p->op==TK
17f50 5f 49 4e 54 45 52 53 45 43 54 20 29 3b 20 7b 0a  _INTERSECT ); {.
17f60 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62 31          int tab1
17f70 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 20 20  , tab2;.        
17f80 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
17f90 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
17fa0 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b     Expr *pLimit;
17fb0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
17fc0 72 3b 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63  r;.        Selec
17fd0 74 44 65 73 74 20 69 6e 74 65 72 73 65 63 74 64  tDest intersectd
17fe0 65 73 74 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  est;.        int
17ff0 20 72 31 3b 0a 20 20 0a 20 20 20 20 20 20 20 20   r1;.  .        
18000 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20  /* INTERSECT is 
18010 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
18020 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20  he others since 
18030 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  it requires.    
18040 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f      ** two tempo
18050 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65  rary tables.  He
18060 6e 63 65 20 69 74 20 68 61 73 20 69 74 73 20 6f  nce it has its o
18070 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a  wn case.  Begin.
18080 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c          ** by al
18090 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62  locating the tab
180a0 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  les we will need
180b0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
180c0 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61 72       tab1 = pPar
180d0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
180e0 20 20 20 20 74 61 62 32 20 3d 20 70 50 61 72 73      tab2 = pPars
180f0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
18100 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
18110 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 0a  rderBy==0 );.  .
18120 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73          addr = s
18130 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18140 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
18150 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a  eral, tab1, 0);.
18160 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
18170 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
18180 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  0] == -1 );.    
18190 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
181a0 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[0] = addr;. 
181b0 20 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74         findRight
181c0 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67  most(p)->selFlag
181d0 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
181e0 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61  meral;.        a
181f0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
18200 20 29 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 2f   );.  .        /
18210 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43  * Code the SELEC
18220 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69  Ts to our left i
18230 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  nto temporary ta
18240 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20  ble "tab1"..    
18250 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
18260 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
18270 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63 74 64  Init(&intersectd
18280 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  est, SRT_Union, 
18290 74 61 62 31 29 3b 0a 20 20 20 20 20 20 20 20 72  tab1);.        r
182a0 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
182b0 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
182c0 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  , &intersectdest
182d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
182e0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
182f0 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
18300 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
18310 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f    .        /* Co
18320 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
18330 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f  ELECT into tempo
18340 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32  rary table "tab2
18350 22 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ".        */.   
18360 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
18370 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18380 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
18390 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  l, tab2, 0);.   
183a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
183b0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
183c0 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  == -1 );.       
183d0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
183e0 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [1] = addr;.    
183f0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
18400 30 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 6d 69  0;.        pLimi
18410 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
18420 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74         p->pLimit
18430 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
18440 74 65 72 73 65 63 74 64 65 73 74 2e 69 53 44 50  tersectdest.iSDP
18450 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20 20  arm = tab2;.    
18460 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79      ExplainQuery
18470 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c  Plan((pParse, 1,
18480 20 22 25 73 20 55 53 49 4e 47 20 54 45 4d 50 20   "%s USING TEMP 
18490 42 2d 54 52 45 45 22 2c 0a 20 20 20 20 20 20 20  B-TREE",.       
184a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184b0 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28     selectOpName(
184c0 70 2d 3e 6f 70 29 29 29 3b 0a 20 20 20 20 20 20  p->op)));.      
184d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
184e0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
184f0 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b  &intersectdest);
18500 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
18510 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
18520 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 6c   );.        pDel
18530 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ete = p->pPrior;
18540 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69  .        p->pPri
18550 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
18560 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c       if( p->nSel
18570 65 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e  ectRow>pPrior->n
18580 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20 20  SelectRow ){.   
18590 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63         p->nSelec
185a0 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e  tRow = pPrior->n
185b0 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
185c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
185d0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
185e0 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
185f0 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74         p->pLimit
18600 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 0a 20 20   = pLimit;.  .  
18610 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
18620 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74  e code to take t
18630 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20  he intersection 
18640 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f  of the two tempo
18650 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  rary.        ** 
18660 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20  tables..        
18670 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
18680 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
18690 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d          iBreak =
186a0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
186b0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
186c0 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = sqlite
186d0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
186e0 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75  );.        compu
186f0 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
18700 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65  (pParse, p, iBre
18710 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
18720 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18730 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62  , OP_Rewind, tab
18740 31 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65  1, iBreak); Vdbe
18750 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
18760 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
18770 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
18780 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74  se);.        iSt
18790 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
187a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
187b0 77 44 61 74 61 2c 20 74 61 62 31 2c 20 72 31 29  wData, tab1, r1)
187c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
187d0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
187e0 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74  , OP_NotFound, t
187f0 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20  ab2, iCont, r1, 
18800 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  0);.        Vdbe
18810 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
18820 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
18830 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
18840 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  e, r1);.        
18850 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
18860 70 50 61 72 73 65 2c 20 70 2c 20 74 61 62 31 2c  pParse, p, tab1,
18870 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18880 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26           0, 0, &
18890 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72  dest, iCont, iBr
188a0 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
188b0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
188c0 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b  Label(v, iCont);
188d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
188e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
188f0 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74  _Next, tab1, iSt
18900 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  art); VdbeCovera
18910 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
18920 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
18930 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
18940 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
18950 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18960 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20  OP_Close, tab2, 
18970 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
18980 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18990 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c   OP_Close, tab1,
189a0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   0);.        bre
189b0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
189c0 7d 0a 20 20 0a 20 20 23 69 66 6e 64 65 66 20 53  }.  .  #ifndef S
189d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
189e0 49 4e 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4e  IN.    if( p->pN
189f0 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ext==0 ){.      
18a00 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
18a10 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
18a20 20 7d 0a 20 20 23 65 6e 64 69 66 0a 20 20 7d 0a   }.  #endif.  }.
18a30 20 20 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20    .  /* Compute 
18a40 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
18a50 63 65 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a  ces used by .  *
18a60 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  * temporary tabl
18a70 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70  es needed to imp
18a80 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f  lement the compo
18a90 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a  und select..  **
18aa0 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49   Attach the KeyI
18ab0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f  nfo structure to
18ac0 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74   all temporary t
18ad0 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ables..  **.  **
18ae0 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73   This section is
18af0 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67 68   run by the righ
18b00 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
18b10 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20  atement only..  
18b20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
18b30 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ents to the left
18b40 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69   always skip thi
18b50 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69 67  s part.  The rig
18b60 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c  ht-most.  ** SEL
18b70 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73  ECT might also s
18b80 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69 66  kip this part if
18b90 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52   it has no ORDER
18ba0 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20   BY clause and. 
18bb0 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c   ** no temp tabl
18bc0 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e  es are required.
18bd0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
18be0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65  elFlags & SF_Use
18bf0 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20  sEphemeral ){.  
18c00 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
18c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
18c30 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  */.    KeyInfo *
18c40 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20  pKeyInfo;       
18c50 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e       /* Collatin
18c60 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
18c70 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
18c80 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f  .    Select *pLo
18c90 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
18ca0 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
18cb0 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54  g through SELECT
18cc0 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20   statements */. 
18cd0 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43     CollSeq **apC
18ce0 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
18cf0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
18d00 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f  through pKeyInfo
18d10 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20  ->aColl[] */.   
18d20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
18d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18d40 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
18d50 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65  mns in result se
18d60 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  t */..    assert
18d70 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b  ( p->pNext==0 );
18d80 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70  .    nCol = p->p
18d90 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
18da0 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
18db0 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
18dc0 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20  (db, nCol, 1);. 
18dd0 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f     if( !pKeyInfo
18de0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
18df0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
18e00 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c  ;.      goto mul
18e10 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
18e20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
18e30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66  , apColl=pKeyInf
18e40 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c  o->aColl; i<nCol
18e50 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29  ; i++, apColl++)
18e60 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20  {.      *apColl 
18e70 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
18e80 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20  lSeq(pParse, p, 
18e90 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  i);.      if( 0=
18ea0 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  =*apColl ){.    
18eb0 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62      *apColl = db
18ec0 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
18ed0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
18ee0 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f  for(pLoop=p; pLo
18ef0 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
18f00 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20  >pPrior){.      
18f10 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b  for(i=0; i<2; i+
18f20 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
18f30 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64  addr = pLoop->ad
18f40 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20  drOpenEphm[i];. 
18f50 20 20 20 20 20 20 20 69 66 28 20 61 64 64 72 3c         if( addr<
18f60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
18f70 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73  * If [0] is unus
18f80 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61  ed then [1] is a
18f90 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20  lso unused.  So 
18fa0 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20  we can.         
18fb0 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c   ** always safel
18fc0 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20  y abort as soon 
18fd0 61 73 20 74 68 65 20 66 69 72 73 74 20 75 6e 75  as the first unu
18fe0 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e  sed slot is foun
18ff0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  d */.          a
19000 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64  ssert( pLoop->ad
19010 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20  drOpenEphm[1]<0 
19020 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
19030 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
19040 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19050 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
19060 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  r, nCol);.      
19070 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
19080 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28  ngeP4(v, addr, (
19090 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79  char*)sqlite3Key
190a0 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f  InfoRef(pKeyInfo
190b0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
190c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
190d0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
190e0 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f      pLoop->addrO
190f0 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b  penEphm[i] = -1;
19100 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19110 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66     sqlite3KeyInf
19120 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29  oUnref(pKeyInfo)
19130 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c  ;.  }..multi_sel
19140 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74  ect_end:.  pDest
19150 2d 3e 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69  ->iSdst = dest.i
19160 53 64 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 6e  Sdst;.  pDest->n
19170 53 64 73 74 20 3d 20 64 65 73 74 2e 6e 53 64 73  Sdst = dest.nSds
19180 74 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  t;.  sqlite3Sele
19190 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65  ctDelete(db, pDe
191a0 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  lete);.  return 
191b0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
191c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
191d0 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
191e0 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d 65 73 73  /*.** Error mess
191f0 61 67 65 20 66 6f 72 20 77 68 65 6e 20 74 77 6f  age for when two
19200 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f   or more terms o
19210 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  f a compound sel
19220 65 63 74 20 68 61 76 65 20 64 69 66 66 65 72 65  ect have differe
19230 6e 74 0a 2a 2a 20 73 69 7a 65 20 72 65 73 75 6c  nt.** size resul
19240 74 20 73 65 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20  t sets..*/.void 
19250 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 72 6f  sqlite3SelectWro
19260 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72 28  ngNumTermsError(
19270 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
19280 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28  elect *p){.  if(
19290 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
192a0 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20 20 20  F_Values ){.    
192b0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
192c0 70 50 61 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c  pParse, "all VAL
192d0 55 45 53 20 6d 75 73 74 20 68 61 76 65 20 74 68  UES must have th
192e0 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
192f0 20 74 65 72 6d 73 22 29 3b 0a 20 20 7d 65 6c 73   terms");.  }els
19300 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  e{.    sqlite3Er
19310 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
19320 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c  SELECTs to the l
19330 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66  eft and right of
19340 20 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20   %s".      " do 
19350 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  not have the sam
19360 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
19370 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c  lt columns", sel
19380 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
19390 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
193a0 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74 20 73  Code an output s
193b0 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20  ubroutine for a 
193c0 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  coroutine implem
193d0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a  entation of a.**
193e0 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65 6e 74   SELECT statment
193f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61  ..**.** The data
19400 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20 69 73   to be output is
19410 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70 49   contained in pI
19420 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 72 65  n->iSdst.  There
19430 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64   are.** pIn->nSd
19440 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  st columns to be
19450 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73 74 20   output.  pDest 
19460 69 73 20 77 68 65 72 65 20 74 68 65 20 6f 75 74  is where the out
19470 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  put should.** be
19480 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67   sent..**.** reg
19490 52 65 74 75 72 6e 20 69 73 20 74 68 65 20 6e 75  Return is the nu
194a0 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65 67 69  mber of the regi
194b0 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65  ster holding the
194c0 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72   subroutine.** r
194d0 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a  eturn address..*
194e0 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65 76 3e  *.** If regPrev>
194f0 30 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  0 then it is the
19500 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
19510 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68 61 74  in a vector that
19520 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20  .** records the 
19530 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e  previous output.
19540 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20 69    mem[regPrev] i
19550 73 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 73  s a flag that is
19560 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65   false.** if the
19570 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 70  re has been no p
19580 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20  revious output. 
19590 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68   If regPrev>0 th
195a0 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65  en code is.** ge
195b0 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70 70 72  nerated to suppr
195c0 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 2e 20  ess duplicates. 
195d0 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75 73 65   pKeyInfo is use
195e0 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a  d for comparing.
195f0 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49  ** keys..**.** I
19600 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e  f the LIMIT foun
19610 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69  d in p->iLimit i
19620 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d 70 20  s reached, jump 
19630 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a  immediately to.*
19640 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61  * iBreak..*/.sta
19650 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61 74 65  tic int generate
19660 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65  OutputSubroutine
19670 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
19680 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
19690 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
196a0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
196b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
196c0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
196d0 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ent */.  SelectD
196e0 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20  est *pIn,       
196f0 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73 75   /* Coroutine su
19700 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a  pplying data */.
19710 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
19720 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57 68 65  est,      /* Whe
19730 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65 20 64  re to send the d
19740 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ata */.  int reg
19750 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20 20 20  Return,         
19760 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 61   /* The return a
19770 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
19780 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76  */.  int regPrev
19790 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
197a0 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c 74 20  Previous result 
197b0 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e  register.  No un
197c0 69 71 75 65 6e 65 73 73 20 69 66 20 30 20 2a 2f  iqueness if 0 */
197d0 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
197e0 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f  Info,      /* Fo
197f0 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69 74 68  r comparing with
19800 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
19810 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20  */.  int iBreak 
19820 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19830 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77 65 20  Jump here if we 
19840 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20 2a 2f  hit the LIMIT */
19850 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
19860 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
19870 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 0a   int iContinue;.
19880 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 61    int addr;..  a
19890 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
198a0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
198b0 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73  .  iContinue = s
198c0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
198d0 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 75  bel(v);..  /* Su
198e0 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65  ppress duplicate
198f0 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58 43  s for UNION, EXC
19900 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45  EPT, and INTERSE
19910 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  CT .  */.  if( r
19920 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20 69 6e  egPrev ){.    in
19930 74 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a  t addr1, addr2;.
19940 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
19950 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
19960 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72   OP_IfNot, regPr
19970 65 76 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ev); VdbeCoverag
19980 65 28 76 29 3b 0a 20 20 20 20 61 64 64 72 32 20  e(v);.    addr2 
19990 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
199a0 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op4(v, OP_Compar
199b0 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72  e, pIn->iSdst, r
199c0 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e  egPrev+1, pIn->n
199d0 53 64 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Sdst,.          
199e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199f0 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74      (char*)sqlit
19a00 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65  e3KeyInfoRef(pKe
19a10 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e  yInfo), P4_KEYIN
19a20 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  FO);.    sqlite3
19a30 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
19a40 5f 4a 75 6d 70 2c 20 61 64 64 72 32 2b 32 2c 20  _Jump, addr2+2, 
19a50 69 43 6f 6e 74 69 6e 75 65 2c 20 61 64 64 72 32  iContinue, addr2
19a60 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +2); VdbeCoverag
19a70 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
19a80 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
19a90 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c   addr1);.    sql
19aa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
19ab0 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e  , OP_Copy, pIn->
19ac0 69 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31  iSdst, regPrev+1
19ad0 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b  , pIn->nSdst-1);
19ae0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19af0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
19b00 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72 65 76  eger, 1, regPrev
19b10 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
19b20 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
19b30 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30  ailed ) return 0
19b40 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73  ;..  /* Suppress
19b50 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45   the first OFFSE
19b60 54 20 65 6e 74 72 69 65 73 20 69 66 20 74 68 65  T entries if the
19b70 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20  re is an OFFSET 
19b80 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f  clause.  */.  co
19b90 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
19ba0 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75  Offset, iContinu
19bb0 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  e);..  assert( p
19bc0 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
19bd0 5f 45 78 69 73 74 73 20 29 3b 0a 20 20 61 73 73  _Exists );.  ass
19be0 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73  ert( pDest->eDes
19bf0 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a  t!=SRT_Table );.
19c00 20 20 73 77 69 74 63 68 28 20 70 44 65 73 74 2d    switch( pDest-
19c10 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a  >eDest ){.    /*
19c20 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
19c30 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20  t as data using 
19c40 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20  a unique key..  
19c50 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
19c60 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20  T_EphemTab: {.  
19c70 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
19c80 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
19c90 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e  Parse);.      in
19ca0 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65  t r2 = sqlite3Ge
19cb0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
19cc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
19cd0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
19ce0 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d  MakeRecord, pIn-
19cf0 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
19d00 73 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  st, r1);.      s
19d10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19d20 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
19d30 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c   pDest->iSDParm,
19d40 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r2);.      sqli
19d50 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
19d60 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73   OP_Insert, pDes
19d70 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 20  t->iSDParm, r1, 
19d80 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r2);.      sqlit
19d90 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
19da0 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
19db0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
19dc0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
19dd0 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  arse, r2);.     
19de0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
19df0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
19e00 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
19e10 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
19e20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
19e30 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77  UERY.    /* If w
19e40 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61  e are creating a
19e50 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70   set for an "exp
19e60 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
19e70 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  )"..    */.    c
19e80 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
19e90 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20       int r1;.   
19ea0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49 6e     testcase( pIn
19eb0 2d 3e 6e 53 64 73 74 3e 31 20 29 3b 0a 20 20 20  ->nSdst>1 );.   
19ec0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
19ed0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
19ee0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19ef0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
19f00 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e  _MakeRecord, pIn
19f10 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
19f20 64 73 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  dst, .          
19f30 72 31 2c 20 70 44 65 73 74 2d 3e 7a 41 66 66 53  r1, pDest->zAffS
19f40 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
19f50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
19f60 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
19f70 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44  OP_IdxInsert, pD
19f80 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31  est->iSDParm, r1
19f90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
19fb0 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
19fc0 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dst);.      sqli
19fd0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
19fe0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
19ff0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a000 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
1a010 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65  s is a scalar se
1a020 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72  lect that is par
1a030 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
1a040 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
1a050 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
1a060 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72  s in the appropr
1a070 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iate memory cell
1a080 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20   and break out. 
1a090 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61     ** of the sca
1a0a0 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
1a0b0 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
1a0c0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1a0d0 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c   pIn->nSdst==1 |
1a0e0 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  | pParse->nErr>0
1a0f0 20 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 70   );  testcase( p
1a100 49 6e 2d 3e 6e 53 64 73 74 21 3d 31 20 29 3b 0a  In->nSdst!=1 );.
1a110 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a120 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
1a130 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44  , pIn->iSdst, pD
1a140 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29  est->iSDParm, 1)
1a150 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;.      /* The L
1a160 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
1a170 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65   jump out of the
1a180 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
1a190 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a1a0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   }.#endif /* #if
1a1b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a1c0 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20  _SUBQUERY */..  
1a1d0 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 73    /* The results
1a1e0 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61   are stored in a
1a1f0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67   sequence of reg
1a200 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74  isters.    ** st
1a210 61 72 74 69 6e 67 20 61 74 20 70 44 65 73 74 2d  arting at pDest-
1a220 3e 69 53 64 73 74 2e 20 20 54 68 65 6e 20 74 68  >iSdst.  Then th
1a230 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65  e co-routine yie
1a240 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lds..    */.    
1a250 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69  case SRT_Corouti
1a260 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ne: {.      if( 
1a270 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20  pDest->iSdst==0 
1a280 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74  ){.        pDest
1a290 2d 3e 69 53 64 73 74 20 3d 20 73 71 6c 69 74 65  ->iSdst = sqlite
1a2a0 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
1a2b0 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  arse, pIn->nSdst
1a2c0 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74  );.        pDest
1a2d0 2d 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e  ->nSdst = pIn->n
1a2e0 53 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Sdst;.      }.  
1a2f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1a300 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
1a310 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73  pIn->iSdst, pDes
1a320 74 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  t->iSdst, pIn->n
1a330 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Sdst);.      sql
1a340 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
1a350 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73  , OP_Yield, pDes
1a360 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  t->iSDParm);.   
1a370 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1a380 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20  .    /* If none 
1a390 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68  of the above, th
1a3a0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64 65  en the result de
1a3b0 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62  stination must b
1a3c0 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74  e.    ** SRT_Out
1a3d0 70 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69  put.  This routi
1a3e0 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
1a3f0 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65  ed with any othe
1a400 72 0a 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61  r.    ** destina
1a410 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  tion other than 
1a420 74 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64  the ones handled
1a430 20 61 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75   above or SRT_Ou
1a440 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  tput..    **.   
1a450 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74 70   ** For SRT_Outp
1a460 75 74 2c 20 72 65 73 75 6c 74 73 20 61 72 65 20  ut, results are 
1a470 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75  stored in a sequ
1a480 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
1a490 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e  s.  .    ** Then
1a4a0 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f   the OP_ResultRo
1a4b0 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64  w opcode is used
1a4c0 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65   to cause sqlite
1a4d0 33 5f 73 74 65 70 28 29 20 74 6f 0a 20 20 20 20  3_step() to.    
1a4e0 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65  ** return the ne
1a4f0 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74  xt row of result
1a500 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
1a510 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
1a520 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65  sert( pDest->eDe
1a530 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
1a540 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1a550 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a560 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e  ResultRow, pIn->
1a570 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
1a580 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
1a590 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1a5a0 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64   Jump to the end
1a5b0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20   of the loop if 
1a5c0 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61  the LIMIT is rea
1a5d0 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ched..  */.  if(
1a5e0 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20   p->iLimit ){.  
1a5f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a600 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75  Op2(v, OP_DecrJu
1a610 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69  mpZero, p->iLimi
1a620 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65  t, iBreak); Vdbe
1a630 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
1a640 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1a650 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72  the subroutine r
1a660 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c  eturn.  */.  sql
1a670 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1a680 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75  abel(v, iContinu
1a690 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
1a6a0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
1a6b0 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e 29  turn, regReturn)
1a6c0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  ;..  return addr
1a6d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72  ;.}../*.** Alter
1a6e0 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20  native compound 
1a6f0 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e 65  select code gene
1a700 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73 20  rator for cases 
1a710 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73  when there.** is
1a720 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
1a730 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73  use..**.** We as
1a740 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66 20  sume a query of 
1a750 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f  the following fo
1a760 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c  rm:.**.**      <
1a770 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72 61  selectA>  <opera
1a780 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20  tor>  <selectB> 
1a790 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65 72   ORDER BY <order
1a7a0 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f  bylist>.**.** <o
1a7b0 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20  perator> is one 
1a7c0 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e  of UNION ALL, UN
1a7d0 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20  ION, EXCEPT, or 
1a7e0 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65 20  INTERSECT.  The 
1a7f0 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f  idea.** is to co
1a800 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74 41  de both <selectA
1a810 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20  > and <selectB> 
1a820 77 69 74 68 20 74 68 65 20 4f 52 44 45 52 20 42  with the ORDER B
1a830 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63  Y clause as.** c
1a840 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68 65  o-routines.  The
1a850 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75  n run the co-rou
1a860 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c 65  tines in paralle
1a870 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20  l and merge the 
1a880 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20  results.** into 
1a890 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e 20  the output.  In 
1a8a0 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20  addition to the 
1a8b0 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 28  two coroutines (
1a8c0 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20 61  called selectA a
1a8d0 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20 74  nd.** selectB) t
1a8e0 68 65 72 65 20 61 72 65 20 37 20 73 75 62 72 6f  here are 7 subro
1a8f0 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  utines:.**.**   
1a900 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20 74   outA:    Move t
1a910 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65  he output of the
1a920 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74 69   selectA corouti
1a930 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ne into the outp
1a940 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
1a950 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e    of the compoun
1a960 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  d query..**.**  
1a970 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65 20    outB:    Move 
1a980 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68  the output of th
1a990 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75 74  e selectB corout
1a9a0 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ine into the out
1a9b0 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  put.**          
1a9c0 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75     of the compou
1a9d0 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79  nd query.  (Only
1a9e0 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 55   generated for U
1a9f0 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20  NION and.**     
1aa00 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
1aa10 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20 49  L.  EXCEPT and I
1aa20 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65 72 20  NSERTSECT never 
1aa30 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74 68 61  output a row tha
1aa40 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1aa50 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e   appears only in
1aa60 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c   B.).**.**    Al
1aa70 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  tB:    Called wh
1aa80 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61  en there is data
1aa90 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75   from both corou
1aaa0 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a  tines and A<B..*
1aab0 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20 20  *.**    AeqB:   
1aac0 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
1aad0 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
1aae0 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
1aaf0 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20  and A==B..**.** 
1ab00 20 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c 6c     AgtB:    Call
1ab10 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
1ab20 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20   data from both 
1ab30 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41  coroutines and A
1ab40 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66  >B..**.**    Eof
1ab50 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  A:    Called whe
1ab60 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73  n data is exhaus
1ab70 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 41  ted from selectA
1ab80 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a  ..**.**    EofB:
1ab90 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
1aba0 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65  data is exhauste
1abb0 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a  d from selectB..
1abc0 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  **.** The implem
1abd0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
1abe0 6c 61 74 74 65 72 20 66 69 76 65 20 73 75 62 72  latter five subr
1abf0 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20 6f  outines depend o
1ac00 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65  n which .** <ope
1ac10 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a  rator> is used:.
1ac20 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  **.**.**        
1ac30 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20       UNION ALL  
1ac40 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20 20         UNION    
1ac50 20 20 20 20 20 20 20 20 45 58 43 45 50 54 20 20          EXCEPT  
1ac60 20 20 20 20 20 20 20 20 49 4e 54 45 52 53 45 43          INTERSEC
1ac70 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d  T.**          --
1ac80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d  -----------  ---
1ac90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
1aca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
1acb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1acc0 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f  -.**   AltB:   o
1acd0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
1ace0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
1acf0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
1ad00 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a        nextA.**.*
1ad10 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74 41  *   AeqB:   outA
1ad20 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
1ad30 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 20 20  nextA           
1ad40 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20    nextA         
1ad50 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a  outA, nextA.**.*
1ad60 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74 42  *   AgtB:   outB
1ad70 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74  , nextB      out
1ad80 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20  B, nextB        
1ad90 20 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20    nextB         
1ada0 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20     nextB.**.**  
1adb0 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e   EofA:   outB, n
1adc0 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20  extB      outB, 
1add0 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20 68  nextB          h
1ade0 61 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20  alt             
1adf0 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66  halt.**.**   Eof
1ae00 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41  B:   outA, nextA
1ae10 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
1ae20 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  A       outA, ne
1ae30 78 74 41 20 20 20 20 20 20 20 20 20 68 61 6c 74  xtA         halt
1ae40 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c  .**.** In the Al
1ae50 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41 67  tB, AeqB, and Ag
1ae60 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c 20  tB subroutines, 
1ae70 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c  an EOF on A foll
1ae80 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63  owing nextA.** c
1ae90 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69 61  auses an immedia
1aea0 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20  te jump to EofA 
1aeb0 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20  and an EOF on B 
1aec0 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20  following nextB 
1aed0 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d  causes.** an imm
1aee0 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45  ediate jump to E
1aef0 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f 66  ofB.  Within Eof
1af00 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20  A and EofB, and 
1af10 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a  EOF on entry or.
1af20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78  ** following nex
1af30 74 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d 70  tX causes a jump
1af40 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
1af50 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65 73  he select proces
1af60 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c  sing..**.** Dupl
1af70 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e  icate removal in
1af80 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45   the UNION, EXCE
1af90 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43  PT, and INTERSEC
1afa0 54 20 63 61 73 65 73 20 69 73 20 68 61 6e 64 6c  T cases is handl
1afb0 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ed.** within the
1afc0 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
1afd0 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72 65 76  ne.  The regPrev
1afe0 20 72 65 67 69 73 74 65 72 20 73 65 74 20 68 6f   register set ho
1aff0 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  lds the previous
1b000 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c  ly.** output val
1b010 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73 6f  ue.  A compariso
1b020 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e 73  n is made agains
1b030 74 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e 64  t this value and
1b040 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69   the output.** i
1b050 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65  s skipped if the
1b060 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77 6f   next results wo
1b070 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65 20  uld be the same 
1b080 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e  as the previous.
1b090 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  .**.** The imple
1b0a0 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69  mentation plan i
1b0b0 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  s to implement t
1b0c0 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65  he two coroutine
1b0d0 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73  s and seven.** s
1b0e0 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73 74  ubroutines first
1b0f0 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65 20 63  , then put the c
1b100 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20  ontrol logic at 
1b110 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b  the bottom.  Lik
1b120 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
1b130 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69 74         goto Init
1b140 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f 72  .**     coA: cor
1b150 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20  outine for left 
1b160 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20 20  query (A).**    
1b170 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20   coB: coroutine 
1b180 66 6f 72 20 72 69 67 68 74 20 71 75 65 72 79 20  for right query 
1b190 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20  (B).**    outA: 
1b1a0 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f  output one row o
1b1b0 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20  f A.**    outB: 
1b1c0 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f  output one row o
1b1d0 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55  f B (UNION and U
1b1e0 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a  NION ALL only).*
1b1f0 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a  *    EofA: ....*
1b200 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a  *    EofB: ....*
1b210 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a  *    AltB: ....*
1b220 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a  *    AeqB: ....*
1b230 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a  *    AgtB: ....*
1b240 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74 69  *    Init: initi
1b250 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20  alize coroutine 
1b260 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20  registers.**    
1b270 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41 0a        yield coA.
1b280 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65  **          if e
1b290 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a  of(A) goto EofA.
1b2a0 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c  **          yiel
1b2b0 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20  d coB.**        
1b2c0 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74 6f    if eof(B) goto
1b2d0 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72   EofB.**    Cmpr
1b2e0 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a  : Compare A, B.*
1b2f0 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20  *          Jump 
1b300 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42  AltB, AeqB, AgtB
1b310 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e  .**     End: ...
1b320 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41  .**.** We call A
1b330 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 2c  ltB, AeqB, AgtB,
1b340 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42 20   EofA, and EofB 
1b350 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62 75  "subroutines" bu
1b360 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a  t they are not.*
1b370 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65  * actually calle
1b380 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61 6e  d using Gosub an
1b390 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52 65  d they do not Re
1b3a0 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20  turn.  EofA and 
1b3b0 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74  EofB loop.** unt
1b3c0 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20 65  il all data is e
1b3d0 78 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a 75  xhausted then ju
1b3e0 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22 20  mp to the "end" 
1b3f0 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65 71  labe.  AltB, Aeq
1b400 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a  B,.** and AgtB j
1b410 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c 32  ump to either L2
1b420 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f   or to one of Eo
1b430 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23  fA or EofB..*/.#
1b440 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b450 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
1b460 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  CT.static int mu
1b470 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
1b480 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1b490 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
1b4a0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1b4b0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
1b4c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
1b4d0 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
1b4e0 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
1b4f0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
1b500 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
1b510 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
1b520 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
1b530 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  ){.  int i, j;  
1b540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1b550 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
1b560 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b   Select *pPrior;
1b570 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65         /* Anothe
1b580 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61  r SELECT immedia
1b590 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74  tely to our left
1b5a0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
1b5b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
1b5c0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1b5d0 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53  this VDBE */.  S
1b5e0 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 41 3b  electDest destA;
1b5f0 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74       /* Destinat
1b600 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e  ion for coroutin
1b610 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  e A */.  SelectD
1b620 65 73 74 20 64 65 73 74 42 3b 20 20 20 20 20 2f  est destB;     /
1b630 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f  * Destination fo
1b640 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f  r coroutine B */
1b650 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 41 3b  .  int regAddrA;
1b660 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1b670 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
1b680 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74   select-A corout
1b690 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
1b6a0 41 64 64 72 42 3b 20 20 20 20 20 20 20 20 20 2f  AddrB;         /
1b6b0 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
1b6c0 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42 20  er for select-B 
1b6d0 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
1b6e0 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b 20  nt addrSelectA; 
1b6f0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1b700 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 20  of the select-A 
1b710 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
1b720 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b 20  nt addrSelectB; 
1b730 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1b740 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 20  of the select-B 
1b750 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
1b760 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20 20  nt regOutA;     
1b770 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1b780 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65  register for the
1b790 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75   output-A subrou
1b7a0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
1b7b0 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20 20  gOutB;          
1b7c0 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
1b7d0 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70  ter for the outp
1b7e0 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-B subroutine 
1b7f0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74  */.  int addrOut
1b800 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
1b810 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74  dress of the out
1b820 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65  put-A subroutine
1b830 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75   */.  int addrOu
1b840 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41  tB = 0;     /* A
1b850 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75  ddress of the ou
1b860 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  tput-B subroutin
1b870 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45  e */.  int addrE
1b880 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ofA;         /* 
1b890 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
1b8a0 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74 65  elect-A-exhauste
1b8b0 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  d subroutine */.
1b8c0 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 5f 6e    int addrEofA_n
1b8d0 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74 65 72  oB;     /* Alter
1b8e0 6e 61 74 65 20 61 64 64 72 45 6f 66 41 20 69 66  nate addrEofA if
1b8f0 20 42 20 69 73 20 75 6e 69 6e 69 74 69 61 6c 69   B is uninitiali
1b900 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  zed */.  int add
1b910 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20 2f  rEofB;         /
1b920 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
1b930 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75 73   select-B-exhaus
1b940 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ted subroutine *
1b950 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74 42  /.  int addrAltB
1b960 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
1b970 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42 20  ress of the A<B 
1b980 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
1b990 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20 20  int addrAeqB;   
1b9a0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1b9b0 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75 62   of the A==B sub
1b9c0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1b9d0 20 61 64 64 72 41 67 74 42 3b 20 20 20 20 20 20   addrAgtB;      
1b9e0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
1b9f0 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75 74   the A>B subrout
1ba00 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
1ba10 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20 2f  LimitA;        /
1ba20 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72  * Limit register
1ba30 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f   for select-A */
1ba40 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 42  .  int regLimitB
1ba50 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69  ;        /* Limi
1ba60 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  t register for s
1ba70 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74  elect-A */.  int
1ba80 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20   regPrev;       
1ba90 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66     /* A range of
1baa0 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f   registers to ho
1bab0 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70  ld previous outp
1bac0 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65  ut */.  int save
1bad0 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a  dLimit;       /*
1bae0 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20   Saved value of 
1baf0 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69  p->iLimit */.  i
1bb00 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b 20  nt savedOffset; 
1bb10 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61       /* Saved va
1bb20 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65  lue of p->iOffse
1bb30 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c  t */.  int label
1bb40 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  Cmpr;        /* 
1bb50 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73 74  Label for the st
1bb60 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67 65  art of the merge
1bb70 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20   algorithm */.  
1bb80 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20  int labelEnd;   
1bb90 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66        /* Label f
1bba0 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  or the end of th
1bbb0 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43 54  e overall SELECT
1bbc0 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 61   stmt */.  int a
1bbd0 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  ddr1;           
1bbe0 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75 63   /* Jump instruc
1bbf0 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20 72  tions that get r
1bc00 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20 20  etargetted */.  
1bc10 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
1bc20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
1bc30 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e  TK_ALL, TK_UNION
1bc40 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f  , TK_EXCEPT, TK_
1bc50 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b  INTERSECT */.  K
1bc60 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20  eyInfo *pKeyDup 
1bc70 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73  = 0; /* Comparis
1bc80 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  on information f
1bc90 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72 65 6d  or duplicate rem
1bca0 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  oval */.  KeyInf
1bcb0 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20 20  o *pKeyMerge;   
1bcc0 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e  /* Comparison in
1bcd0 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65  formation for me
1bce0 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20  rging rows */.  
1bcf0 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
1bd00 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1bd10 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
1bd20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
1bd30 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f  erBy;   /* The O
1bd40 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
1bd50 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  /.  int nOrderBy
1bd60 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
1bd70 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
1bd80 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1bd90 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50  use */.  int *aP
1bda0 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20 2f  ermute;        /
1bdb0 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f  * Mapping from O
1bdc0 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f  RDER BY terms to
1bdd0 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75   result set colu
1bde0 6d 6e 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  mns */..  assert
1bdf0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30  ( p->pOrderBy!=0
1be00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b   );.  assert( pK
1be10 65 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22  eyDup==0 ); /* "
1be20 4d 61 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65  Managed" code ne
1be30 65 64 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65  eds this.  Ticke
1be40 74 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62  t #3382. */.  db
1be50 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1be60 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
1be70 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  be;.  assert( v!
1be80 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 41  =0 );       /* A
1be90 6c 72 65 61 64 79 20 74 68 72 6f 77 6e 20 74 68  lready thrown th
1bea0 65 20 65 72 72 6f 72 20 69 66 20 56 44 42 45 20  e error if VDBE 
1beb0 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a  alloc failed */.
1bec0 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c    labelEnd = sql
1bed0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1bee0 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70  l(v);.  labelCmp
1bef0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  r = sqlite3VdbeM
1bf00 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20  akeLabel(v);... 
1bf10 20 2f 2a 20 50 61 74 63 68 20 75 70 20 74 68 65   /* Patch up the
1bf20 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1bf30 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e  .  */.  op = p->
1bf40 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f 72 20 3d  op;  .  pPrior =
1bf50 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73   p->pPrior;.  as
1bf60 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f  sert( pPrior->pO
1bf70 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70  rderBy==0 );.  p
1bf80 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
1bf90 64 65 72 42 79 3b 0a 20 20 61 73 73 65 72 74 28  derBy;.  assert(
1bfa0 20 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 6e   pOrderBy );.  n
1bfb0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
1bfc0 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a  By->nExpr;..  /*
1bfd0 20 46 6f 72 20 6f 70 65 72 61 74 6f 72 73 20 6f   For operators o
1bfe0 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20  ther than UNION 
1bff0 41 4c 4c 20 77 65 20 68 61 76 65 20 74 6f 20 6d  ALL we have to m
1c000 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a 20 20  ake sure that.  
1c010 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ** the ORDER BY 
1c020 63 6c 61 75 73 65 20 63 6f 76 65 72 73 20 65 76  clause covers ev
1c030 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ery term of the 
1c040 72 65 73 75 6c 74 20 73 65 74 2e 20 20 41 64 64  result set.  Add
1c050 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74  .  ** terms to t
1c060 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1c070 73 65 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  se as necessary.
1c080 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d  .  */.  if( op!=
1c090 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f  TK_ALL ){.    fo
1c0a0 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f  r(i=1; db->mallo
1c0b0 63 46 61 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c  cFailed==0 && i<
1c0c0 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  =p->pEList->nExp
1c0d0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  r; i++){.      s
1c0e0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
1c0f0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
1c100 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d    for(j=0, pItem
1c110 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c  =pOrderBy->a; j<
1c120 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70  nOrderBy; j++, p
1c130 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
1c140 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
1c150 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e  u.x.iOrderByCol>
1c160 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
1c170 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
1c180 65 72 42 79 43 6f 6c 3d 3d 69 20 29 20 62 72 65  erByCol==i ) bre
1c190 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1c1a0 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42    if( j==nOrderB
1c1b0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  y ){.        Exp
1c1c0 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
1c1d0 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54  3Expr(db, TK_INT
1c1e0 45 47 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20  EGER, 0);.      
1c1f0 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
1c200 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1c210 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
1c220 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
1c230 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20   EP_IntValue;.  
1c240 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56        pNew->u.iV
1c250 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20 20 20  alue = i;.      
1c260 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
1c270 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
1c280 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
1c290 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
1c2a0 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  y, pNew);.      
1c2b0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
1c2c0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f 72   pOrderBy->a[nOr
1c2d0 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69 4f 72  derBy++].u.x.iOr
1c2e0 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29  derByCol = (u16)
1c2f0 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  i;.      }.    }
1c300 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
1c310 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  te the compariso
1c320 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 61 6e  n permutation an
1c330 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74 20 69  d keyinfo that i
1c340 73 20 75 73 65 64 20 77 69 74 68 0a 20 20 2a 2a  s used with.  **
1c350 20 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e   the permutation
1c360 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
1c370 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74 0a 20  ne if the next. 
1c380 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73 75 6c   ** row of resul
1c390 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65  ts comes from se
1c3a0 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63 74 42  lectA or selectB
1c3b0 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78 70 6c  .  Also add expl
1c3c0 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74  icit.  ** collat
1c3d0 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52 44 45  ions to the ORDE
1c3e0 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d  R BY clause term
1c3f0 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74  s so that when t
1c400 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 20 20  he subqueries.  
1c410 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  ** to the right 
1c420 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61 72 65  and the left are
1c430 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68 65 79   evaluated, they
1c440 20 75 73 65 20 74 68 65 20 63 6f 72 72 65 63 74   use the correct
1c450 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e  .  ** collation.
1c460 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65  .  */.  aPermute
1c470 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
1c480 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
1c490 6f 66 28 69 6e 74 29 2a 28 6e 4f 72 64 65 72 42  of(int)*(nOrderB
1c4a0 79 20 2b 20 31 29 29 3b 0a 20 20 69 66 28 20 61  y + 1));.  if( a
1c4b0 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73  Permute ){.    s
1c4c0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
1c4d0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
1c4e0 61 50 65 72 6d 75 74 65 5b 30 5d 20 3d 20 6e 4f  aPermute[0] = nO
1c4f0 72 64 65 72 42 79 3b 0a 20 20 20 20 66 6f 72 28  rderBy;.    for(
1c500 69 3d 31 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65  i=1, pItem=pOrde
1c510 72 42 79 2d 3e 61 3b 20 69 3c 3d 6e 4f 72 64 65  rBy->a; i<=nOrde
1c520 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; i++, pItem+
1c530 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
1c540 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
1c550 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20  derByCol>0 );.  
1c560 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
1c570 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
1c580 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ol<=p->pEList->n
1c590 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 50  Expr );.      aP
1c5a0 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74 65  ermute[i] = pIte
1c5b0 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
1c5c0 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ol - 1;.    }.  
1c5d0 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 6d 75    pKeyMerge = mu
1c5e0 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
1c5f0 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
1c600 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  p, 1);.  }else{.
1c610 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20      pKeyMerge = 
1c620 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  0;.  }..  /* Rea
1c630 74 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20  ttach the ORDER 
1c640 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65  BY clause to the
1c650 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
1c660 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
1c670 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d  derBy;.  pPrior-
1c680 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
1c690 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
1c6a0 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65  Parse->db, pOrde
1c6b0 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41  rBy, 0);..  /* A
1c6c0 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20  llocate a range 
1c6d0 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  of temporary reg
1c6e0 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b  isters and the K
1c6f0 65 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20  eyInfo needed.  
1c700 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63  ** for the logic
1c710 20 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75   that removes du
1c720 70 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20 72  plicate result r
1c730 6f 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a  ows when the.  *
1c740 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e  * operator is UN
1c750 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20  ION, EXCEPT, or 
1c760 49 4e 54 45 52 53 45 43 54 20 28 62 75 74 20 6e  INTERSECT (but n
1c770 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20  ot UNION ALL).. 
1c780 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
1c790 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50  _ALL ){.    regP
1c7a0 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  rev = 0;.  }else
1c7b0 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20  {.    int nExpr 
1c7c0 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
1c7d0 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
1c7e0 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20  nOrderBy>=nExpr 
1c7f0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
1c800 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72  led );.    regPr
1c810 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ev = pParse->nMe
1c820 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
1c830 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31  >nMem += nExpr+1
1c840 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1c850 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1c860 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65  teger, 0, regPre
1c870 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20  v);.    pKeyDup 
1c880 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
1c890 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2c  Alloc(db, nExpr,
1c8a0 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65   1);.    if( pKe
1c8b0 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20 61 73  yDup ){.      as
1c8c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
1c8d0 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
1c8e0 70 4b 65 79 44 75 70 29 20 29 3b 0a 20 20 20 20  pKeyDup) );.    
1c8f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
1c900 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
1c910 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c    pKeyDup->aColl
1c920 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  [i] = multiSelec
1c930 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
1c940 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20   p, i);.        
1c950 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72  pKeyDup->aSortOr
1c960 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  der[i] = 0;.    
1c970 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a    }.    }.  }. .
1c980 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68    /* Separate th
1c990 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72  e left and the r
1c9a0 69 67 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20  ight query from 
1c9b0 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f  one another.  */
1c9c0 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30  .  p->pPrior = 0
1c9d0 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78  ;.  pPrior->pNex
1c9e0 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
1c9f0 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  ResolveOrderGrou
1ca00 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70  pBy(pParse, p, p
1ca10 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44  ->pOrderBy, "ORD
1ca20 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50 72 69  ER");.  if( pPri
1ca30 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b  or->pPrior==0 ){
1ca40 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f  .    sqlite3Reso
1ca50 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
1ca60 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
1ca70 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
1ca80 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a  , "ORDER");.  }.
1ca90 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
1caa0 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72  e limit register
1cab0 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69  s */.  computeLi
1cac0 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
1cad0 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64  rse, p, labelEnd
1cae0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  );.  if( p->iLim
1caf0 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c  it && op==TK_ALL
1cb00 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74   ){.    regLimit
1cb10 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
1cb20 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74  em;.    regLimit
1cb30 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  B = ++pParse->nM
1cb40 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
1cb50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1cb60 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74  Copy, p->iOffset
1cb70 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20   ? p->iOffset+1 
1cb80 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20  : p->iLimit,.   
1cb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1cbb0 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20 73  egLimitA);.    s
1cbc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1cbd0 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67  (v, OP_Copy, reg
1cbe0 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69 74  LimitA, regLimit
1cbf0 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  B);.  }else{.   
1cc00 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72 65 67   regLimitA = reg
1cc10 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a  LimitB = 0;.  }.
1cc20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1cc30 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
1cc40 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20  t);.  p->pLimit 
1cc50 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41  = 0;..  regAddrA
1cc60 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1cc70 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20 3d 20  m;.  regAddrB = 
1cc80 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1cc90 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50    regOutA = ++pP
1cca0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
1ccb0 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65  gOutB = ++pParse
1ccc0 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65  ->nMem;.  sqlite
1ccd0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
1cce0 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f  &destA, SRT_Coro
1ccf0 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29  utine, regAddrA)
1cd00 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
1cd10 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 42  tDestInit(&destB
1cd20 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
1cd30 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 45   regAddrB);..  E
1cd40 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
1cd50 28 70 50 61 72 73 65 2c 20 31 2c 20 22 4d 45 52  (pParse, 1, "MER
1cd60 47 45 20 28 25 73 29 22 2c 20 73 65 6c 65 63 74  GE (%s)", select
1cd70 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 29 3b  OpName(p->op)));
1cd80 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1cd90 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65  a coroutine to e
1cda0 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45  valuate the SELE
1cdb0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  CT statement to 
1cdc0 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66  the.  ** left of
1cdd0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70   the compound op
1cde0 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22  erator - the "A"
1cdf0 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
1ce00 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71  addrSelectA = sq
1ce10 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1ce20 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 61  Addr(v) + 1;.  a
1ce30 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
1ce40 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
1ce50 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  nitCoroutine, re
1ce60 67 41 64 64 72 41 2c 20 30 2c 20 61 64 64 72 53  gAddrA, 0, addrS
1ce70 65 6c 65 63 74 41 29 3b 0a 20 20 56 64 62 65 43  electA);.  VdbeC
1ce80 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65 66 74  omment((v, "left
1ce90 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70 50   SELECT"));.  pP
1cea0 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72  rior->iLimit = r
1ceb0 65 67 4c 69 6d 69 74 41 3b 0a 20 20 45 78 70 6c  egLimitA;.  Expl
1cec0 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
1ced0 61 72 73 65 2c 20 31 2c 20 22 4c 45 46 54 22 29  arse, 1, "LEFT")
1cee0 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
1cef0 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
1cf00 72 2c 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71  r, &destA);.  sq
1cf10 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f  lite3VdbeEndCoro
1cf20 75 74 69 6e 65 28 76 2c 20 72 65 67 41 64 64 72  utine(v, regAddr
1cf30 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
1cf40 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
1cf50 72 31 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  r1);..  /* Gener
1cf60 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  ate a coroutine 
1cf70 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
1cf80 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1cf90 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69   on .  ** the ri
1cfa0 67 68 74 20 2d 20 74 68 65 20 22 42 22 20 73 65  ght - the "B" se
1cfb0 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72  lect.  */.  addr
1cfc0 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65  SelectB = sqlite
1cfd0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1cfe0 28 76 29 20 2b 20 31 3b 0a 20 20 61 64 64 72 31  (v) + 1;.  addr1
1cff0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1d000 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
1d010 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
1d020 72 42 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63  rB, 0, addrSelec
1d030 74 42 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65  tB);.  VdbeComme
1d040 6e 74 28 28 76 2c 20 22 72 69 67 68 74 20 53 45  nt((v, "right SE
1d050 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76 65 64  LECT"));.  saved
1d060 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69  Limit = p->iLimi
1d070 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73 65 74  t;.  savedOffset
1d080 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20   = p->iOffset;. 
1d090 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67   p->iLimit = reg
1d0a0 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66  LimitB;.  p->iOf
1d0b0 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20 45 78  fset = 0;  .  Ex
1d0c0 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
1d0d0 70 50 61 72 73 65 2c 20 31 2c 20 22 52 49 47 48  pParse, 1, "RIGH
1d0e0 54 22 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  T"));.  sqlite3S
1d0f0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
1d100 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69   &destB);.  p->i
1d110 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c 69 6d  Limit = savedLim
1d120 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74  it;.  p->iOffset
1d130 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74 3b 0a   = savedOffset;.
1d140 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64    sqlite3VdbeEnd
1d150 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67  Coroutine(v, reg
1d160 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65  AddrB);..  /* Ge
1d170 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
1d180 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
1d190 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
1d1a0 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73   of the A.  ** s
1d1b0 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78  elect as the nex
1d1c0 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20  t output row of 
1d1d0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
1d1e0 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65  ect..  */.  Vdbe
1d1f0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1d200 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20  "Output routine 
1d210 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72  for A"));.  addr
1d220 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f  OutA = generateO
1d230 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
1d240 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
1d250 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73           p, &des
1d260 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75  tA, pDest, regOu
1d270 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tA,.            
1d280 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b       regPrev, pK
1d290 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29  eyDup, labelEnd)
1d2a0 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61  ;.  .  /* Genera
1d2b0 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
1d2c0 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65  that outputs the
1d2d0 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
1d2e0 74 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63  the B.  ** selec
1d2f0 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75  t as the next ou
1d300 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20  tput row of the 
1d310 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
1d320 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
1d330 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b  TK_ALL || op==TK
1d340 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64  _UNION ){.    Vd
1d350 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1d360 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e  , "Output routin
1d370 65 20 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20  e for B"));.    
1d380 61 64 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72  addrOutB = gener
1d390 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
1d3a0 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  ine(pParse,.    
1d3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20               p, 
1d3c0 26 64 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72  &destB, pDest, r
1d3d0 65 67 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20  egOutB,.        
1d3e0 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76           regPrev
1d3f0 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c  , pKeyDup, label
1d400 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  End);.  }.  sqli
1d410 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
1d420 70 4b 65 79 44 75 70 29 3b 0a 0a 20 20 2f 2a 20  pKeyDup);..  /* 
1d430 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
1d440 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65  utine to run whe
1d450 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72  n the results fr
1d460 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a  om select A.  **
1d470 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61   are exhausted a
1d480 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20  nd only data in 
1d490 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73  select B remains
1d4a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
1d4b0 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70  =TK_EXCEPT || op
1d4c0 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
1d4d0 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e  {.    addrEofA_n
1d4e0 6f 42 20 3d 20 61 64 64 72 45 6f 66 41 20 3d 20  oB = addrEofA = 
1d4f0 6c 61 62 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73  labelEnd;.  }els
1d500 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f  e{  .    VdbeNoo
1d510 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f  pComment((v, "eo
1d520 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29  f-A subroutine")
1d530 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20  );.    addrEofA 
1d540 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1d550 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
1d560 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75   regOutB, addrOu
1d570 74 42 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66  tB);.    addrEof
1d580 41 5f 6e 6f 42 20 3d 20 73 71 6c 69 74 65 33 56  A_noB = sqlite3V
1d590 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1d5a0 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c  Yield, regAddrB,
1d5b0 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20   labelEnd);.    
1d5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1d5f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1d600 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f 66  eGoto(v, addrEof
1d610 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65  A);.    p->nSele
1d620 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  ctRow = sqlite3L
1d630 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c  ogEstAdd(p->nSel
1d640 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e  ectRow, pPrior->
1d650 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 7d  nSelectRow);.  }
1d660 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1d670 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  a subroutine to 
1d680 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73  run when the res
1d690 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74  ults from select
1d6a0 20 42 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61   B.  ** are exha
1d6b0 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64  usted and only d
1d6c0 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 41 20  ata in select A 
1d6d0 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  remains..  */.  
1d6e0 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52  if( op==TK_INTER
1d6f0 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
1d700 45 6f 66 42 20 3d 20 61 64 64 72 45 6f 66 41 3b  EofB = addrEofA;
1d710 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c  .    if( p->nSel
1d720 65 63 74 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d  ectRow > pPrior-
1d730 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d  >nSelectRow ) p-
1d740 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50  >nSelectRow = pP
1d750 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
1d760 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20  ;.  }else{  .   
1d770 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1d780 28 28 76 2c 20 22 65 6f 66 2d 42 20 73 75 62 72  ((v, "eof-B subr
1d790 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61  outine"));.    a
1d7a0 64 64 72 45 6f 66 42 20 3d 20 73 71 6c 69 74 65  ddrEofB = sqlite
1d7b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d7c0 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41  P_Gosub, regOutA
1d7d0 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20  , addrOutA);.   
1d7e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d7f0 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1d800 72 65 67 41 64 64 72 41 2c 20 6c 61 62 65 6c 45  regAddrA, labelE
1d810 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  nd); VdbeCoverag
1d820 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
1d830 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64  3VdbeGoto(v, add
1d840 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rEofB);.  }..  /
1d850 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1d860 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
1d870 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20  se of A<B.  */. 
1d880 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1d890 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62  ((v, "A-lt-B sub
1d8a0 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64  routine"));.  ad
1d8b0 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74 65 33  drAltB = sqlite3
1d8c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d8d0 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c  _Gosub, regOutA,
1d8e0 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 73 71   addrOutA);.  sq
1d8f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1d900 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1d910 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29  AddrA, addrEofA)
1d920 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1d930 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1d940 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70  Goto(v, labelCmp
1d950 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  r);..  /* Genera
1d960 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
1d970 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d  e the case of A=
1d980 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  =B.  */.  if( op
1d990 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
1d9a0 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
1d9b0 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ltB;.  }else if(
1d9c0 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
1d9d0 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71  T ){.    addrAeq
1d9e0 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20  B = addrAltB;.  
1d9f0 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20    addrAltB++;.  
1da00 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e  }else{.    VdbeN
1da10 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1da20 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-eq-B subroutin
1da30 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65  e"));.    addrAe
1da40 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33  qB =.    sqlite3
1da50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1da60 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
1da70 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62  , addrEofA); Vdb
1da80 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1da90 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
1daa0 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  o(v, labelCmpr);
1dab0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
1dac0 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
1dad0 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41  le the case of A
1dae0 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  >B.  */.  VdbeNo
1daf0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
1db00 2d 67 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -gt-B subroutine
1db10 22 29 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20  "));.  addrAgtB 
1db20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1db30 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
1db40 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  f( op==TK_ALL ||
1db50 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b   op==TK_UNION ){
1db60 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1db70 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
1db80 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64  ub, regOutB, add
1db90 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71  rOutB);.  }.  sq
1dba0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1dbb0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1dbc0 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29  AddrB, addrEofB)
1dbd0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1dbe0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1dbf0 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70  Goto(v, labelCmp
1dc00 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63  r);..  /* This c
1dc10 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f  ode runs once to
1dc20 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76 65 72   initialize ever
1dc30 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73  ything..  */.  s
1dc40 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
1dc50 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
1dc60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1dc70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1dc80 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66  egAddrA, addrEof
1dc90 41 5f 6e 6f 42 29 3b 20 56 64 62 65 43 6f 76 65  A_noB); VdbeCove
1dca0 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
1dcb0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1dcc0 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1dcd0 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56  rB, addrEofB); V
1dce0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1dcf0 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20  .  /* Implement 
1dd00 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c  the main merge l
1dd10 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  oop.  */.  sqlit
1dd20 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1dd30 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29  el(v, labelCmpr)
1dd40 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1dd50 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d  ddOp4(v, OP_Perm
1dd60 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30  utation, 0, 0, 0
1dd70 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d 75 74  , (char*)aPermut
1dd80 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b  e, P4_INTARRAY);
1dd90 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1dda0 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
1ddb0 72 65 2c 20 64 65 73 74 41 2e 69 53 64 73 74 2c  re, destA.iSdst,
1ddc0 20 64 65 73 74 42 2e 69 53 64 73 74 2c 20 6e 4f   destB.iSdst, nO
1ddd0 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20  rderBy,.        
1dde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddf0 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65 72 67   (char*)pKeyMerg
1de00 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  e, P4_KEYINFO);.
1de10 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1de20 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
1de30 50 45 52 4d 55 54 45 29 3b 0a 20 20 73 71 6c 69  PERMUTE);.  sqli
1de40 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1de50 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c   OP_Jump, addrAl
1de60 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20 61 64  tB, addrAeqB, ad
1de70 64 72 41 67 74 42 29 3b 20 56 64 62 65 43 6f 76  drAgtB); VdbeCov
1de80 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20  erage(v);..  /* 
1de90 4a 75 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73  Jump to the this
1dea0 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20   point in order 
1deb0 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
1dec0 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73   query..  */.  s
1ded0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1dee0 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45  eLabel(v, labelE
1def0 6e 64 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 73 73  nd);..  /* Reass
1df00 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75  embly the compou
1df10 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68 61 74  nd query so that
1df20 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65   it will be free
1df30 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a  d correctly.  **
1df40 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
1df50 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66  function */.  if
1df60 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
1df70 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
1df80 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50  Delete(db, p->pP
1df90 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  rior);.  }.  p->
1dfa0 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
1dfb0 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74  .  pPrior->pNext
1dfc0 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42   = p;..  /*** TB
1dfd0 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f  D:  Insert subro
1dfe0 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63  utine calls to c
1dff0 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20  lose cursors on 
1e000 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a  incomplete.  ***
1e010 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a  * subqueries ***
1e020 2a 2f 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72  */.  ExplainQuer
1e030 79 50 6c 61 6e 50 6f 70 28 70 50 61 72 73 65 29  yPlanPop(pParse)
1e040 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73  ;.  return pPars
1e050 65 2d 3e 6e 45 72 72 21 3d 30 3b 0a 7d 0a 23 65  e->nErr!=0;.}.#e
1e060 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
1e070 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
1e080 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
1e090 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1e0a0 5f 56 49 45 57 29 0a 0a 2f 2a 20 41 6e 20 69 6e  _VIEW)../* An in
1e0b0 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 53 75  stance of the Su
1e0c0 62 73 74 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63  bstContext objec
1e0d0 74 20 64 65 73 63 72 69 62 65 73 20 61 6e 20 73  t describes an s
1e0e0 75 62 73 74 69 74 75 74 69 6f 6e 20 65 64 69 74  ubstitution edit
1e0f0 0a 2a 2a 20 74 6f 20 62 65 20 70 65 72 66 6f 72  .** to be perfor
1e100 6d 65 64 20 6f 6e 20 61 20 70 61 72 73 65 20 74  med on a parse t
1e110 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 72  ree..**.** All r
1e120 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
1e130 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 69 54  umns in table iT
1e140 61 62 6c 65 20 61 72 65 20 74 6f 20 62 65 20 72  able are to be r
1e150 65 70 6c 61 63 65 64 20 62 79 20 63 6f 72 72 65  eplaced by corre
1e160 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 65 78 70 72  sponding.** expr
1e170 65 73 73 69 6f 6e 73 20 69 6e 20 70 45 4c 69 73  essions in pELis
1e180 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  t..*/.typedef st
1e190 72 75 63 74 20 53 75 62 73 74 43 6f 6e 74 65 78  ruct SubstContex
1e1a0 74 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  t {.  Parse *pPa
1e1b0 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
1e1c0 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
1e1d0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
1e1e0 69 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  iTable;         
1e1f0 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61 63 65        /* Replace
1e200 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1e210 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  his table */.  i
1e220 6e 74 20 69 4e 65 77 54 61 62 6c 65 3b 20 20 20  nt iNewTable;   
1e230 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
1e240 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  table number */.
1e250 20 20 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e    int isLeftJoin
1e260 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
1e270 64 64 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f  dd TK_IF_NULL_RO
1e280 57 20 6f 70 63 6f 64 65 73 20 6f 6e 20 65 61 63  W opcodes on eac
1e290 68 20 72 65 70 6c 61 63 65 6d 65 6e 74 20 2a 2f  h replacement */
1e2a0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
1e2b0 69 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ist;         /* 
1e2c0 52 65 70 6c 61 63 65 6d 65 6e 74 20 65 78 70 72  Replacement expr
1e2d0 65 73 73 69 6f 6e 73 20 2a 2f 0a 7d 20 53 75 62  essions */.} Sub
1e2e0 73 74 43 6f 6e 74 65 78 74 3b 0a 0a 2f 2a 20 46  stContext;../* F
1e2f0 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69  orward Declarati
1e300 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ons */.static vo
1e310 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
1e320 28 53 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20  (SubstContext*, 
1e330 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74  ExprList*);.stat
1e340 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c  ic void substSel
1e350 65 63 74 28 53 75 62 73 74 43 6f 6e 74 65 78 74  ect(SubstContext
1e360 2a 2c 20 53 65 6c 65 63 74 2a 2c 20 69 6e 74 29  *, Select*, int)
1e370 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68  ;../*.** Scan th
1e380 72 6f 75 67 68 20 74 68 65 20 65 78 70 72 65 73  rough the expres
1e390 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70  sion pExpr.  Rep
1e3a0 6c 61 63 65 20 65 76 65 72 79 20 72 65 66 65 72  lace every refer
1e3b0 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c  ence to.** a col
1e3c0 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d  umn in table num
1e3d0 62 65 72 20 69 54 61 62 6c 65 20 77 69 74 68 20  ber iTable with 
1e3e0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43  a copy of the iC
1e3f0 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72  olumn-th.** entr
1e400 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42  y in pEList.  (B
1e410 75 74 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e  ut leave referen
1e420 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44  ces to the ROWID
1e430 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68   column .** unch
1e440 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  anged.).**.** Th
1e450 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61  is routine is pa
1e460 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65  rt of the flatte
1e470 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20  ning procedure. 
1e480 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77   A subquery.** w
1e490 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74 20  hose result set 
1e4a0 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 45  is defined by pE
1e4b0 4c 69 73 74 20 61 70 70 65 61 72 73 20 61 73 20  List appears as 
1e4c0 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20  entry in the.** 
1e4d0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
1e4e0 20 53 45 4c 45 43 54 20 73 75 63 68 20 74 68 61   SELECT such tha
1e4f0 74 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f  t the VDBE curso
1e500 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  r assigned to th
1e510 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73  at.** FORM claus
1e520 65 20 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c  e entry is iTabl
1e530 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
1e540 20 6d 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73   makes the neces
1e550 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73  sary .** changes
1e560 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61   to pExpr so tha
1e570 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72 65  t it refers dire
1e580 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72  ctly to the sour
1e590 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74  ce table.** of t
1e5a0 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74 68  he subquery rath
1e5b0 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  er the result se
1e5c0 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
1e5d0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70  y..*/.static Exp
1e5e0 72 20 2a 73 75 62 73 74 45 78 70 72 28 0a 20 20  r *substExpr(.  
1e5f0 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53  SubstContext *pS
1e600 75 62 73 74 2c 20 20 2f 2a 20 44 65 73 63 72 69  ubst,  /* Descri
1e610 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62  ption of the sub
1e620 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 45  stitution */.  E
1e630 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
1e640 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e        /* Expr in
1e650 20 77 68 69 63 68 20 73 75 62 73 74 69 74 75 74   which substitut
1e660 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 29 7b  ion occurs */.){
1e670 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
1e680 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
1e690 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1e6a0 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
1e6b0 4a 6f 69 6e 29 0a 20 20 20 26 26 20 70 45 78 70  Join).   && pExp
1e6c0 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  r->iRightJoinTab
1e6d0 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62  le==pSubst->iTab
1e6e0 6c 65 0a 20 20 29 7b 0a 20 20 20 20 70 45 78 70  le.  ){.    pExp
1e6f0 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  r->iRightJoinTab
1e700 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65  le = pSubst->iNe
1e710 77 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  wTable;.  }.  if
1e720 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1e730 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d  COLUMN && pExpr-
1e740 3e 69 54 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d  >iTable==pSubst-
1e750 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  >iTable ){.    i
1e760 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
1e770 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78  n<0 ){.      pEx
1e780 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
1e790 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e7a0 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20     Expr *pNew;. 
1e7b0 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f 70 79       Expr *pCopy
1e7c0 20 3d 20 70 53 75 62 73 74 2d 3e 70 45 4c 69 73   = pSubst->pELis
1e7d0 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  t->a[pExpr->iCol
1e7e0 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  umn].pExpr;.    
1e7f0 20 20 45 78 70 72 20 69 66 4e 75 6c 6c 52 6f 77    Expr ifNullRow
1e800 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e810 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 21 3d  pSubst->pEList!=
1e820 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c  0 && pExpr->iCol
1e830 75 6d 6e 3c 70 53 75 62 73 74 2d 3e 70 45 4c 69  umn<pSubst->pELi
1e840 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20  st->nExpr );.   
1e850 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1e860 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
1e870 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1e880 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 43 6f  ExprIsVector(pCo
1e890 70 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  py) ){.        s
1e8a0 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72 6f  qlite3VectorErro
1e8b0 72 4d 73 67 28 70 53 75 62 73 74 2d 3e 70 50 61  rMsg(pSubst->pPa
1e8c0 72 73 65 2c 20 70 43 6f 70 79 29 3b 0a 20 20 20  rse, pCopy);.   
1e8d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e8e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1e8f0 70 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2d 3e  pSubst->pParse->
1e900 64 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  db;.        if( 
1e910 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74 4a 6f  pSubst->isLeftJo
1e920 69 6e 20 26 26 20 70 43 6f 70 79 2d 3e 6f 70 21  in && pCopy->op!
1e930 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
1e940 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
1e950 69 66 4e 75 6c 6c 52 6f 77 2c 20 30 2c 20 73 69  ifNullRow, 0, si
1e960 7a 65 6f 66 28 69 66 4e 75 6c 6c 52 6f 77 29 29  zeof(ifNullRow))
1e970 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 4e 75  ;.          ifNu
1e980 6c 6c 52 6f 77 2e 6f 70 20 3d 20 54 4b 5f 49 46  llRow.op = TK_IF
1e990 5f 4e 55 4c 4c 5f 52 4f 57 3b 0a 20 20 20 20 20  _NULL_ROW;.     
1e9a0 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 70       ifNullRow.p
1e9b0 4c 65 66 74 20 3d 20 70 43 6f 70 79 3b 0a 20 20  Left = pCopy;.  
1e9c0 20 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f          ifNullRo
1e9d0 77 2e 69 54 61 62 6c 65 20 3d 20 70 53 75 62 73  w.iTable = pSubs
1e9e0 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20  t->iNewTable;.  
1e9f0 20 20 20 20 20 20 20 20 70 43 6f 70 79 20 3d 20          pCopy = 
1ea00 26 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20  &ifNullRow;.    
1ea10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4e      }.        pN
1ea20 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
1ea30 44 75 70 28 64 62 2c 20 70 43 6f 70 79 2c 20 30  Dup(db, pCopy, 0
1ea40 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1ea50 4e 65 77 20 26 26 20 70 53 75 62 73 74 2d 3e 69  New && pSubst->i
1ea60 73 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  sLeftJoin ){.   
1ea70 20 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72         ExprSetPr
1ea80 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
1ea90 43 61 6e 42 65 4e 75 6c 6c 29 3b 0a 20 20 20 20  CanBeNull);.    
1eaa0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1eab0 28 20 70 4e 65 77 20 26 26 20 45 78 70 72 48 61  ( pNew && ExprHa
1eac0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1ead0 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
1eae0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
1eaf0 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
1eb00 3d 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a  = pExpr->iRightJ
1eb10 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  oinTable;.      
1eb20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
1eb30 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 46 72 6f  rty(pNew, EP_Fro
1eb40 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  mJoin);.        
1eb50 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
1eb60 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
1eb70 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
1eb80 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20  pExpr = pNew;.  
1eb90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
1eba0 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 45 78  lse{.    if( pEx
1ebb0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55  pr->op==TK_IF_NU
1ebc0 4c 4c 5f 52 4f 57 20 26 26 20 70 45 78 70 72 2d  LL_ROW && pExpr-
1ebd0 3e 69 54 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d  >iTable==pSubst-
1ebe0 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  >iTable ){.     
1ebf0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
1ec00 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62   pSubst->iNewTab
1ec10 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45  le;.    }.    pE
1ec20 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62  xpr->pLeft = sub
1ec30 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70  stExpr(pSubst, p
1ec40 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
1ec50 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20    pExpr->pRight 
1ec60 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62  = substExpr(pSub
1ec70 73 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  st, pExpr->pRigh
1ec80 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72  t);.    if( Expr
1ec90 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1eca0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1ecb0 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53   ){.      substS
1ecc0 65 6c 65 63 74 28 70 53 75 62 73 74 2c 20 70 45  elect(pSubst, pE
1ecd0 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20  xpr->x.pSelect, 
1ece0 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1);.    }else{. 
1ecf0 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69       substExprLi
1ed00 73 74 28 70 53 75 62 73 74 2c 20 70 45 78 70 72  st(pSubst, pExpr
1ed10 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
1ed20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
1ed30 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Expr;.}.static v
1ed40 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73  oid substExprLis
1ed50 74 28 0a 20 20 53 75 62 73 74 43 6f 6e 74 65 78  t(.  SubstContex
1ed60 74 20 2a 70 53 75 62 73 74 2c 20 2f 2a 20 44 65  t *pSubst, /* De
1ed70 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
1ed80 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f   substitution */
1ed90 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
1eda0 73 74 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  st       /* List
1edb0 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20   to scan and in 
1edc0 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
1edd0 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 29 7b 0a  bstitutes */.){.
1ede0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1edf0 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1ee00 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1ee10 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1ee20 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  ){.    pList->a[
1ee30 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74  i].pExpr = subst
1ee40 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 4c 69  Expr(pSubst, pLi
1ee50 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
1ee60 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
1ee70 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a  id substSelect(.
1ee80 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a    SubstContext *
1ee90 70 53 75 62 73 74 2c 20 2f 2a 20 44 65 73 63 72  pSubst, /* Descr
1eea0 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  iption of the su
1eeb0 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20  bstitution */.  
1eec0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
1eed0 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20        /* SELECT 
1eee0 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69  statement in whi
1eef0 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74  ch to make subst
1ef00 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  itutions */.  in
1ef10 74 20 64 6f 50 72 69 6f 72 20 20 20 20 20 20 20  t doPrior       
1ef20 20 20 20 20 2f 2a 20 44 6f 20 73 75 62 73 74 69      /* Do substi
1ef30 74 75 74 65 73 20 6f 6e 20 70 2d 3e 70 50 72 69  tutes on p->pPri
1ef40 6f 72 20 74 6f 6f 20 2a 2f 0a 29 7b 0a 20 20 53  or too */.){.  S
1ef50 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20  rcList *pSrc;.  
1ef60 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1ef70 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
1ef80 74 20 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20  t i;.  if( !p ) 
1ef90 72 65 74 75 72 6e 3b 0a 20 20 64 6f 7b 0a 20 20  return;.  do{.  
1efa0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1efb0 70 53 75 62 73 74 2c 20 70 2d 3e 70 45 4c 69 73  pSubst, p->pELis
1efc0 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  t);.    substExp
1efd0 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 2d  rList(pSubst, p-
1efe0 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
1eff0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53  substExprList(pS
1f000 75 62 73 74 2c 20 70 2d 3e 70 4f 72 64 65 72 42  ubst, p->pOrderB
1f010 79 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69  y);.    p->pHavi
1f020 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 70  ng = substExpr(p
1f030 53 75 62 73 74 2c 20 70 2d 3e 70 48 61 76 69 6e  Subst, p->pHavin
1f040 67 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72  g);.    p->pWher
1f050 65 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53  e = substExpr(pS
1f060 75 62 73 74 2c 20 70 2d 3e 70 57 68 65 72 65 29  ubst, p->pWhere)
1f070 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 2d 3e  ;.    pSrc = p->
1f080 70 53 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74  pSrc;.    assert
1f090 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20  ( pSrc!=0 );.   
1f0a0 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72   for(i=pSrc->nSr
1f0b0 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61  c, pItem=pSrc->a
1f0c0 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65  ; i>0; i--, pIte
1f0d0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73  m++){.      subs
1f0e0 74 53 65 6c 65 63 74 28 70 53 75 62 73 74 2c 20  tSelect(pSubst, 
1f0f0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pItem->pSelect, 
1f100 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  1);.      if( pI
1f110 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  tem->fg.isTabFun
1f120 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 75 62  c ){.        sub
1f130 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73  stExprList(pSubs
1f140 74 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75  t, pItem->u1.pFu
1f150 6e 63 41 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a  ncArg);.      }.
1f160 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
1f170 64 6f 50 72 69 6f 72 20 26 26 20 28 70 20 3d 20  doPrior && (p = 
1f180 70 2d 3e 70 50 72 69 6f 72 29 21 3d 30 20 29 3b  p->pPrior)!=0 );
1f190 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
1f1a0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1f1b0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
1f1c0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1f1d0 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69  MIT_VIEW) */..#i
1f1e0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1f1f0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
1f200 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
1f210 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f  ITE_OMIT_VIEW)./
1f220 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1f230 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c  e attempts to fl
1f240 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73  atten subqueries
1f250 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63   as a performanc
1f260 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a  e optimization..
1f270 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1f280 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20  returns 1 if it 
1f290 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e  makes changes an
1f2a0 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65  d 0 if no flatte
1f2b0 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  ning occurs..**.
1f2c0 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64  ** To understand
1f2d0 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20   the concept of 
1f2e0 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73  flattening, cons
1f2f0 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
1f300 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a  ng.** query:.**.
1f310 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
1f320 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79  FROM (SELECT x+y
1f330 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
1f340 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45  ERE z<100) WHERE
1f350 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64   a>5.**.** The d
1f360 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d  efault way of im
1f370 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20  plementing this 
1f380 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63  query is to exec
1f390 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75  ute the.** subqu
1f3a0 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74  ery first and st
1f3b0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
1f3c0 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  in a temporary t
1f3d0 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75  able, then.** ru
1f3e0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1f3f0 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72  y on that tempor
1f400 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ary table.  This
1f410 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a   requires two.**
1f420 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65   passes over the
1f430 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d   data.  Furtherm
1f440 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65  ore, because the
1f450 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1f460 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63  .** has no indic
1f470 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c  es, the WHERE cl
1f480 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65  ause on the oute
1f490 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62  r query cannot b
1f4a0 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a  e.** optimized..
1f4b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1f4c0 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  ne attempts to r
1f4d0 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73  ewrite queries s
1f4e0 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65  uch as the above
1f4f0 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
1f500 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c  e flat select, l
1f510 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
1f520 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41      SELECT x+y A
1f530 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S a FROM t1 WHER
1f540 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a  E z<100 AND a>5.
1f550 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67  **.** The code g
1f560 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69  enerated for thi
1f570 73 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e  s simplification
1f580 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20   gives the same 
1f590 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e  result.** but on
1f5a0 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74  ly has to scan t
1f5b0 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41  he data once.  A
1f5c0 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63  nd because indic
1f5d0 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69  es might .** exi
1f5e0 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  st on the table 
1f5f0 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73  t1, a complete s
1f600 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20  can of the data 
1f610 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69  might be.** avoi
1f620 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74  ded..**.** Flatt
1f630 65 6e 69 6e 67 20 69 73 20 73 75 62 6a 65 63 74  ening is subject
1f640 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
1f650 67 20 63 6f 6e 73 74 72 61 69 6e 74 73 3a 0a 2a  g constraints:.*
1f660 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e  *.**  (**)  We n
1f670 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74  o longer attempt
1f680 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72   to flatten aggr
1f690 65 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73  egate subqueries
1f6a0 2e 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20  . Was:.**       
1f6b0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
1f6c0 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
1f6d0 79 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65  y cannot both be
1f6e0 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
1f6f0 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20  **  (**)  We no 
1f700 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74  longer attempt t
1f710 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67  o flatten aggreg
1f720 61 74 65 20 73 75 62 71 75 65 72 69 65 73 2e 20  ate subqueries. 
1f730 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 28  Was:.**        (
1f740 32 29 20 49 66 20 74 68 65 20 73 75 62 71 75 65  2) If the subque
1f750 72 79 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  ry is an aggrega
1f760 74 65 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20  te then.**      
1f770 20 20 28 32 61 29 20 74 68 65 20 6f 75 74 65 72    (2a) the outer
1f780 20 71 75 65 72 79 20 6d 75 73 74 20 6e 6f 74 20   query must not 
1f790 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a 2a  be a join and.**
1f7a0 20 20 20 20 20 20 20 20 28 32 62 29 20 74 68 65          (2b) the
1f7b0 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 75 73   outer query mus
1f7c0 74 20 6e 6f 74 20 75 73 65 20 73 75 62 71 75 65  t not use subque
1f7d0 72 69 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ries.**         
1f7e0 20 20 20 20 6f 74 68 65 72 20 74 68 61 6e 20 74      other than t
1f7f0 68 65 20 6f 6e 65 20 46 52 4f 4d 2d 63 6c 61 75  he one FROM-clau
1f800 73 65 20 73 75 62 71 75 65 72 79 20 74 68 61 74  se subquery that
1f810 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 0a   is a candidate.
1f820 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 66  **             f
1f830 6f 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20  or flattening.  
1f840 28 54 68 69 73 20 69 73 20 64 75 65 20 74 6f 20  (This is due to 
1f850 74 69 63 6b 65 74 20 5b 32 66 37 31 37 30 64 37  ticket [2f7170d7
1f860 33 62 66 39 61 62 66 38 30 5d 0a 2a 2a 20 20 20  3bf9abf80].**   
1f870 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20 32            from 2
1f880 30 31 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a 2a  015-02-09.).**.*
1f890 2a 20 20 20 28 33 29 20 20 49 66 20 74 68 65 20  *   (3)  If the 
1f8a0 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20  subquery is the 
1f8b0 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
1f8c0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 74 68 65   a LEFT JOIN the
1f8d0 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 61 29  n.**        (3a)
1f8e0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 6d 61   the subquery ma
1f8f0 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20  y not be a join 
1f900 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 33  and.**        (3
1f910 62 29 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  b) the FROM clau
1f920 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  se of the subque
1f930 72 79 20 6d 61 79 20 6e 6f 74 20 63 6f 6e 74 61  ry may not conta
1f940 69 6e 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20  in a virtual.** 
1f950 20 20 20 20 20 20 20 20 20 20 20 20 74 61 62 6c              tabl
1f960 65 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  e and.**        
1f970 28 33 63 29 20 74 68 65 20 6f 75 74 65 72 20 71  (3c) the outer q
1f980 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20  uery may not be 
1f990 61 6e 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a  an aggregate..**
1f9a0 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73  .**   (4)  The s
1f9b0 75 62 71 75 65 72 79 20 63 61 6e 20 6e 6f 74 20  ubquery can not 
1f9c0 62 65 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a  be DISTINCT..**.
1f9d0 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65  **  (**)  At one
1f9e0 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63 74 69   point restricti
1f9f0 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35 29 20  ons (4) and (5) 
1fa00 64 65 66 69 6e 65 64 20 61 20 73 75 62 73 65 74  defined a subset
1fa10 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20   of DISTINCT.** 
1fa20 20 20 20 20 20 20 20 73 75 62 2d 71 75 65 72 69         sub-queri
1fa30 65 73 20 74 68 61 74 20 77 65 72 65 20 65 78 63  es that were exc
1fa40 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69 73 20  luded from this 
1fa50 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65  optimization. Re
1fa60 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  striction .**   
1fa70 20 20 20 20 20 28 34 29 20 68 61 73 20 73 69 6e       (4) has sin
1fa80 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65 64  ce been expanded
1fa90 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c 20   to exclude all 
1faa0 44 49 53 54 49 4e 43 54 20 73 75 62 71 75 65 72  DISTINCT subquer
1fab0 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  ies..**.**  (**)
1fac0 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61    We no longer a
1fad0 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74 65  ttempt to flatte
1fae0 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71  n aggregate subq
1faf0 75 65 72 69 65 73 2e 20 20 57 61 73 3a 0a 2a 2a  ueries.  Was:.**
1fb00 20 20 20 20 20 20 20 20 49 66 20 74 68 65 20 73          If the s
1fb10 75 62 71 75 65 72 79 20 69 73 20 61 67 67 72 65  ubquery is aggre
1fb20 67 61 74 65 2c 20 74 68 65 20 6f 75 74 65 72 20  gate, the outer 
1fb30 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
1fb40 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
1fb50 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71     (7)  The subq
1fb60 75 65 72 79 20 6d 75 73 74 20 68 61 76 65 20 61  uery must have a
1fb70 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
1fb80 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71 75 65  ODO:  For subque
1fb90 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20  ries without.** 
1fba0 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20 63 6c         A FROM cl
1fbb0 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72 20 61  ause, consider a
1fbc0 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c 61  dding a FROM cla
1fbd0 75 73 65 20 77 69 74 68 20 74 68 65 20 73 70 65  use with the spe
1fbe0 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74  cial.**        t
1fbf0 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65  able sqlite_once
1fc00 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f   that consists o
1fc10 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 63  f a single row c
1fc20 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20  ontaining a.**  
1fc30 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c        single NUL
1fc40 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20  L..**.**   (8)  
1fc50 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1fc60 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e 20  uses LIMIT then 
1fc70 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1fc80 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69  may not be a joi
1fc90 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20  n..**.**   (9)  
1fca0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1fcb0 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e 20  uses LIMIT then 
1fcc0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1fcd0 6d 61 79 20 6e 6f 74 20 62 65 20 61 67 67 72 65  may not be aggre
1fce0 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  gate..**.**  (**
1fcf0 29 20 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  )  Restriction (
1fd00 31 30 29 20 77 61 73 20 72 65 6d 6f 76 65 64 20  10) was removed 
1fd10 66 72 6f 6d 20 74 68 65 20 63 6f 64 65 20 6f 6e  from the code on
1fd20 20 32 30 30 35 2d 30 32 2d 30 35 20 62 75 74 20   2005-02-05 but 
1fd30 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 63 63  we.**        acc
1fd40 69 64 65 6e 74 6c 79 20 63 61 72 72 69 65 64 20  idently carried 
1fd50 74 68 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 77  the comment forw
1fd60 61 72 64 20 75 6e 74 69 6c 20 32 30 31 34 2d 30  ard until 2014-0
1fd70 39 2d 31 35 2e 20 20 4f 72 69 67 69 6e 61 6c 0a  9-15.  Original.
1fd80 2a 2a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72  **        constr
1fd90 61 69 6e 74 3a 20 22 49 66 20 74 68 65 20 73 75  aint: "If the su
1fda0 62 71 75 65 72 79 20 69 73 20 61 67 67 72 65 67  bquery is aggreg
1fdb0 61 74 65 20 74 68 65 6e 20 74 68 65 20 6f 75 74  ate then the out
1fdc0 65 72 20 71 75 65 72 79 20 0a 2a 2a 20 20 20 20  er query .**    
1fdd0 20 20 20 20 6d 61 79 20 6e 6f 74 20 75 73 65 20      may not use 
1fde0 4c 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28  LIMIT.".**.**  (
1fdf0 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  11)  The subquer
1fe00 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  y and the outer 
1fe10 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 6f  query may not bo
1fe20 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59  th have ORDER BY
1fe30 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
1fe40 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65   (**)  Not imple
1fe50 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65  mented.  Subsume
1fe60 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69  d into restricti
1fe70 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72 65  on (3).  Was pre
1fe80 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20  viously.**      
1fe90 20 20 61 20 73 65 70 61 72 61 74 65 20 72 65 73    a separate res
1fea0 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e  triction derivin
1feb0 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33  g from ticket #3
1fec0 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20  50..**.**  (13) 
1fed0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
1fee0 64 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61  d outer query ma
1fef0 79 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c  y not both use L
1ff00 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34  IMIT..**.**  (14
1ff10 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1ff20 6d 61 79 20 6e 6f 74 20 75 73 65 20 4f 46 46 53  may not use OFFS
1ff30 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20  ET..**.**  (15) 
1ff40 20 49 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   If the outer qu
1ff50 65 72 79 20 69 73 20 70 61 72 74 20 6f 66 20 61  ery is part of a
1ff60 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1ff70 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20  , then the.**   
1ff80 20 20 20 20 20 73 75 62 71 75 65 72 79 20 6d 61       subquery ma
1ff90 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e  y not use LIMIT.
1ffa0 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65 20  .**        (See 
1ffb0 74 69 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64  ticket #2339 and
1ffc0 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31   ticket [02a8e81
1ffd0 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  d44])..**.**  (1
1ffe0 36 29 20 20 49 66 20 74 68 65 20 6f 75 74 65 72  6)  If the outer
1fff0 20 71 75 65 72 79 20 69 73 20 61 67 67 72 65 67   query is aggreg
20000 61 74 65 2c 20 74 68 65 6e 20 74 68 65 20 73 75  ate, then the su
20010 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a  bquery may not.*
20020 2a 20 20 20 20 20 20 20 20 75 73 65 20 4f 52 44  *        use ORD
20030 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20  ER BY.  (Ticket 
20040 23 32 39 34 32 29 20 20 54 68 69 73 20 75 73 65  #2942)  This use
20050 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a  d to not matter.
20060 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20  **        until 
20070 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68  we introduced th
20080 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29  e group_concat()
20090 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a   function.  .**.
200a0 2a 2a 20 20 28 31 37 29 20 20 49 66 20 74 68 65  **  (17)  If the
200b0 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20 63   subquery is a c
200c0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
200d0 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28  then.**        (
200e0 31 37 61 29 20 61 6c 6c 20 63 6f 6d 70 6f 75 6e  17a) all compoun
200f0 64 20 6f 70 65 72 61 74 6f 72 73 20 6d 75 73 74  d operators must
20100 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 2c   be a UNION ALL,
20110 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28   and.**        (
20120 31 37 62 29 20 6e 6f 20 74 65 72 6d 73 20 77 69  17b) no terms wi
20130 74 68 69 6e 20 74 68 65 20 73 75 62 71 75 65 72  thin the subquer
20140 79 20 63 6f 6d 70 6f 75 6e 64 20 6d 61 79 20 62  y compound may b
20150 65 20 61 67 67 72 65 67 61 74 65 0a 2a 2a 20 20  e aggregate.**  
20160 20 20 20 20 20 20 20 20 20 20 20 20 6f 72 20 44              or D
20170 49 53 54 49 4e 43 54 2c 20 61 6e 64 0a 2a 2a 20  ISTINCT, and.** 
20180 20 20 20 20 20 20 20 28 31 37 63 29 20 65 76 65         (17c) eve
20190 72 79 20 74 65 72 6d 20 77 69 74 68 69 6e 20 74  ry term within t
201a0 68 65 20 73 75 62 71 75 65 72 79 20 63 6f 6d 70  he subquery comp
201b0 6f 75 6e 64 20 6d 75 73 74 20 68 61 76 65 20 61  ound must have a
201c0 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20   FROM clause.** 
201d0 20 20 20 20 20 20 20 28 31 37 64 29 20 74 68 65         (17d) the
201e0 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79   outer query may
201f0 20 6e 6f 74 20 62 65 0a 2a 2a 20 20 20 20 20 20   not be.**      
20200 20 20 20 20 20 20 20 20 28 31 37 64 31 29 20 61          (17d1) a
20210 67 67 72 65 67 61 74 65 2c 20 6f 72 0a 2a 2a 20  ggregate, or.** 
20220 20 20 20 20 20 20 20 20 20 20 20 20 20 28 31 37               (17
20230 64 32 29 20 44 49 53 54 49 4e 43 54 2c 20 6f 72  d2) DISTINCT, or
20240 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
20250 20 28 31 37 64 33 29 20 61 20 6a 6f 69 6e 2e 0a   (17d3) a join..
20260 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65  **.**        The
20270 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d   parent and sub-
20280 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69  query may contai
20290 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e  n WHERE clauses.
202a0 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20   Subject to.**  
202b0 20 20 20 20 20 20 72 75 6c 65 73 20 28 31 31 29        rules (11)
202c0 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c  , (13) and (14),
202d0 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63   they may also c
202e0 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c  ontain ORDER BY,
202f0 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54  .**        LIMIT
20300 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75   and OFFSET clau
20310 73 65 73 2e 20 20 54 68 65 20 73 75 62 71 75 65  ses.  The subque
20320 72 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e  ry cannot use an
20330 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20  y compound.**   
20340 20 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f 74       operator ot
20350 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41  her than UNION A
20360 4c 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74  LL because all t
20370 68 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e  he other compoun
20380 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72  d.**        oper
20390 61 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69 6d  ators have an im
203a0 70 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20 77  plied DISTINCT w
203b0 68 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f 77  hich is disallow
203c0 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20 20  ed by.**        
203d0 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29 2e  restriction (4).
203e0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c  .**.**        Al
203f0 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65  so, each compone
20400 6e 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75  nt of the sub-qu
20410 65 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e 20  ery must return 
20420 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
20430 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65 73  **        of res
20440 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69  ult columns. Thi
20450 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  s is actually a 
20460 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72 20  requirement for 
20470 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  any compound.** 
20480 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 73 74         SELECT st
20490 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c  atement, but all
204a0 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20 64   the code here d
204b0 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72 65  oes is make sure
204c0 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20   that no.**     
204d0 20 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61 6c     such (illegal
204e0 29 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 66  ) sub-query is f
204f0 6c 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63 61  lattened. The ca
20500 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63 74  ller will detect
20510 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73   the.**        s
20520 79 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64 20  yntax error and 
20530 72 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c 65  return a detaile
20540 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a  d message..**.**
20550 20 20 28 31 38 29 20 20 49 66 20 74 68 65 20 73    (18)  If the s
20560 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
20570 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74  mpound select, t
20580 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66  hen all terms of
20590 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f   the.**        O
205a0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
205b0 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73  f the parent mus
205c0 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65  t be simple refe
205d0 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20  rences to .**   
205e0 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20       columns of 
205f0 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a  the sub-query..*
20600 2a 0a 2a 2a 20 20 28 31 39 29 20 20 49 66 20 74  *.**  (19)  If t
20610 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
20620 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20   LIMIT then the 
20630 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20  outer query may 
20640 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61  not.**        ha
20650 76 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  ve a WHERE claus
20660 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20  e..**.**  (20)  
20670 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
20680 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   is a compound s
20690 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d  elect, then it m
206a0 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  ust not use.**  
206b0 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42        an ORDER B
206c0 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65  Y clause.  Ticke
206d0 74 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75  t #3773.  We cou
206e0 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f  ld relax this co
206f0 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20  nstraint.**     
20700 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73     somewhat by s
20710 61 79 69 6e 67 20 74 68 61 74 20 74 68 65 20 74  aying that the t
20720 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
20730 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74  R BY clause must
20740 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65 61  .**        appea
20750 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20  r as unmodified 
20760 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69  result columns i
20770 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
20780 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20  y.  But we.**   
20790 20 20 20 20 20 68 61 76 65 20 6f 74 68 65 72 20       have other 
207a0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e  optimizations in
207b0 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69   mind to deal wi
207c0 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a  th that case..**
207d0 0a 2a 2a 20 20 28 32 31 29 20 20 49 66 20 74 68  .**  (21)  If th
207e0 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
207f0 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f  LIMIT then the o
20800 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
20810 6f 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20  ot be.**        
20820 44 49 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20  DISTINCT.  (See 
20830 74 69 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36  ticket [752e1646
20840 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32  fc])..**.**  (22
20850 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
20860 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 72 65 63  may not be a rec
20870 75 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a  ursive CTE..**.*
20880 2a 20 20 28 2a 2a 29 20 20 53 75 62 73 75 6d 65  *  (**)  Subsume
20890 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69  d into restricti
208a0 6f 6e 20 28 31 37 64 33 29 2e 20 20 57 61 73 3a  on (17d3).  Was:
208b0 20 49 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   If the outer qu
208c0 65 72 79 20 69 73 0a 2a 2a 20 20 20 20 20 20 20  ery is.**       
208d0 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45   a recursive CTE
208e0 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 2d 71  , then the sub-q
208f0 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20  uery may not be 
20900 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
20910 2e 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 69 73  ..**        This
20920 20 72 65 73 74 72 69 63 74 69 6f 6e 20 69 73 20   restriction is 
20930 62 65 63 61 75 73 65 20 74 72 61 6e 73 66 6f 72  because transfor
20940 6d 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20  ming the.**     
20950 20 20 20 70 61 72 65 6e 74 20 74 6f 20 61 20 63     parent to a c
20960 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 63 6f  ompound query co
20970 6e 66 75 73 65 73 20 74 68 65 20 63 6f 64 65 20  nfuses the code 
20980 74 68 61 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20  that handles.** 
20990 20 20 20 20 20 20 20 72 65 63 75 72 73 69 76 65         recursive
209a0 20 71 75 65 72 69 65 73 20 69 6e 20 6d 75 6c 74   queries in mult
209b0 69 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a  iSelect()..**.**
209c0 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f    (**)  We no lo
209d0 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20  nger attempt to 
209e0 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61 74  flatten aggregat
209f0 65 20 73 75 62 71 75 65 72 69 65 73 2e 20 20 57  e subqueries.  W
20a00 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68  as:.**        Th
20a10 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  e subquery may n
20a20 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65 67 61  ot be an aggrega
20a30 74 65 20 74 68 61 74 20 75 73 65 73 20 74 68 65  te that uses the
20a40 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 20   built-in min() 
20a50 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72  or .**        or
20a60 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 73   max() functions
20a70 2e 20 20 28 57 69 74 68 6f 75 74 20 74 68 69 73  .  (Without this
20a80 20 72 65 73 74 72 69 63 74 69 6f 6e 2c 20 61 20   restriction, a 
20a90 71 75 65 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20  query like:.**  
20aa0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 78 20        "SELECT x 
20ab0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 6d 61 78  FROM (SELECT max
20ac0 28 79 29 2c 20 78 20 46 52 4f 4d 20 74 31 29 22  (y), x FROM t1)"
20ad0 20 77 6f 75 6c 64 20 6e 6f 74 20 6e 65 63 65 73   would not neces
20ae0 73 61 72 69 6c 79 0a 2a 2a 20 20 20 20 20 20 20  sarily.**       
20af0 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   return the valu
20b00 65 20 58 20 66 6f 72 20 77 68 69 63 68 20 59 20  e X for which Y 
20b10 77 61 73 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a  was maximal.).**
20b20 0a 2a 2a 20 20 28 32 35 29 20 20 49 66 20 65 69  .**  (25)  If ei
20b30 74 68 65 72 20 74 68 65 20 73 75 62 71 75 65 72  ther the subquer
20b40 79 20 6f 72 20 74 68 65 20 70 61 72 65 6e 74 20  y or the parent 
20b50 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 61  query contains a
20b60 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 20 20 20   window.**      
20b70 20 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68    function in th
20b80 65 20 73 65 6c 65 63 74 20 6c 69 73 74 20 6f 72  e select list or
20b90 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
20ba0 2c 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20  , flattening.** 
20bb0 20 20 20 20 20 20 20 69 73 20 6e 6f 74 20 61 74         is not at
20bc0 74 65 6d 70 74 65 64 2e 0a 2a 2a 0a 2a 2a 0a 2a  tempted..**.**.*
20bd0 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  * In this routin
20be0 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d  e, the "p" param
20bf0 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65  eter is a pointe
20c00 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71  r to the outer q
20c10 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62  uery..** The sub
20c20 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63  query is p->pSrc
20c30 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41  ->a[iFrom].  isA
20c40 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  gg is true if th
20c50 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a  e outer query.**
20c60 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73   uses aggregates
20c70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74  ..**.** If flatt
20c80 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74  ening is not att
20c90 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75  empted, this rou
20ca0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
20cb0 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a  and returns 0..*
20cc0 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
20cd0 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69  is attempted thi
20ce0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
20cf0 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  s 1..**.** All o
20d00 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
20d10 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f   analysis must o
20d20 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65  ccur on both the
20d30 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
20d40 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79  .** the subquery
20d50 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
20d60 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74  tine runs..*/.st
20d70 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e  atic int flatten
20d80 53 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73  Subquery(.  Pars
20d90 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
20da0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
20db0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
20dc0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
20dd0 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f   The parent or o
20de0 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74  uter SELECT stat
20df0 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
20e00 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  From,           
20e10 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70  /* Index in p->p
20e20 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20  Src->a[] of the 
20e30 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a  inner subquery *
20e40 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 20 20 20  /.  int isAgg   
20e50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
20e60 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54   if outer SELECT
20e70 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
20e80 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  functions */.){.
20e90 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
20ea0 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20  avedAuthContext 
20eb0 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43  = pParse->zAuthC
20ec0 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74  ontext;.  Select
20ed0 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 2f 2a   *pParent;    /*
20ee0 20 43 75 72 72 65 6e 74 20 55 4e 49 4f 4e 20 41   Current UNION A
20ef0 4c 4c 20 74 65 72 6d 20 6f 66 20 74 68 65 20 6f  LL term of the o
20f00 74 68 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  ther query */.  
20f10 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20  Select *pSub;   
20f20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72      /* The inner
20f30 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75   query or "subqu
20f40 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ery" */.  Select
20f50 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a   *pSub1;      /*
20f60 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
20f70 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74  rightmost select
20f80 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f   in sub-query */
20f90 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
20fa0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ;      /* The FR
20fb0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
20fc0 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
20fd0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53    SrcList *pSubS
20fe0 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  rc;   /* The FRO
20ff0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
21000 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  subquery */.  in
21010 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20  t iParent;      
21020 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72    /* VDBE cursor
21030 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
21040 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20 74  Sub result set t
21050 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  emp table */.  i
21060 6e 74 20 69 4e 65 77 50 61 72 65 6e 74 20 3d 20  nt iNewParent = 
21070 2d 31 3b 2f 2a 20 52 65 70 6c 61 63 65 6d 65 6e  -1;/* Replacemen
21080 74 20 74 61 62 6c 65 20 66 6f 72 20 69 50 61 72  t table for iPar
21090 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c  ent */.  int isL
210a0 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 20 2f 2a 20  eftJoin = 0; /* 
210b0 54 72 75 65 20 69 66 20 70 53 75 62 20 69 73 20  True if pSub is 
210c0 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f  the right side o
210d0 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f  f a LEFT JOIN */
210e0 20 20 20 20 0a 20 20 69 6e 74 20 69 3b 20 20 20      .  int i;   
210f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
21100 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
21110 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
21120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21130 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
21140 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
21150 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
21160 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68  Subitem;   /* Th
21170 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
21180 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
21190 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
211a0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
211b0 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
211c0 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e  rmitted.  Return
211d0 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a   0 if not..  */.
211e0 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
211f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
21200 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 69 66  Prior==0 );.  if
21210 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  ( OptimizationDi
21220 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  sabled(db, SQLIT
21230 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72  E_QueryFlattener
21240 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
21250 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
21260 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26    assert( pSrc &
21270 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46  & iFrom>=0 && iF
21280 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29  rom<pSrc->nSrc )
21290 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26  ;.  pSubitem = &
212a0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a  pSrc->a[iFrom];.
212b0 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62    iParent = pSub
212c0 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  item->iCursor;. 
212d0 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d   pSub = pSubitem
212e0 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73  ->pSelect;.  ass
212f0 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a  ert( pSub!=0 );.
21300 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21310 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a  OMIT_WINDOWFUNC.
21320 20 20 69 66 28 20 70 2d 3e 70 57 69 6e 20 7c 7c    if( p->pWin ||
21330 20 70 53 75 62 2d 3e 70 57 69 6e 20 29 20 72 65   pSub->pWin ) re
21340 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
21350 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
21360 72 69 63 74 69 6f 6e 20 28 32 35 29 20 2a 2f 0a  riction (25) */.
21370 23 65 6e 64 69 66 0a 0a 20 20 70 53 75 62 53 72  #endif..  pSubSr
21380 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a  c = pSub->pSrc;.
21390 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72    assert( pSubSr
213a0 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20  c );.  /* Prior 
213b0 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32  to version 3.1.2
213c0 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64  , when LIMIT and
213d0 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20 62   OFFSET had to b
213e0 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e  e simple constan
213f0 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62  ts,.  ** not arb
21400 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f  itrary expressio
21410 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73  ns, we allowed s
21420 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66  ome combining of
21430 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
21440 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74  T.  ** because t
21450 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d  hey could be com
21460 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  puted at compile
21470 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e  -time.  But when
21480 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
21490 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72  T.  ** became ar
214a0 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69  bitrary expressi
214b0 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72  ons, we were for
214c0 63 65 64 20 74 6f 20 61 64 64 20 72 65 73 74 72  ced to add restr
214d0 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a  ictions (13).  *
214e0 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20  * and (14). */. 
214f0 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
21500 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29  t && p->pLimit )
21510 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
21520 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
21530 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20  iction (13) */. 
21540 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
21550 74 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69  t && pSub->pLimi
21560 74 2d 3e 70 52 69 67 68 74 20 29 20 72 65 74 75  t->pRight ) retu
21570 72 6e 20 30 3b 20 20 20 2f 2a 20 52 65 73 74 72  rn 0;   /* Restr
21580 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20  iction (14) */. 
21590 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
215a0 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e 64 29  s & SF_Compound)
215b0 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 4c 69  !=0 && pSub->pLi
215c0 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  mit ){.    retur
215d0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
215e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21600 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
21610 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  15) */.  }.  if(
21620 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d   pSubSrc->nSrc==
21630 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
21640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21650 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
21660 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28  on (7)  */.  if(
21670 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
21680 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20  & SF_Distinct ) 
21690 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
216a0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
216b0 6f 6e 20 28 34 29 20 20 2a 2f 0a 20 20 69 66 28  on (4)  */.  if(
216c0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
216d0 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c   (pSrc->nSrc>1 |
216e0 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20  | isAgg) ){.    
216f0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
21700 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
21710 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d  ns (8)(9) */.  }
21720 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
21730 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  By && pSub->pOrd
21740 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74  erBy ){.     ret
21750 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
21760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21780 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
21790 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (11) */.  }.  if
217a0 28 20 69 73 41 67 67 20 26 26 20 70 53 75 62 2d  ( isAgg && pSub-
217b0 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75  >pOrderBy ) retu
217c0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
217d0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
217e0 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66  ion (16) */.  if
217f0 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
21800 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65  & p->pWhere ) re
21810 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
21820 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
21830 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66  ion (19) */.  if
21840 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
21850 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
21860 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
21870 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
21880 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
21890 73 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a  striction (21) *
218a0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  /.  }.  if( pSub
218b0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
218c0 5f 52 65 63 75 72 73 69 76 65 29 20 29 7b 0a 20  _Recursive) ){. 
218d0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
218e0 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 32 32  Restrictions (22
218f0 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  ) */.  }..  /*. 
21900 20 2a 2a 20 49 66 20 74 68 65 20 73 75 62 71 75   ** If the subqu
21910 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
21920 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45   operand of a LE
21930 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 74 68  FT JOIN, then th
21940 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20  e.  ** subquery 
21950 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69  may not be a joi
21960 6e 20 69 74 73 65 6c 66 20 28 33 61 29 2e 20 45  n itself (3a). E
21970 78 61 6d 70 6c 65 20 6f 66 20 77 68 79 20 74 68  xample of why th
21980 69 73 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61  is is not.  ** a
21990 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
219a0 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
219b0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32  T OUTER JOIN (t2
219c0 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20   JOIN t3).  **. 
219d0 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
219e0 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
219f0 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
21a00 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
21a10 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
21a20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a  t2) JOIN t3.  **
21a30 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e  .  ** which is n
21a40 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61  ot at all the sa
21a50 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20  me thing..  **. 
21a60 20 2a 2a 20 49 66 20 74 68 65 20 73 75 62 71 75   ** If the subqu
21a70 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
21a80 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45   operand of a LE
21a90 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 74 68  FT JOIN, then th
21aa0 65 20 6f 75 74 65 72 0a 20 20 2a 2a 20 71 75 65  e outer.  ** que
21ab0 72 79 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20  ry cannot be an 
21ac0 61 67 67 72 65 67 61 74 65 2e 20 28 33 63 29 20  aggregate. (3c) 
21ad0 20 54 68 69 73 20 69 73 20 61 6e 20 61 72 74 69   This is an arti
21ae0 66 61 63 74 20 6f 66 20 74 68 65 20 77 61 79 0a  fact of the way.
21af0 20 20 2a 2a 20 61 67 67 72 65 67 61 74 65 73 20    ** aggregates 
21b00 61 72 65 20 70 72 6f 63 65 73 73 65 64 20 2d 20  are processed - 
21b10 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 65 63 68  there is no mech
21b20 61 6e 69 73 6d 20 74 6f 20 64 65 74 65 72 6d 69  anism to determi
21b30 6e 65 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 4c  ne if.  ** the L
21b40 45 46 54 20 4a 4f 49 4e 20 74 61 62 6c 65 20 73  EFT JOIN table s
21b50 68 6f 75 6c 64 20 62 65 20 61 6c 6c 2d 4e 55 4c  hould be all-NUL
21b60 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65  L..  **.  ** See
21b70 20 61 6c 73 6f 20 74 69 63 6b 65 74 73 20 23 33   also tickets #3
21b80 30 36 2c 20 23 33 35 30 2c 20 61 6e 64 20 23 33  06, #350, and #3
21b90 33 30 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  300..  */.  if( 
21ba0 28 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f  (pSubitem->fg.jo
21bb0 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
21bc0 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 73 4c  R)!=0 ){.    isL
21bd0 65 66 74 4a 6f 69 6e 20 3d 20 31 3b 0a 20 20 20  eftJoin = 1;.   
21be0 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
21bf0 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 20 7c 7c  rc>1 || isAgg ||
21c00 20 49 73 56 69 72 74 75 61 6c 28 70 53 75 62 53   IsVirtual(pSubS
21c10 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20 29  rc->a[0].pTab) )
21c20 7b 0a 20 20 20 20 20 20 2f 2a 20 20 28 33 61 29  {.      /*  (3a)
21c30 20 20 20 20 20 20 20 20 20 20 20 20 20 28 33 63               (3c
21c40 29 20 20 20 20 20 28 33 62 29 20 2a 2f 0a 20 20  )     (3b) */.  
21c50 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
21c60 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53    }.  }.#ifdef S
21c70 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 46 4e 55  QLITE_EXTRA_IFNU
21c80 4c 4c 52 4f 57 0a 20 20 65 6c 73 65 20 69 66 28  LLROW.  else if(
21c90 20 69 46 72 6f 6d 3e 30 20 26 26 20 21 69 73 41   iFrom>0 && !isA
21ca0 67 67 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 74  gg ){.    /* Set
21cb0 74 69 6e 67 20 69 73 4c 65 66 74 4a 6f 69 6e 20  ting isLeftJoin 
21cc0 74 6f 20 2d 31 20 63 61 75 73 65 73 20 4f 50 5f  to -1 causes OP_
21cd0 49 66 4e 75 6c 6c 52 6f 77 20 6f 70 63 6f 64 65  IfNullRow opcode
21ce0 73 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65  s to be generate
21cf0 64 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65  d for.    ** eve
21d00 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ry reference to 
21d10 61 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  any result colum
21d20 6e 20 66 72 6f 6d 20 73 75 62 71 75 65 72 79 20  n from subquery 
21d30 69 6e 20 61 20 6a 6f 69 6e 2c 20 65 76 65 6e 0a  in a join, even.
21d40 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 74 68      ** though th
21d50 65 79 20 61 72 65 20 6e 6f 74 20 6e 65 63 65 73  ey are not neces
21d60 73 61 72 79 2e 20 20 54 68 69 73 20 77 69 6c 6c  sary.  This will
21d70 20 73 74 72 65 73 73 2d 74 65 73 74 20 74 68 65   stress-test the
21d80 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 20 0a 20   OP_IfNullRow . 
21d90 20 20 20 2a 2a 20 6f 70 63 6f 64 65 2e 20 2a 2f     ** opcode. */
21da0 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f 69 6e 20  .    isLeftJoin 
21db0 3d 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  = -1;.  }.#endif
21dc0 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  ..  /* Restricti
21dd0 6f 6e 20 28 31 37 29 3a 20 49 66 20 74 68 65 20  on (17): If the 
21de0 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
21df0 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20  ompound SELECT, 
21e00 74 68 65 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a  then it must.  *
21e10 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 55  * use only the U
21e20 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
21e30 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74  r. And none of t
21e40 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74  he simple select
21e50 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 68   queries.  ** th
21e60 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63  at make up the c
21e70 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61  ompound SELECT a
21e80 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  re allowed to be
21e90 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 64 69   aggregate or di
21ea0 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72  stinct.  ** quer
21eb0 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ies..  */.  if( 
21ec0 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  pSub->pPrior ){.
21ed0 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f      if( pSub->pO
21ee0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
21ef0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65  return 0;  /* Re
21f00 73 74 72 69 63 74 69 6f 6e 20 28 32 30 29 20 2a  striction (20) *
21f10 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  /.    }.    if( 
21f20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c  isAgg || (p->sel
21f30 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
21f40 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d  nct)!=0 || pSrc-
21f50 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20  >nSrc!=1 ){.    
21f60 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 28    return 0; /* (
21f70 31 37 64 31 29 2c 20 28 31 37 64 32 29 2c 20 6f  17d1), (17d2), o
21f80 72 20 28 31 37 64 33 29 20 2a 2f 0a 20 20 20 20  r (17d3) */.    
21f90 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31 3d  }.    for(pSub1=
21fa0 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53 75  pSub; pSub1; pSu
21fb0 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f 72  b1=pSub1->pPrior
21fc0 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
21fd0 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c  e( (pSub1->selFl
21fe0 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
21ff0 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
22000 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29  )==SF_Distinct )
22010 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
22020 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61  ( (pSub1->selFla
22030 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
22040 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
22050 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29  ==SF_Aggregate )
22060 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
22070 70 53 75 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b  pSub->pSrc!=0 );
22080 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22090 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  Sub->pEList->nEx
220a0 70 72 3d 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73  pr==pSub1->pELis
220b0 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
220c0 20 20 69 66 28 20 28 70 53 75 62 31 2d 3e 73 65    if( (pSub1->se
220d0 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
220e0 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
220f0 74 65 29 29 21 3d 30 20 20 20 20 2f 2a 20 28 31  te))!=0    /* (1
22100 37 62 29 20 2a 2f 0a 20 20 20 20 20 20 20 7c 7c  7b) */.       ||
22110 20 28 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20   (pSub1->pPrior 
22120 26 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b  && pSub1->op!=TK
22130 5f 41 4c 4c 29 20 20 20 20 20 20 20 20 20 20 20  _ALL)           
22140 20 20 20 20 20 20 2f 2a 20 28 31 37 61 29 20 2a        /* (17a) *
22150 2f 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62  /.       || pSub
22160 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31 20  1->pSrc->nSrc<1 
22170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22190 20 2f 2a 20 28 31 37 63 29 20 2a 2f 0a 20 20 20   /* (17c) */.   
221a0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65     ){.        re
221b0 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
221c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
221d0 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72  pSub1->pSrc->nSr
221e0 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  c>1 );.    }..  
221f0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
22200 20 28 31 38 29 2e 20 2a 2f 0a 20 20 20 20 69 66   (18). */.    if
22210 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
22220 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  .      int ii;. 
22230 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
22240 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  i<p->pOrderBy->n
22250 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
22260 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
22270 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e  erBy->a[ii].u.x.
22280 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29  iOrderByCol==0 )
22290 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
222a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
222b0 2f 2a 20 45 78 2d 72 65 73 74 72 69 63 74 69 6f  /* Ex-restrictio
222c0 6e 20 28 32 33 29 3a 0a 20 20 2a 2a 20 54 68 65  n (23):.  ** The
222d0 20 6f 6e 6c 79 20 77 61 79 20 74 68 61 74 20 74   only way that t
222e0 68 65 20 72 65 63 75 72 73 69 76 65 20 70 61 72  he recursive par
222f0 74 20 6f 66 20 61 20 43 54 45 20 63 61 6e 20 63  t of a CTE can c
22300 6f 6e 74 61 69 6e 20 61 20 63 6f 6d 70 6f 75 6e  ontain a compoun
22310 64 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20  d.  ** subquery 
22320 69 73 20 66 6f 72 20 74 68 65 20 73 75 62 71 75  is for the subqu
22330 65 72 79 20 74 6f 20 62 65 20 6f 6e 65 20 74 65  ery to be one te
22340 72 6d 20 6f 66 20 61 20 6a 6f 69 6e 2e 20 20 42  rm of a join.  B
22350 75 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 73  ut if the.  ** s
22360 75 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69  ubquery is a joi
22370 6e 2c 20 74 68 65 6e 20 74 68 65 20 66 6c 61 74  n, then the flat
22380 74 65 6e 69 6e 67 20 68 61 73 20 61 6c 72 65 61  tening has alrea
22390 64 79 20 62 65 65 6e 20 73 74 6f 70 70 65 64 20  dy been stopped 
223a0 62 79 0a 20 20 2a 2a 20 72 65 73 74 72 69 63 74  by.  ** restrict
223b0 69 6f 6e 20 28 31 37 64 33 29 0a 20 20 2a 2f 0a  ion (17d3).  */.
223c0 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65    assert( (p->se
223d0 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
223e0 72 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 53 75  rsive)==0 || pSu
223f0 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a  b->pPrior==0 );.
22400 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20  .  /***** If we 
22410 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
22420 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  , flattening is 
22430 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a  permitted. *****
22440 2f 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28  /.  SELECTTRACE(
22450 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 66 6c 61  1,pParse,p,("fla
22460 74 74 65 6e 20 25 75 2e 25 70 20 66 72 6f 6d 20  tten %u.%p from 
22470 74 65 72 6d 20 25 64 5c 6e 22 2c 0a 20 20 20 20  term %d\n",.    
22480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
22490 53 75 62 2d 3e 73 65 6c 49 64 2c 20 70 53 75 62  Sub->selId, pSub
224a0 2c 20 69 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a  , iFrom));..  /*
224b0 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73   Authorize the s
224c0 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61  ubquery */.  pPa
224d0 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
224e0 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  t = pSubitem->zN
224f0 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  ame;.  TESTONLY(
22500 69 20 3d 29 20 73 71 6c 69 74 65 33 41 75 74 68  i =) sqlite3Auth
22510 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
22520 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
22530 30 2c 20 30 29 3b 0a 20 20 74 65 73 74 63 61 73  0, 0);.  testcas
22540 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e  e( i==SQLITE_DEN
22550 59 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a  Y );.  pParse->z
22560 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53  AuthContext = zS
22570 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b  avedAuthContext;
22580 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75  ..  /* If the su
22590 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
225a0 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61  pound SELECT sta
225b0 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79  tement, then (by
225c0 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20   restrictions.  
225d0 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f  ** 17 and 18 abo
225e0 76 65 29 20 69 74 20 6d 75 73 74 20 62 65 20 61  ve) it must be a
225f0 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74   UNION ALL and t
22600 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
22610 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66  must .  ** be of
22620 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a   the form:.  **.
22630 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
22640 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d  <expr-list> FROM
22650 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c   (<sub-query>) <
22660 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20  where-clause> . 
22670 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65   **.  ** followe
22680 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42  d by any ORDER B
22690 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20  Y, LIMIT and/or 
226a0 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
226b0 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20  This block.  ** 
226c0 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69  creates N-1 copi
226d0 65 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  es of the parent
226e0 20 71 75 65 72 79 20 77 69 74 68 6f 75 74 20 61   query without a
226f0 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d  ny ORDER BY, LIM
22700 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53  IT or .  ** OFFS
22710 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a  ET clauses and j
22720 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65  oins them to the
22730 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20   left-hand-side 
22740 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  of the original.
22750 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e    ** using UNION
22760 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20   ALL operators. 
22770 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20 69  In this case N i
22780 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
22790 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65  simple.  ** sele
227a0 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ct statements in
227b0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75   the compound su
227c0 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20  b-query..  **.  
227d0 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  ** Example:.  **
227e0 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
227f0 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a   a+1 FROM (.  **
22800 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78          SELECT x
22810 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20   FROM tab.  **  
22820 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a        UNION ALL.
22830 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
22840 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20  CT y FROM tab.  
22850 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  **        UNION 
22860 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ALL.  **        
22870 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20  SELECT abs(z*2) 
22880 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20  FROM tab2.  **  
22890 20 20 20 29 20 57 48 45 52 45 20 61 21 3d 35 20     ) WHERE a!=5 
228a0 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a  ORDER BY 1.  **.
228b0 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64    ** Transformed
228c0 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   into:.  **.  **
228d0 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20       SELECT x+1 
228e0 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78  FROM tab WHERE x
228f0 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55  +1!=5.  **     U
22900 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
22910 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f    SELECT y+1 FRO
22920 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b 31 21  M tab WHERE y+1!
22930 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f  =5.  **     UNIO
22940 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  N ALL.  **     S
22950 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31  ELECT abs(z*2)+1
22960 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45   FROM tab2 WHERE
22970 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20   abs(z*2)+1!=5. 
22980 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59   **     ORDER BY
22990 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20   1.  **.  ** We 
229a0 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63  call this the "c
229b0 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
229c0 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20   flattening"..  
229d0 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53  */.  for(pSub=pS
229e0 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62  ub->pPrior; pSub
229f0 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  ; pSub=pSub->pPr
22a00 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ior){.    Select
22a10 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72   *pNew;.    Expr
22a20 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
22a30 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
22a40 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d    Expr *pLimit =
22a50 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
22a60 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d  Select *pPrior =
22a70 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
22a80 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
22a90 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30  .    p->pSrc = 0
22aa0 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  ;.    p->pPrior 
22ab0 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d  = 0;.    p->pLim
22ac0 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  it = 0;.    pNew
22ad0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
22ae0 44 75 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20  Dup(db, p, 0);. 
22af0 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
22b00 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f  Limit;.    p->pO
22b10 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
22b20 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d  y;.    p->pSrc =
22b30 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70   pSrc;.    p->op
22b40 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69   = TK_ALL;.    i
22b50 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
22b60 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
22b70 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73  pPrior;.    }els
22b80 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  e{.      pNew->p
22b90 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
22ba0 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72        if( pPrior
22bb0 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74   ) pPrior->pNext
22bc0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70   = pNew;.      p
22bd0 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a  New->pNext = p;.
22be0 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
22bf0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 53 45  = pNew;.      SE
22c00 4c 45 43 54 54 52 41 43 45 28 32 2c 70 50 61 72  LECTTRACE(2,pPar
22c10 73 65 2c 70 2c 28 22 63 6f 6d 70 6f 75 6e 64 2d  se,p,("compound-
22c20 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e  subquery flatten
22c30 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  er".            
22c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c50 20 20 22 20 63 72 65 61 74 65 73 20 25 75 20 61    " creates %u a
22c60 73 20 70 65 65 72 5c 6e 22 2c 70 4e 65 77 2d 3e  s peer\n",pNew->
22c70 73 65 6c 49 64 29 29 3b 0a 20 20 20 20 7d 0a 20  selId));.    }. 
22c80 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
22c90 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
22ca0 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65   1;.  }..  /* Be
22cb0 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74  gin flattening t
22cc0 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72  he iFrom-th entr
22cd0 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
22ce0 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68  ause .  ** in th
22cf0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
22d00 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75   */.  pSub = pSu
22d10 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  b1 = pSubitem->p
22d20 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65  Select;..  /* De
22d30 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73 69 65  lete the transie
22d40 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
22d50 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  re associated wi
22d60 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  th the.  ** subq
22d70 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  uery.  */.  sqli
22d80 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
22d90 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
22da0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
22db0 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
22dc0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ->zName);.  sqli
22dd0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
22de0 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ubitem->zAlias);
22df0 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61  .  pSubitem->zDa
22e00 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53  tabase = 0;.  pS
22e10 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ubitem->zName = 
22e20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  0;.  pSubitem->z
22e30 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75  Alias = 0;.  pSu
22e40 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  bitem->pSelect =
22e50 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20   0;..  /* Defer 
22e60 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62  deleting the Tab
22e70 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69  le object associ
22e80 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  ated with the.  
22e90 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74 69  ** subquery unti
22ea0 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  l code generatio
22eb0 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65  n is.  ** comple
22ec0 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20  te, since there 
22ed0 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20  may still exist 
22ee0 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65  Expr.pTab entrie
22ef0 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65  s that.  ** refe
22f00 72 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  r to the subquer
22f10 79 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61  y even after fla
22f20 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74  ttening.  Ticket
22f30 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a   #3346..  **.  *
22f40 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  * pSubitem->pTab
22f50 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e   is always non-N
22f60 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73 74  ULL by test rest
22f70 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65 73  rictions and tes
22f80 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20  ts above..  */. 
22f90 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 75 62   if( ALWAYS(pSub
22fa0 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29  item->pTab!=0) )
22fb0 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
22fc0 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65  bToDel = pSubite
22fd0 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
22fe0 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 54 61 62   pTabToDel->nTab
22ff0 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Ref==1 ){.      
23000 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
23010 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
23020 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
23030 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c  .      pTabToDel
23040 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20  ->pNextZombie = 
23050 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62  pToplevel->pZomb
23060 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f  ieTab;.      pTo
23070 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54  plevel->pZombieT
23080 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a  ab = pTabToDel;.
23090 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
230a0 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 54 61 62   pTabToDel->nTab
230b0 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  Ref--;.    }.   
230c0 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20   pSubitem->pTab 
230d0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  = 0;.  }..  /* T
230e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f  he following loo
230f0 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  p runs once for 
23100 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61 20 63  each term in a c
23110 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
23120 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67  .  ** flattening
23130 20 28 61 73 20 64 65 73 63 72 69 62 65 64 20 61   (as described a
23140 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20 61 72  bove).  If we ar
23150 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66 65 72  e doing a differ
23160 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66  ent kind.  ** of
23170 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61 20   flattening - a 
23180 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68 65 72  flattening other
23190 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64   than a compound
231a0 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65  -subquery flatte
231b0 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e  ning -.  ** then
231c0 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20   this loop only 
231d0 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a  runs once..  **.
231e0 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d    ** This loop m
231f0 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68 65 20  oves all of the 
23200 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66  FROM elements of
23210 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e   the subquery in
23220 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  to the.  ** the 
23230 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
23240 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
23250 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68   Before doing th
23260 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a  is, remember.  *
23270 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  * the cursor num
23280 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67  ber for the orig
23290 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79  inal outer query
232a0 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e   FROM element in
232b0 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20  .  ** iParent.  
232c0 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72 73  The iParent curs
232d0 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  or will never be
232e0 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75 65   used.  Subseque
232f0 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c  nt code.  ** wil
23300 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f  l scan expressio
23310 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69  ns looking for i
23320 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65  Parent reference
23330 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20  s and replace.  
23340 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e  ** those referen
23350 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73 73  ces with express
23360 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76  ions that resolv
23370 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  e to the subquer
23380 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d  y FROM.  ** elem
23390 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20  ents we are now 
233a0 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f  copying in..  */
233b0 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74 3d 70  .  for(pParent=p
233c0 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61 72 65  ; pParent; pPare
233d0 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72 69  nt=pParent->pPri
233e0 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e 70  or, pSub=pSub->p
233f0 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20  Prior){.    int 
23400 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 75 38 20  nSubSrc;.    u8 
23410 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
23420 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62    pSubSrc = pSub
23430 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46  ->pSrc;     /* F
23440 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 73 75  ROM clause of su
23450 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53  bquery */.    nS
23460 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d  ubSrc = pSubSrc-
23470 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65  >nSrc;  /* Numbe
23480 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 73 75  r of terms in su
23490 62 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75  bquery FROM clau
234a0 73 65 20 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d  se */.    pSrc =
234b0 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20   pParent->pSrc; 
234c0 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
234d0 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
234e0 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66  query */..    if
234f0 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20  ( pSrc ){.      
23500 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d  assert( pParent=
23510 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72 73 74 20  =p );  /* First 
23520 74 69 6d 65 20 74 68 72 6f 75 67 68 20 74 68 65  time through the
23530 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a   loop */.      j
23540 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74  ointype = pSubit
23550 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b  em->fg.jointype;
23560 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
23570 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
23580 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20  t!=p );  /* 2nd 
23590 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 74  and subsequent t
235a0 69 6d 65 73 20 74 68 72 6f 75 67 68 20 74 68 65  imes through the
235b0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70   loop */.      p
235c0 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  Src = pParent->p
235d0 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
235e0 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 30  ListAppend(db, 0
235f0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
23600 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20  f( pSrc==0 ){.  
23610 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
23620 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
23630 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
23640 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
23650 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75      /* The subqu
23660 65 72 79 20 75 73 65 73 20 61 20 73 69 6e 67 6c  ery uses a singl
23670 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 20 46 52  e slot of the FR
23680 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
23690 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 71 75   outer.    ** qu
236a0 65 72 79 2e 20 20 49 66 20 74 68 65 20 73 75 62  ery.  If the sub
236b0 71 75 65 72 79 20 68 61 73 20 6d 6f 72 65 20 74  query has more t
236c0 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20  han one element 
236d0 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75  in its FROM clau
236e0 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  se,.    ** then 
236f0 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72  expand the outer
23700 20 71 75 65 72 79 20 74 6f 20 6d 61 6b 65 20 73   query to make s
23710 70 61 63 65 20 66 6f 72 20 69 74 20 74 6f 20 68  pace for it to h
23720 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73  old all elements
23730 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
23740 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a  ubquery..    **.
23750 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a      ** Example:.
23760 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
23770 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
23780 61 62 41 2c 20 28 53 45 4c 45 43 54 20 2a 20 46  abA, (SELECT * F
23790 52 4f 4d 20 73 75 62 31 2c 20 73 75 62 32 29 2c  ROM sub1, sub2),
237a0 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20 20   tabB;.    **.  
237b0 20 20 2a 2a 20 54 68 65 20 6f 75 74 65 72 20 71    ** The outer q
237c0 75 65 72 79 20 68 61 73 20 33 20 73 6c 6f 74 73  uery has 3 slots
237d0 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61   in its FROM cla
237e0 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20 6f  use.  One slot o
237f0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74  f the.    ** out
23800 65 72 20 71 75 65 72 79 20 28 74 68 65 20 6d 69  er query (the mi
23810 64 64 6c 65 20 73 6c 6f 74 29 20 69 73 20 75 73  ddle slot) is us
23820 65 64 20 62 79 20 74 68 65 20 73 75 62 71 75 65  ed by the subque
23830 72 79 2e 20 20 54 68 65 20 6e 65 78 74 0a 20 20  ry.  The next.  
23840 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63 6f    ** block of co
23850 64 65 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 74  de will expand t
23860 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 46  he outer query F
23870 52 4f 4d 20 63 6c 61 75 73 65 20 74 6f 20 34 20  ROM clause to 4 
23880 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68  slots..    ** Th
23890 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 20 69 73  e middle slot is
238a0 20 65 78 70 61 6e 64 65 64 20 74 6f 20 74 77 6f   expanded to two
238b0 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72 20   slots in order 
238c0 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 0a 20 20  to make space.  
238d0 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 77 6f    ** for the two
238e0 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
238f0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
23900 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
23910 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53 75    */.    if( nSu
23920 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20  bSrc>1 ){.      
23930 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
23940 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
23950 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c  cListEnlarge(db,
23960 20 70 53 72 63 2c 20 6e 53 75 62 53 72 63 2d 31   pSrc, nSubSrc-1
23970 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20  ,iFrom+1);.     
23980 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
23990 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
239a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
239b0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72      }..    /* Tr
239c0 61 6e 73 66 65 72 20 74 68 65 20 46 52 4f 4d 20  ansfer the FROM 
239d0 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 72 6f  clause terms fro
239e0 6d 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  m the subquery i
239f0 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f  nto the.    ** o
23a00 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20  uter query..    
23a10 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
23a20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b  i<nSubSrc; i++){
23a30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 64  .      sqlite3Id
23a40 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
23a50 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e  Src->a[i+iFrom].
23a60 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 20 20 61  pUsing);.      a
23a70 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69  ssert( pSrc->a[i
23a80 2b 69 46 72 6f 6d 5d 2e 66 67 2e 69 73 54 61 62  +iFrom].fg.isTab
23a90 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Func==0 );.     
23aa0 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d   pSrc->a[i+iFrom
23ab0 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69  ] = pSubSrc->a[i
23ac0 5d 3b 0a 20 20 20 20 20 20 69 4e 65 77 50 61 72  ];.      iNewPar
23ad0 65 6e 74 20 3d 20 70 53 75 62 53 72 63 2d 3e 61  ent = pSubSrc->a
23ae0 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20  [i].iCursor;.   
23af0 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53     memset(&pSubS
23b00 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a  rc->a[i], 0, siz
23b10 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69  eof(pSubSrc->a[i
23b20 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ]));.    }.    p
23b30 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66 67  Src->a[iFrom].fg
23b40 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e  .jointype = join
23b50 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  type;.  .    /* 
23b60 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74 69  Now begin substi
23b70 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79 20  tuting subquery 
23b80 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72 65  result set expre
23b90 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20  ssions for .    
23ba0 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ** references to
23bb0 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20   the iParent in 
23bc0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
23bd0 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20  .    ** .    ** 
23be0 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a  Example:.    **.
23bf0 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
23c00 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28  a+5, b*10 FROM (
23c10 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c  SELECT x*3 AS a,
23c20 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20   y+10 AS b FROM 
23c30 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20  t1) WHERE a>b;. 
23c40 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20     **   \       
23c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f                \_
23c60 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62  ____________ sub
23c70 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  query __________
23c80 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20  /          /.   
23c90 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f   **    \________
23ca0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75  _____________ ou
23cb0 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f  ter query ______
23cc0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23cd0 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a  ________/.    **
23ce0 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20  .    ** We look 
23cf0 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73 73  at every express
23d00 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72  ion in the outer
23d10 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72 79   query and every
23d20 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20   place we see.  
23d30 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73    ** "a" we subs
23d40 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64  titute "x*3" and
23d50 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20   every place we 
23d60 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73 74  see "b" we subst
23d70 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20  itute "y+10"..  
23d80 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75    */.    if( pSu
23d90 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
23da0 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20       /* At this 
23db0 70 6f 69 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d 7a  point, any non-z
23dc0 65 72 6f 20 69 4f 72 64 65 72 42 79 43 6f 6c 20  ero iOrderByCol 
23dd0 76 61 6c 75 65 73 20 69 6e 64 69 63 61 74 65 20  values indicate 
23de0 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
23df0 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 6c 75 6d  * ORDER BY colum
23e00 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
23e10 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 74 68 65  identical to the
23e20 20 69 4f 72 64 65 72 42 79 43 6f 6c 27 74 68 0a   iOrderByCol'th.
23e30 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
23e40 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20  ion returned by 
23e50 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
23e60 20 70 53 75 62 2e 20 53 69 6e 63 65 20 74 68 65   pSub. Since the
23e70 73 65 20 76 61 6c 75 65 73 0a 20 20 20 20 20 20  se values.      
23e80 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 63 65 73 73  ** do not necess
23e90 61 72 69 6c 79 20 63 6f 72 72 65 73 70 6f 6e 64  arily correspond
23ea0 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 53   to columns in S
23eb0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
23ec0 70 50 61 72 65 6e 74 2c 0a 20 20 20 20 20 20 2a  pParent,.      *
23ed0 2a 20 7a 65 72 6f 20 74 68 65 6d 20 62 65 66 6f  * zero them befo
23ee0 72 65 20 74 72 61 6e 73 66 65 72 69 6e 67 20 74  re transfering t
23ef0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
23f00 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  se..      **.   
23f10 20 20 20 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67 20     ** Not doing 
23f20 74 68 69 73 20 6d 61 79 20 63 61 75 73 65 20 61  this may cause a
23f30 6e 20 65 72 72 6f 72 20 69 66 20 61 20 73 75 62  n error if a sub
23f40 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20  sequent call to 
23f50 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75  this.      ** fu
23f60 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
23f70 74 6f 20 66 6c 61 74 74 65 6e 20 61 20 63 6f 6d  to flatten a com
23f80 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 20  pound sub-query 
23f90 69 6e 74 6f 20 70 50 61 72 65 6e 74 0a 20 20 20  into pParent.   
23fa0 20 20 20 2a 2a 20 28 74 68 65 20 6f 6e 6c 79 20     ** (the only 
23fb0 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61 70  way this can hap
23fc0 70 65 6e 20 69 73 20 69 66 20 74 68 65 20 63 6f  pen is if the co
23fd0 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79  mpound sub-query
23fe0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 75 72   is.      ** cur
23ff0 72 65 6e 74 6c 79 20 70 61 72 74 20 6f 66 20 70  rently part of p
24000 53 75 62 2d 3e 70 53 72 63 29 2e 20 53 65 65 20  Sub->pSrc). See 
24010 74 69 63 6b 65 74 20 5b 64 31 31 61 36 65 39 30  ticket [d11a6e90
24020 38 66 5d 2e 20 20 2a 2f 0a 20 20 20 20 20 20 45  8f].  */.      E
24030 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
24040 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  y = pSub->pOrder
24050 42 79 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  By;.      for(i=
24060 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
24070 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
24080 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b      pOrderBy->a[
24090 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  i].u.x.iOrderByC
240a0 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ol = 0;.      }.
240b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
240c0 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d  arent->pOrderBy=
240d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  =0 );.      pPar
240e0 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  ent->pOrderBy = 
240f0 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
24100 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pSub->pOrderBy =
24110 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57   0;.    }.    pW
24120 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
24130 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e  prDup(db, pSub->
24140 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20  pWhere, 0);.    
24150 69 66 28 20 69 73 4c 65 66 74 4a 6f 69 6e 3e 30  if( isLeftJoin>0
24160 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4a 6f 69   ){.      setJoi
24170 6e 45 78 70 72 28 70 57 68 65 72 65 2c 20 69 4e  nExpr(pWhere, iN
24180 65 77 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d  ewParent);.    }
24190 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57  .    pParent->pW
241a0 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
241b0 70 72 41 6e 64 28 64 62 2c 20 70 57 68 65 72 65  prAnd(db, pWhere
241c0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72  , pParent->pWher
241d0 65 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  e);.    if( db->
241e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
241f0 29 7b 0a 20 20 20 20 20 20 53 75 62 73 74 43 6f  ){.      SubstCo
24200 6e 74 65 78 74 20 78 3b 0a 20 20 20 20 20 20 78  ntext x;.      x
24210 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
24220 3b 0a 20 20 20 20 20 20 78 2e 69 54 61 62 6c 65  ;.      x.iTable
24230 20 3d 20 69 50 61 72 65 6e 74 3b 0a 20 20 20 20   = iParent;.    
24240 20 20 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20    x.iNewTable = 
24250 69 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20 20 20  iNewParent;.    
24260 20 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20 3d    x.isLeftJoin =
24270 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 0a 20 20 20   isLeftJoin;.   
24280 20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20 70 53     x.pEList = pS
24290 75 62 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  ub->pEList;.    
242a0 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 26 78    substSelect(&x
242b0 2c 20 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20  , pParent, 0);. 
242c0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54     }.  .    /* T
242d0 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65  he flattened que
242e0 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69  ry is distinct i
242f0 66 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e  f either the inn
24300 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  er or the.    **
24310 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
24320 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a  distinct. .    *
24330 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73  /.    pParent->s
24340 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d  elFlags |= pSub-
24350 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
24360 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20  istinct;.  .    
24370 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  /*.    ** SELECT
24380 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43   ... FROM (SELEC
24390 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46  T ... LIMIT a OF
243a0 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20  FSET b) LIMIT x 
243b0 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a  OFFSET y;.    **
243c0 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74  .    ** One is t
243d0 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f  empted to try to
243e0 20 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20   add a and b to 
243f0 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69  combine the limi
24400 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20  ts.  But this.  
24410 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f    ** does not wo
24420 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d  rk if either lim
24430 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a  it is negative..
24440 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
24450 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  Sub->pLimit ){. 
24460 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c       pParent->pL
24470 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69  imit = pSub->pLi
24480 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75 62 2d  mit;.      pSub-
24490 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
244a0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
244b0 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68  ially, delete wh
244c0 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68  at is left of th
244d0 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72  e subquery and r
244e0 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65  eturn.  ** succe
244f0 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ss..  */.  sqlit
24500 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
24510 62 2c 20 70 53 75 62 31 29 3b 0a 0a 23 69 66 20  b, pSub1);..#if 
24520 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
24530 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LED.  if( sqlite
24540 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
24550 78 31 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45  x100 ){.    SELE
24560 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50  CTTRACE(0x100,pP
24570 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 66  arse,p,("After f
24580 6c 61 74 74 65 6e 69 6e 67 3a 5c 6e 22 29 29 3b  lattening:\n"));
24590 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
245a0 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
245b0 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
245c0 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
245d0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
245e0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
245f0 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
24600 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
24610 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  VIEW) */../*.** 
24620 41 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 6b  A structure to k
24630 65 65 70 20 74 72 61 63 6b 20 6f 66 20 61 6c 6c  eep track of all
24640 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76   of the column v
24650 61 6c 75 65 73 20 74 68 61 74 20 61 72 65 20 66  alues that are f
24660 69 78 65 64 20 74 6f 0a 2a 2a 20 61 20 6b 6e 6f  ixed to.** a kno
24670 77 6e 20 76 61 6c 75 65 20 64 75 65 20 74 6f 20  wn value due to 
24680 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
24690 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20  straints of the 
246a0 66 6f 72 6d 20 43 4f 4c 55 4d 4e 3d 56 41 4c 55  form COLUMN=VALU
246b0 45 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  E..*/.typedef st
246c0 72 75 63 74 20 57 68 65 72 65 43 6f 6e 73 74 20  ruct WhereConst 
246d0 57 68 65 72 65 43 6f 6e 73 74 3b 0a 73 74 72 75  WhereConst;.stru
246e0 63 74 20 57 68 65 72 65 43 6f 6e 73 74 20 7b 0a  ct WhereConst {.
246f0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
24700 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
24710 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ntext */.  int n
24720 43 6f 6e 73 74 3b 20 20 20 20 20 20 2f 2a 20 4e  Const;      /* N
24730 75 6d 62 65 72 20 66 6f 72 20 43 4f 4c 55 4d 4e  umber for COLUMN
24740 3d 43 4f 4e 53 54 41 4e 54 20 74 65 72 6d 73 20  =CONSTANT terms 
24750 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 6e 67 3b 20  */.  int nChng; 
24760 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
24770 6f 66 20 74 69 6d 65 73 20 61 20 63 6f 6e 73 74  of times a const
24780 61 6e 74 20 69 73 20 70 72 6f 70 61 67 61 74 65  ant is propagate
24790 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 61 70  d */.  Expr **ap
247a0 45 78 70 72 3b 20 20 20 2f 2a 20 5b 69 2a 32 5d  Expr;   /* [i*2]
247b0 20 69 73 20 43 4f 4c 55 4d 4e 20 61 6e 64 20 5b   is COLUMN and [
247c0 69 2a 32 2b 31 5d 20 69 73 20 56 41 4c 55 45 20  i*2+1] is VALUE 
247d0 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  */.};../*.** Add
247e0 20 61 20 6e 65 77 20 65 6e 74 72 79 20 74 6f 20   a new entry to 
247f0 74 68 65 20 70 43 6f 6e 73 74 20 6f 62 6a 65 63  the pConst objec
24800 74 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e  t.  Except, do n
24810 6f 74 20 61 64 64 20 64 75 70 6c 69 63 61 74 65  ot add duplicate
24820 0a 2a 2a 20 70 43 6f 6c 75 6d 6e 20 65 6e 74 69  .** pColumn enti
24830 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  res..*/.static v
24840 6f 69 64 20 63 6f 6e 73 74 49 6e 73 65 72 74 28  oid constInsert(
24850 0a 20 20 57 68 65 72 65 43 6f 6e 73 74 20 2a 70  .  WhereConst *p
24860 43 6f 6e 73 74 2c 20 20 20 20 20 20 2f 2a 20 54  Const,      /* T
24870 68 65 20 57 68 65 72 65 43 6f 6e 73 74 20 69 6e  he WhereConst in
24880 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20  to which we are 
24890 69 6e 73 65 72 74 69 6e 67 20 2a 2f 0a 20 20 45  inserting */.  E
248a0 78 70 72 20 2a 70 43 6f 6c 75 6d 6e 2c 20 20 20  xpr *pColumn,   
248b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 43          /* The C
248c0 4f 4c 55 4d 4e 20 70 61 72 74 20 6f 66 20 74 68  OLUMN part of th
248d0 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  e constraint */.
248e0 20 20 45 78 70 72 20 2a 70 56 61 6c 75 65 20 20    Expr *pValue  
248f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
24900 65 20 56 41 4c 55 45 20 70 61 72 74 20 6f 66 20  e VALUE part of 
24910 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  the constraint *
24920 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
24930 61 73 73 65 72 74 28 20 70 43 6f 6c 75 6d 6e 2d  assert( pColumn-
24940 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
24950 3b 0a 0a 20 20 2f 2a 20 32 30 31 38 2d 31 30 2d  ;..  /* 2018-10-
24960 32 35 20 74 69 63 6b 65 74 20 5b 63 66 35 65 64  25 ticket [cf5ed
24970 32 30 66 5d 0a 20 20 2a 2a 20 4d 61 6b 65 20 73  20f].  ** Make s
24980 75 72 65 20 74 68 65 20 73 61 6d 65 20 70 43 6f  ure the same pCo
24990 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 69 6e 73 65  lumn is not inse
249a0 72 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f  rted more than o
249b0 6e 63 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  nce */.  for(i=0
249c0 3b 20 69 3c 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e  ; i<pConst->nCon
249d0 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  st; i++){.    co
249e0 6e 73 74 20 45 78 70 72 20 2a 70 45 78 70 72 20  nst Expr *pExpr 
249f0 3d 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72  = pConst->apExpr
24a00 5b 69 2a 32 5d 3b 0a 20 20 20 20 61 73 73 65 72  [i*2];.    asser
24a10 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
24a20 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 69  _COLUMN );.    i
24a30 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
24a40 3d 3d 70 43 6f 6c 75 6d 6e 2d 3e 69 54 61 62 6c  ==pColumn->iTabl
24a50 65 0a 20 20 20 20 20 26 26 20 70 45 78 70 72 2d  e.     && pExpr-
24a60 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 43 6f 6c 75 6d  >iColumn==pColum
24a70 6e 2d 3e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 29  n->iColumn.    )
24a80 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 20  {.      return; 
24a90 20 2f 2a 20 41 6c 72 65 61 64 79 20 70 72 65 73   /* Already pres
24aa0 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 77 69 74  ent.  Return wit
24ab0 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
24ac0 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  ing. */.    }.  
24ad0 7d 0a 0a 20 20 70 43 6f 6e 73 74 2d 3e 6e 43 6f  }..  pConst->nCo
24ae0 6e 73 74 2b 2b 3b 0a 20 20 70 43 6f 6e 73 74 2d  nst++;.  pConst-
24af0 3e 61 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  >apExpr = sqlite
24b00 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  3DbReallocOrFree
24b10 28 70 43 6f 6e 73 74 2d 3e 70 50 61 72 73 65 2d  (pConst->pParse-
24b20 3e 64 62 2c 20 70 43 6f 6e 73 74 2d 3e 61 70 45  >db, pConst->apE
24b30 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
24b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
24b50 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2a 32 2a 73  onst->nConst*2*s
24b60 69 7a 65 6f 66 28 45 78 70 72 2a 29 29 3b 0a 20  izeof(Expr*));. 
24b70 20 69 66 28 20 70 43 6f 6e 73 74 2d 3e 61 70 45   if( pConst->apE
24b80 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43  xpr==0 ){.    pC
24b90 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 20 3d 20 30  onst->nConst = 0
24ba0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
24bb0 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
24bc0 74 79 28 70 56 61 6c 75 65 2c 20 45 50 5f 46 69  ty(pValue, EP_Fi
24bd0 78 65 64 43 6f 6c 29 20 29 20 70 56 61 6c 75 65  xedCol) ) pValue
24be0 20 3d 20 70 56 61 6c 75 65 2d 3e 70 4c 65 66 74   = pValue->pLeft
24bf0 3b 0a 20 20 20 20 70 43 6f 6e 73 74 2d 3e 61 70  ;.    pConst->ap
24c00 45 78 70 72 5b 70 43 6f 6e 73 74 2d 3e 6e 43 6f  Expr[pConst->nCo
24c10 6e 73 74 2a 32 2d 32 5d 20 3d 20 70 43 6f 6c 75  nst*2-2] = pColu
24c20 6d 6e 3b 0a 20 20 20 20 70 43 6f 6e 73 74 2d 3e  mn;.    pConst->
24c30 61 70 45 78 70 72 5b 70 43 6f 6e 73 74 2d 3e 6e  apExpr[pConst->n
24c40 43 6f 6e 73 74 2a 32 2d 31 5d 20 3d 20 70 56 61  Const*2-1] = pVa
24c50 6c 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  lue;.  }.}../*.*
24c60 2a 20 46 69 6e 64 20 61 6c 6c 20 74 65 72 6d 73  * Find all terms
24c70 20 6f 66 20 43 4f 4c 55 4d 4e 3d 56 41 4c 55 45   of COLUMN=VALUE
24c80 20 6f 72 20 56 41 4c 55 45 3d 43 4f 4c 55 4d 4e   or VALUE=COLUMN
24c90 20 69 6e 20 70 45 78 70 72 20 77 68 65 72 65 20   in pExpr where 
24ca0 56 41 4c 55 45 0a 2a 2a 20 69 73 20 61 20 63 6f  VALUE.** is a co
24cb0 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f  nstant expressio
24cc0 6e 20 61 6e 64 20 77 68 65 72 65 20 74 68 65 20  n and where the 
24cd0 74 65 72 6d 20 6d 75 73 74 20 62 65 20 74 72 75  term must be tru
24ce0 65 20 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20  e because it.** 
24cf0 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 41  is part of the A
24d00 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72  ND-connected ter
24d10 6d 73 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ms of the expres
24d20 73 69 6f 6e 2e 20 20 46 6f 72 20 65 61 63 68 20  sion.  For each 
24d30 74 65 72 6d 0a 2a 2a 20 66 6f 75 6e 64 2c 20 61  term.** found, a
24d40 64 64 20 69 74 20 74 6f 20 74 68 65 20 70 43 6f  dd it to the pCo
24d50 6e 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  nst structure..*
24d60 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69  /.static void fi
24d70 6e 64 43 6f 6e 73 74 49 6e 57 68 65 72 65 28 57  ndConstInWhere(W
24d80 68 65 72 65 43 6f 6e 73 74 20 2a 70 43 6f 6e 73  hereConst *pCons
24d90 74 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  t, Expr *pExpr){
24da0 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
24db0 20 2a 70 4c 65 66 74 3b 0a 20 20 69 66 28 20 70   *pLeft;.  if( p
24dc0 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
24dd0 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
24de0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
24df0 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65  P_FromJoin) ) re
24e00 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70  turn;.  if( pExp
24e10 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b  r->op==TK_AND ){
24e20 0a 20 20 20 20 66 69 6e 64 43 6f 6e 73 74 49 6e  .    findConstIn
24e30 57 68 65 72 65 28 70 43 6f 6e 73 74 2c 20 70 45  Where(pConst, pE
24e40 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
24e50 20 20 66 69 6e 64 43 6f 6e 73 74 49 6e 57 68 65    findConstInWhe
24e60 72 65 28 70 43 6f 6e 73 74 2c 20 70 45 78 70 72  re(pConst, pExpr
24e70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 72 65  ->pLeft);.    re
24e80 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
24e90 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51  pExpr->op!=TK_EQ
24ea0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 52 69   ) return;.  pRi
24eb0 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69  ght = pExpr->pRi
24ec0 67 68 74 3b 0a 20 20 70 4c 65 66 74 20 3d 20 70  ght;.  pLeft = p
24ed0 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 61  Expr->pLeft;.  a
24ee0 73 73 65 72 74 28 20 70 52 69 67 68 74 21 3d 30  ssert( pRight!=0
24ef0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c   );.  assert( pL
24f00 65 66 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  eft!=0 );.  if( 
24f10 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43  pRight->op==TK_C
24f20 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 21 45 78 70  OLUMN.   && !Exp
24f30 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 52 69  rHasProperty(pRi
24f40 67 68 74 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c  ght, EP_FixedCol
24f50 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45  ).   && sqlite3E
24f60 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 4c  xprIsConstant(pL
24f70 65 66 74 29 0a 20 20 20 26 26 20 73 71 6c 69 74  eft).   && sqlit
24f80 65 33 49 73 42 69 6e 61 72 79 28 73 71 6c 69 74  e3IsBinary(sqlit
24f90 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
24fa0 6f 6c 6c 53 65 71 28 70 43 6f 6e 73 74 2d 3e 70  ollSeq(pConst->p
24fb0 50 61 72 73 65 2c 70 4c 65 66 74 2c 70 52 69 67  Parse,pLeft,pRig
24fc0 68 74 29 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f  ht)).  ){.    co
24fd0 6e 73 74 49 6e 73 65 72 74 28 70 43 6f 6e 73 74  nstInsert(pConst
24fe0 2c 20 70 52 69 67 68 74 2c 20 70 4c 65 66 74 29  , pRight, pLeft)
24ff0 3b 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20  ;.  }else.  if( 
25000 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pLeft->op==TK_CO
25010 4c 55 4d 4e 0a 20 20 20 26 26 20 21 45 78 70 72  LUMN.   && !Expr
25020 48 61 73 50 72 6f 70 65 72 74 79 28 70 4c 65 66  HasProperty(pLef
25030 74 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 0a  t, EP_FixedCol).
25040 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
25050 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 52 69 67  rIsConstant(pRig
25060 68 74 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65  ht).   && sqlite
25070 33 49 73 42 69 6e 61 72 79 28 73 71 6c 69 74 65  3IsBinary(sqlite
25080 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
25090 6c 6c 53 65 71 28 70 43 6f 6e 73 74 2d 3e 70 50  llSeq(pConst->pP
250a0 61 72 73 65 2c 70 4c 65 66 74 2c 70 52 69 67 68  arse,pLeft,pRigh
250b0 74 29 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e  t)).  ){.    con
250c0 73 74 49 6e 73 65 72 74 28 70 43 6f 6e 73 74 2c  stInsert(pConst,
250d0 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b   pLeft, pRight);
250e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
250f0 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72 20 65  is is a Walker e
25100 78 70 72 65 73 73 69 6f 6e 20 63 61 6c 6c 62 61  xpression callba
25110 63 6b 2e 20 20 70 45 78 70 72 20 69 73 20 61 20  ck.  pExpr is a 
25120 63 61 6e 64 69 64 61 74 65 20 65 78 70 72 65 73  candidate expres
25130 73 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 72 65  sion.** to be re
25140 70 6c 61 63 65 64 20 62 79 20 61 20 76 61 6c 75  placed by a valu
25150 65 2e 20 20 49 66 20 70 45 78 70 72 20 69 73 20  e.  If pExpr is 
25160 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6f 6e  equivalent to on
25170 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75  e of the.** colu
25180 6d 6e 73 20 6e 61 6d 65 64 20 69 6e 20 70 57 61  mns named in pWa
25190 6c 6b 65 72 2d 3e 75 2e 70 43 6f 6e 73 74 2c 20  lker->u.pConst, 
251a0 74 68 65 6e 20 6f 76 65 72 77 72 69 74 65 20 69  then overwrite i
251b0 74 20 77 69 74 68 20 69 74 73 0a 2a 2a 20 63 6f  t with its.** co
251c0 72 72 65 73 70 6f 6e 64 69 6e 67 20 76 61 6c 75  rresponding valu
251d0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
251e0 20 70 72 6f 70 61 67 61 74 65 43 6f 6e 73 74 61   propagateConsta
251f0 6e 74 45 78 70 72 52 65 77 72 69 74 65 28 57 61  ntExprRewrite(Wa
25200 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
25210 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
25220 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 43 6f 6e  nt i;.  WhereCon
25230 73 74 20 2a 70 43 6f 6e 73 74 3b 0a 20 20 69 66  st *pConst;.  if
25240 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
25250 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20  COLUMN ) return 
25260 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
25270 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
25280 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 69  rty(pExpr, EP_Fi
25290 78 65 64 43 6f 6c 29 20 29 20 72 65 74 75 72 6e  xedCol) ) return
252a0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
252b0 20 70 43 6f 6e 73 74 20 3d 20 70 57 61 6c 6b 65   pConst = pWalke
252c0 72 2d 3e 75 2e 70 43 6f 6e 73 74 3b 0a 20 20 66  r->u.pConst;.  f
252d0 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 73 74  or(i=0; i<pConst
252e0 2d 3e 6e 43 6f 6e 73 74 3b 20 69 2b 2b 29 7b 0a  ->nConst; i++){.
252f0 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 75 6d      Expr *pColum
25300 6e 20 3d 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78  n = pConst->apEx
25310 70 72 5b 69 2a 32 5d 3b 0a 20 20 20 20 69 66 28  pr[i*2];.    if(
25320 20 70 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 20   pColumn==pExpr 
25330 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
25340 69 66 28 20 70 43 6f 6c 75 6d 6e 2d 3e 69 54 61  if( pColumn->iTa
25350 62 6c 65 21 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble!=pExpr->iTab
25360 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  le ) continue;. 
25370 20 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e 2d 3e     if( pColumn->
25380 69 43 6f 6c 75 6d 6e 21 3d 70 45 78 70 72 2d 3e  iColumn!=pExpr->
25390 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e  iColumn ) contin
253a0 75 65 3b 0a 20 20 20 20 2f 2a 20 41 20 6d 61 74  ue;.    /* A mat
253b0 63 68 20 69 73 20 66 6f 75 6e 64 2e 20 20 41 64  ch is found.  Ad
253c0 64 20 74 68 65 20 45 50 5f 46 69 78 65 64 43 6f  d the EP_FixedCo
253d0 6c 20 70 72 6f 70 65 72 74 79 20 2a 2f 0a 20 20  l property */.  
253e0 20 20 70 43 6f 6e 73 74 2d 3e 6e 43 68 6e 67 2b    pConst->nChng+
253f0 2b 3b 0a 20 20 20 20 45 78 70 72 43 6c 65 61 72  +;.    ExprClear
25400 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
25410 45 50 5f 4c 65 61 66 29 3b 0a 20 20 20 20 45 78  EP_Leaf);.    Ex
25420 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
25430 78 70 72 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c  xpr, EP_FixedCol
25440 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
25450 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 29  Expr->pLeft==0 )
25460 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65  ;.    pExpr->pLe
25470 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
25480 44 75 70 28 70 43 6f 6e 73 74 2d 3e 70 50 61 72  Dup(pConst->pPar
25490 73 65 2d 3e 64 62 2c 20 70 43 6f 6e 73 74 2d 3e  se->db, pConst->
254a0 61 70 45 78 70 72 5b 69 2a 32 2b 31 5d 2c 20 30  apExpr[i*2+1], 0
254b0 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
254c0 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50  }.  return WRC_P
254d0 72 75 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rune;.}../*.** T
254e0 68 65 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20  he WHERE-clause 
254f0 63 6f 6e 73 74 61 6e 74 20 70 72 6f 70 61 67 61  constant propaga
25500 74 69 6f 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  tion optimizatio
25510 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
25520 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
25530 74 61 69 6e 73 20 74 65 72 6d 73 20 6f 66 20 74  tains terms of t
25540 68 65 20 66 6f 72 6d 20 43 4f 4c 55 4d 4e 3d 43  he form COLUMN=C
25550 4f 4e 53 54 41 4e 54 20 6f 72 0a 2a 2a 20 43 4f  ONSTANT or.** CO
25560 4e 53 54 41 4e 54 3d 43 4f 4c 55 4d 4e 20 74 68  NSTANT=COLUMN th
25570 61 74 20 6d 75 73 74 20 62 65 20 74 72 65 65 20  at must be tree 
25580 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (in other words,
25590 20 69 66 20 74 68 65 20 74 65 72 6d 73 20 74 6f   if the terms to
255a0 70 2d 6c 65 76 65 6c 0a 2a 2a 20 41 4e 44 2d 63  p-level.** AND-c
255b0 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20 74  onnected terms t
255c0 68 61 74 20 61 72 65 20 6e 6f 74 20 70 61 72 74  hat are not part
255d0 20 6f 66 20 61 20 4f 4e 20 63 6c 61 75 73 65 20   of a ON clause 
255e0 66 72 6f 6d 20 61 20 4c 45 46 54 20 4a 4f 49 4e  from a LEFT JOIN
255f0 29 0a 2a 2a 20 74 68 65 6e 20 74 68 72 6f 75 67  ).** then throug
25600 68 6f 75 74 20 74 68 65 20 71 75 65 72 79 20 72  hout the query r
25610 65 70 6c 61 63 65 20 61 6c 6c 20 6f 74 68 65 72  eplace all other
25620 20 6f 63 63 75 72 72 65 6e 63 65 73 20 6f 66 20   occurrences of 
25630 43 4f 4c 55 4d 4e 0a 2a 2a 20 77 69 74 68 20 43  COLUMN.** with C
25640 4f 4e 53 54 41 4e 54 20 77 69 74 68 69 6e 20 74  ONSTANT within t
25650 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
25660 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
25670 6c 65 2c 20 74 68 65 20 71 75 65 72 79 3a 0a 2a  le, the query:.*
25680 2a 0a 2a 2a 20 20 20 20 20 20 53 45 4c 45 43 54  *.**      SELECT
25690 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20   * FROM t1, t2, 
256a0 74 33 20 57 48 45 52 45 20 74 31 2e 61 3d 33 39  t3 WHERE t1.a=39
256b0 20 41 4e 44 20 74 32 2e 62 3d 74 31 2e 61 20 41   AND t2.b=t1.a A
256c0 4e 44 20 74 33 2e 63 3d 74 32 2e 62 0a 2a 2a 0a  ND t3.c=t2.b.**.
256d0 2a 2a 20 49 73 20 74 72 61 6e 73 66 6f 72 6d 65  ** Is transforme
256e0 64 20 69 6e 74 6f 0a 2a 2a 0a 2a 2a 20 20 20 20  d into.**.**    
256f0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
25700 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45  t1, t2, t3 WHERE
25710 20 74 31 2e 61 3d 33 39 20 41 4e 44 20 74 32 2e   t1.a=39 AND t2.
25720 62 3d 33 39 20 41 4e 44 20 74 33 2e 63 3d 33 39  b=39 AND t3.c=39
25730 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
25740 75 65 20 69 66 20 61 6e 79 20 74 72 61 6e 73 66  ue if any transf
25750 6f 72 6d 61 74 69 6f 6e 73 20 77 68 65 72 65 20  ormations where 
25760 6d 61 64 65 20 61 6e 64 20 66 61 6c 73 65 20 69  made and false i
25770 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70  f not..**.** Imp
25780 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65  lementation note
25790 3a 20 20 43 6f 6e 73 74 61 6e 74 20 70 72 6f 70  :  Constant prop
257a0 61 67 61 74 69 6f 6e 20 69 73 20 74 72 69 63 6b  agation is trick
257b0 79 20 64 75 65 20 74 6f 20 61 66 66 69 6e 69 74  y due to affinit
257c0 79 0a 2a 2a 20 61 6e 64 20 63 6f 6c 6c 61 74 69  y.** and collati
257d0 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e 74 65  ng sequence inte
257e0 72 61 63 74 69 6f 6e 73 2e 20 20 43 6f 6e 73 69  ractions.  Consi
257f0 64 65 72 20 74 68 69 73 20 65 78 61 6d 70 6c 65  der this example
25800 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41 54  :.**.**    CREAT
25810 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54  E TABLE t1(a INT
25820 2c 62 20 54 45 58 54 29 3b 0a 2a 2a 20 20 20 20  ,b TEXT);.**    
25830 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
25840 41 4c 55 45 53 28 31 32 33 2c 27 30 31 32 33 27  ALUES(123,'0123'
25850 29 3b 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  );.**    SELECT 
25860 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
25870 61 3d 31 32 33 20 41 4e 44 20 62 3d 61 3b 0a 2a  a=123 AND b=a;.*
25880 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
25890 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31 32  OM t1 WHERE a=12
258a0 33 20 41 4e 44 20 62 3d 31 32 33 3b 0a 2a 2a 0a  3 AND b=123;.**.
258b0 2a 2a 20 54 68 65 20 74 77 6f 20 53 45 4c 45 43  ** The two SELEC
258c0 54 20 73 74 61 74 65 6d 65 6e 74 73 20 61 62 6f  T statements abo
258d0 76 65 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e  ve should return
258e0 20 64 69 66 66 65 72 65 6e 74 20 61 6e 73 77 65   different answe
258f0 72 73 2e 20 20 62 3d 61 0a 2a 2a 20 69 73 20 61  rs.  b=a.** is a
25900 6c 77 61 79 20 74 72 75 65 20 62 65 63 61 75 73  lway true becaus
25910 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
25920 20 75 73 65 73 20 6e 75 6d 65 72 69 63 20 61 66   uses numeric af
25930 66 69 6e 69 74 79 2c 20 62 75 74 20 62 3d 31 32  finity, but b=12
25940 33 0a 2a 2a 20 69 73 20 66 61 6c 73 65 20 62 65  3.** is false be
25950 63 61 75 73 65 20 69 74 20 75 73 65 73 20 74 65  cause it uses te
25960 78 74 20 61 66 66 69 6e 69 74 79 20 61 6e 64 20  xt affinity and 
25970 27 30 31 32 33 27 20 69 73 20 6e 6f 74 20 74 68  '0123' is not th
25980 65 20 73 61 6d 65 20 61 73 20 27 31 32 33 27 2e  e same as '123'.
25990 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  .** To work arou
259a0 6e 64 20 74 68 69 73 2c 20 74 68 65 20 65 78 70  nd this, the exp
259b0 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20  ression tree is 
259c0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 68 61  not actually cha
259d0 6e 67 65 64 20 66 72 6f 6d 0a 2a 2a 20 22 62 3d  nged from.** "b=
259e0 61 22 20 74 6f 20 22 62 3d 31 32 33 22 20 62 75  a" to "b=123" bu
259f0 74 20 72 61 74 68 65 72 20 74 68 65 20 22 61 22  t rather the "a"
25a00 20 69 6e 20 22 62 3d 61 22 20 69 73 20 74 61 67   in "b=a" is tag
25a10 67 65 64 20 77 69 74 68 20 45 50 5f 46 69 78 65  ged with EP_Fixe
25a20 64 43 6f 6c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  dCol.** and the 
25a30 22 31 32 33 22 20 76 61 6c 75 65 20 69 73 20 68  "123" value is h
25a40 75 6e 67 20 6f 66 66 20 6f 66 20 74 68 65 20 70  ung off of the p
25a50 4c 65 66 74 20 70 6f 69 6e 74 65 72 2e 20 20 43  Left pointer.  C
25a60 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a  ode generator.**
25a70 20 72 6f 75 74 69 6e 65 73 20 6b 6e 6f 77 20 74   routines know t
25a80 6f 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 63  o generate the c
25a90 6f 6e 73 74 61 6e 74 20 22 31 32 33 22 20 69 6e  onstant "123" in
25aa0 73 74 65 61 64 20 6f 66 20 6c 6f 6f 6b 69 6e 67  stead of looking
25ab0 20 75 70 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d   up the.** colum
25ac0 6e 20 76 61 6c 75 65 2e 20 20 41 6c 73 6f 2c 20  n value.  Also, 
25ad0 74 6f 20 61 76 6f 69 64 20 63 6f 6c 6c 61 74 69  to avoid collati
25ae0 6f 6e 20 70 72 6f 62 6c 65 6d 73 2c 20 74 68 69  on problems, thi
25af0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  s optimization i
25b00 73 0a 2a 2a 20 6f 6e 6c 79 20 61 74 74 65 6d 70  s.** only attemp
25b10 74 65 64 20 69 66 20 74 68 65 20 22 61 3d 31 32  ted if the "a=12
25b20 33 22 20 74 65 72 6d 20 75 73 65 73 20 74 68 65  3" term uses the
25b30 20 64 65 66 61 75 6c 74 20 42 49 4e 41 52 59 20   default BINARY 
25b40 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  collation..*/.st
25b50 61 74 69 63 20 69 6e 74 20 70 72 6f 70 61 67 61  atic int propaga
25b60 74 65 43 6f 6e 73 74 61 6e 74 73 28 0a 20 20 50  teConstants(.  P
25b70 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
25b80 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
25b90 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
25ba0 63 74 20 2a 70 20 20 20 20 20 20 20 20 2f 2a 20  ct *p        /* 
25bb0 54 68 65 20 71 75 65 72 79 20 69 6e 20 77 68 69  The query in whi
25bc0 63 68 20 74 6f 20 70 72 6f 70 61 67 61 74 65 20  ch to propagate 
25bd0 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 29 7b 0a  constants */.){.
25be0 20 20 57 68 65 72 65 43 6f 6e 73 74 20 78 3b 0a    WhereConst x;.
25bf0 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 69 6e    Walker w;.  in
25c00 74 20 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 78  t nChng = 0;.  x
25c10 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
25c20 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 78 2e 6e 43  ;.  do{.    x.nC
25c30 6f 6e 73 74 20 3d 20 30 3b 0a 20 20 20 20 78 2e  onst = 0;.    x.
25c40 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 78  nChng = 0;.    x
25c50 2e 61 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20  .apExpr = 0;.   
25c60 20 66 69 6e 64 43 6f 6e 73 74 49 6e 57 68 65 72   findConstInWher
25c70 65 28 26 78 2c 20 70 2d 3e 70 57 68 65 72 65 29  e(&x, p->pWhere)
25c80 3b 0a 20 20 20 20 69 66 28 20 78 2e 6e 43 6f 6e  ;.    if( x.nCon
25c90 73 74 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  st ){.      mems
25ca0 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&w, 0, sizeof
25cb0 28 77 29 29 3b 0a 20 20 20 20 20 20 77 2e 70 50  (w));.      w.pP
25cc0 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
25cd0 20 20 20 20 20 77 2e 78 45 78 70 72 43 61 6c 6c       w.xExprCall
25ce0 62 61 63 6b 20 3d 20 70 72 6f 70 61 67 61 74 65  back = propagate
25cf0 43 6f 6e 73 74 61 6e 74 45 78 70 72 52 65 77 72  ConstantExprRewr
25d00 69 74 65 3b 0a 20 20 20 20 20 20 77 2e 78 53 65  ite;.      w.xSe
25d10 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
25d20 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b  qlite3SelectWalk
25d30 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 77 2e 78 53  Noop;.      w.xS
25d40 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
25d50 20 30 3b 0a 20 20 20 20 20 20 77 2e 77 61 6c 6b   0;.      w.walk
25d60 65 72 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 20  erDepth = 0;.   
25d70 20 20 20 77 2e 75 2e 70 43 6f 6e 73 74 20 3d 20     w.u.pConst = 
25d80 26 78 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  &x;.      sqlite
25d90 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 2d  3WalkExpr(&w, p-
25da0 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20  >pWhere);.      
25db0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 78 2e  sqlite3DbFree(x.
25dc0 70 50 61 72 73 65 2d 3e 64 62 2c 20 78 2e 61 70  pParse->db, x.ap
25dd0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 6e 43 68  Expr);.      nCh
25de0 6e 67 20 2b 3d 20 78 2e 6e 43 68 6e 67 3b 0a 20  ng += x.nChng;. 
25df0 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 78     }.  }while( x
25e00 2e 6e 43 68 6e 67 20 29 3b 20 20 0a 20 20 72 65  .nChng );  .  re
25e10 74 75 72 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 0a 23  turn nChng;.}..#
25e20 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
25e30 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
25e40 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
25e50 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
25e60 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65  /*.** Make copie
25e70 73 20 6f 66 20 72 65 6c 65 76 61 6e 74 20 57 48  s of relevant WH
25e80 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
25e90 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
25ea0 65 72 79 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20  ery into.** the 
25eb0 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20  WHERE clause of 
25ec0 73 75 62 71 75 65 72 79 2e 20 20 45 78 61 6d 70  subquery.  Examp
25ed0 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  le:.**.**    SEL
25ee0 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45  ECT * FROM (SELE
25ef0 43 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41  CT a AS x, c-d A
25f00 53 20 79 20 46 52 4f 4d 20 74 31 29 20 57 48 45  S y FROM t1) WHE
25f10 52 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b  RE x=5 AND y=10;
25f20 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 6f 72 6d  .**.** Transform
25f30 65 64 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20  ed into:.**.**  
25f40 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
25f50 28 53 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20  (SELECT a AS x, 
25f60 63 2d 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31  c-d AS y FROM t1
25f70 20 57 48 45 52 45 20 61 3d 35 20 41 4e 44 20 63   WHERE a=5 AND c
25f80 2d 64 3d 31 30 29 0a 2a 2a 20 20 20 20 20 57 48  -d=10).**     WH
25f90 45 52 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30  ERE x=5 AND y=10
25fa0 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 6f 70 65  ;.**.** The hope
25fb0 20 69 73 20 74 68 61 74 20 74 68 65 20 74 65 72   is that the ter
25fc0 6d 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ms added to the 
25fd0 69 6e 6e 65 72 20 71 75 65 72 79 20 77 69 6c 6c  inner query will
25fe0 20 6d 61 6b 65 20 69 74 20 6d 6f 72 65 0a 2a 2a   make it more.**
25ff0 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a   efficient..**.*
26000 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * Do not attempt
26010 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
26020 6f 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 28  on if:.**.**   (
26030 31 29 20 28 2a 2a 20 54 68 69 73 20 72 65 73 74  1) (** This rest
26040 72 69 63 74 69 6f 6e 20 77 61 73 20 72 65 6d 6f  riction was remo
26050 76 65 64 20 6f 6e 20 32 30 31 37 2d 30 39 2d 32  ved on 2017-09-2
26060 39 2e 20 20 57 65 20 75 73 65 64 20 74 6f 0a 2a  9.  We used to.*
26070 2a 20 20 20 20 20 20 20 20 20 20 20 64 69 73 61  *           disa
26080 6c 6c 6f 77 20 74 68 69 73 20 6f 70 74 69 6d 69  llow this optimi
26090 7a 61 74 69 6f 6e 20 66 6f 72 20 61 67 67 72 65  zation for aggre
260a0 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73 2c  gate subqueries,
260b0 20 62 75 74 20 6e 6f 77 0a 2a 2a 20 20 20 20 20   but now.**     
260c0 20 20 20 20 20 20 69 74 20 69 73 20 61 6c 6c 6f        it is allo
260d0 77 65 64 20 62 79 20 70 75 74 74 69 6e 67 20 74  wed by putting t
260e0 68 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f  he extra terms o
260f0 6e 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61  n the HAVING cla
26100 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  use..**         
26110 20 20 54 68 65 20 61 64 64 65 64 20 48 41 56 49    The added HAVI
26120 4e 47 20 63 6c 61 75 73 65 20 69 73 20 70 6f 69  NG clause is poi
26130 6e 74 6c 65 73 73 20 69 66 20 74 68 65 20 73 75  ntless if the su
26140 62 71 75 65 72 79 20 6c 61 63 6b 73 0a 2a 2a 20  bquery lacks.** 
26150 20 20 20 20 20 20 20 20 20 20 61 20 47 52 4f 55            a GROU
26160 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 42 75  P BY clause.  Bu
26170 74 20 73 75 63 68 20 61 20 48 41 56 49 4e 47 20  t such a HAVING 
26180 63 6c 61 75 73 65 20 69 73 20 61 6c 73 6f 20 68  clause is also h
26190 61 72 6d 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20  armless.**      
261a0 20 20 20 20 20 73 6f 20 74 68 65 72 65 20 64 6f       so there do
261b0 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 74 6f  es not appear to
261c0 20 62 65 20 61 6e 79 20 72 65 61 73 6f 6e 20 74   be any reason t
261d0 6f 20 61 64 64 20 65 78 74 72 61 20 6c 6f 67 69  o add extra logi
261e0 63 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 74  c.**           t
261f0 6f 20 73 75 70 70 72 65 73 73 20 69 74 2e 20 2a  o suppress it. *
26200 2a 29 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 54  *).**.**   (2) T
26210 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69  he inner query i
26220 73 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  s the recursive 
26230 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 6d 6f 6e  part of a common
26240 20 74 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f   table expressio
26250 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 54  n..**.**   (3) T
26260 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 68  he inner query h
26270 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  as a LIMIT claus
26280 65 20 28 73 69 6e 63 65 20 74 68 65 20 63 68 61  e (since the cha
26290 6e 67 65 73 20 74 6f 20 74 68 65 20 57 48 45 52  nges to the WHER
262a0 45 0a 2a 2a 20 20 20 20 20 20 20 63 6c 61 75 73  E.**       claus
262b0 65 20 77 6f 75 6c 64 20 63 68 61 6e 67 65 20 74  e would change t
262c0 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
262d0 65 20 4c 49 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a 20  e LIMIT)..**.** 
262e0 20 20 28 34 29 20 54 68 65 20 69 6e 6e 65 72 20    (4) The inner 
262f0 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
26300 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
26310 4c 45 46 54 20 4a 4f 49 4e 20 61 6e 64 20 74 68  LEFT JOIN and th
26320 65 0a 2a 2a 20 20 20 20 20 20 20 65 78 70 72 65  e.**       expre
26330 73 73 69 6f 6e 20 74 6f 20 62 65 20 70 75 73 68  ssion to be push
26340 65 64 20 64 6f 77 6e 20 64 6f 65 73 20 6e 6f 74  ed down does not
26350 20 63 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20 4f   come from the O
26360 4e 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20  N clause.**     
26370 20 20 6f 6e 20 74 68 61 74 20 4c 45 46 54 20 4a    on that LEFT J
26380 4f 49 4e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29  OIN..**.**   (5)
26390 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
263a0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69  e expression ori
263b0 67 69 6e 61 74 65 73 20 69 6e 20 74 68 65 20 4f  ginates in the O
263c0 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
263d0 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 61 20  e.**       of a 
263e0 4c 45 46 54 20 4a 4f 49 4e 20 77 68 65 72 65 20  LEFT JOIN where 
263f0 69 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 74  iCursor is not t
26400 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 74 61  he right-hand ta
26410 62 6c 65 20 6f 66 20 74 68 61 74 0a 2a 2a 20 20  ble of that.**  
26420 20 20 20 20 20 6c 65 66 74 20 6a 6f 69 6e 2e 20       left join. 
26430 20 41 6e 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a   An example:.**.
26440 2a 2a 20 20 20 20 20 20 20 20 20 20 20 53 45 4c  **           SEL
26450 45 43 54 20 2a 0a 2a 2a 20 20 20 20 20 20 20 20  ECT *.**        
26460 20 20 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20     FROM (SELECT 
26470 31 20 41 53 20 61 31 20 55 4e 49 4f 4e 20 41 4c  1 AS a1 UNION AL
26480 4c 20 53 45 4c 45 43 54 20 32 29 20 41 53 20 61  L SELECT 2) AS a
26490 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4a  a.**           J
264a0 4f 49 4e 20 28 53 45 4c 45 43 54 20 31 20 41 53  OIN (SELECT 1 AS
264b0 20 62 32 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45   b2 UNION ALL SE
264c0 4c 45 43 54 20 32 29 20 41 53 20 62 62 20 4f 4e  LECT 2) AS bb ON
264d0 20 28 61 31 3d 62 32 29 0a 2a 2a 20 20 20 20 20   (a1=b2).**     
264e0 20 20 20 20 20 20 4c 45 46 54 20 4a 4f 49 4e 20        LEFT JOIN 
264f0 28 53 45 4c 45 43 54 20 38 20 41 53 20 63 33 20  (SELECT 8 AS c3 
26500 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
26510 20 39 29 20 41 53 20 63 63 20 4f 4e 20 28 62 32   9) AS cc ON (b2
26520 3d 32 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  =2);.**.**      
26530 20 54 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73   The correct ans
26540 77 65 72 20 69 73 20 74 68 72 65 65 20 72 6f 77  wer is three row
26550 73 3a 20 20 28 31 2c 31 2c 4e 55 4c 4c 29 2c 28  s:  (1,1,NULL),(
26560 32 2c 32 2c 38 29 2c 28 32 2c 32 2c 39 29 2e 0a  2,2,8),(2,2,9)..
26570 2a 2a 20 20 20 20 20 20 20 42 75 74 20 69 66 20  **       But if 
26580 74 68 65 20 28 62 32 3d 32 29 20 74 65 72 6d 20  the (b2=2) term 
26590 77 65 72 65 20 74 6f 20 62 65 20 70 75 73 68 65  were to be pushe
265a0 64 20 64 6f 77 6e 20 69 6e 74 6f 20 74 68 65 20  d down into the 
265b0 62 62 20 73 75 62 71 75 65 72 79 2c 0a 2a 2a 20  bb subquery,.** 
265c0 20 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 28        then the (
265d0 31 2c 31 2c 4e 55 4c 4c 29 20 72 6f 77 20 77 6f  1,1,NULL) row wo
265e0 75 6c 64 20 62 65 20 73 75 70 70 72 65 73 73 65  uld be suppresse
265f0 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 54  d..**.**   (6) T
26600 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 66  he inner query f
26610 65 61 74 75 72 65 73 20 6f 6e 65 20 6f 72 20 6d  eatures one or m
26620 6f 72 65 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74  ore window-funct
26630 69 6f 6e 73 20 28 73 69 6e 63 65 20 0a 2a 2a 20  ions (since .** 
26640 20 20 20 20 20 20 63 68 61 6e 67 65 73 20 74 6f        changes to
26650 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
26660 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 71  e of the inner q
26670 75 65 72 79 20 63 6f 75 6c 64 20 63 68 61 6e 67  uery could chang
26680 65 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20  e the .**       
26690 77 69 6e 64 6f 77 20 6f 76 65 72 20 77 68 69 63  window over whic
266a0 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  h window functio
266b0 6e 73 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65  ns are calculate
266c0 64 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  d)..**.** Return
266d0 20 30 20 69 66 20 6e 6f 20 63 68 61 6e 67 65 73   0 if no changes
266e0 20 61 72 65 20 6d 61 64 65 20 61 6e 64 20 6e 6f   are made and no
266f0 6e 2d 7a 65 72 6f 20 69 66 20 6f 6e 65 20 6f 72  n-zero if one or
26700 20 6d 6f 72 65 20 57 48 45 52 45 20 63 6c 61 75   more WHERE clau
26710 73 65 0a 2a 2a 20 74 65 72 6d 73 20 61 72 65 20  se.** terms are 
26720 64 75 70 6c 69 63 61 74 65 64 20 69 6e 74 6f 20  duplicated into 
26730 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f  the subquery..*/
26740 0a 73 74 61 74 69 63 20 69 6e 74 20 70 75 73 68  .static int push
26750 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 0a  DownWhereTerms(.
26760 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
26770 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
26780 20 63 6f 6e 74 65 78 74 20 28 66 6f 72 20 6d 61   context (for ma
26790 6c 6c 6f 63 28 29 20 61 6e 64 20 65 72 72 6f 72  lloc() and error
267a0 20 72 65 70 6f 72 74 69 6e 67 29 20 2a 2f 0a 20   reporting) */. 
267b0 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 2c 20   Select *pSubq, 
267c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75         /* The su
267d0 62 71 75 65 72 79 20 77 68 6f 73 65 20 57 48 45  bquery whose WHE
267e0 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 6f 20  RE clause is to 
267f0 62 65 20 61 75 67 6d 65 6e 74 65 64 20 2a 2f 0a  be augmented */.
26800 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20    Expr *pWhere, 
26810 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
26820 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74  HERE clause of t
26830 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
26840 2f 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72 2c  /.  int iCursor,
26850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
26860 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
26870 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
26880 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e 20 20  int isLeftJoin  
26890 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
268a0 20 70 53 75 62 71 20 69 73 20 74 68 65 20 72 69   pSubq is the ri
268b0 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45  ght term of a LE
268c0 46 54 20 4a 4f 49 4e 20 2a 2f 0a 29 7b 0a 20 20  FT JOIN */.){.  
268d0 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Expr *pNew;.  in
268e0 74 20 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 69  t nChng = 0;.  i
268f0 66 28 20 70 57 68 65 72 65 3d 3d 30 20 29 20 72  f( pWhere==0 ) r
26900 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
26910 53 75 62 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Subq->selFlags &
26920 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 20   SF_Recursive ) 
26930 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 72 65  return 0;  /* re
26940 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20 2a 2f  striction (2) */
26950 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
26960 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
26970 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e 70 57  .  if( pSubq->pW
26980 69 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  in ) return 0;  
26990 20 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e    /* restriction
269a0 20 28 36 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a   (6) */.#endif..
269b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
269c0 42 55 47 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68  BUG.  /* Only th
269d0 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20  e first term of 
269e0 61 20 63 6f 6d 70 6f 75 6e 64 20 63 61 6e 20 68  a compound can h
269f0 61 76 65 20 61 20 57 49 54 48 20 63 6c 61 75 73  ave a WITH claus
26a00 65 2e 20 20 42 75 74 20 6d 61 6b 65 0a 20 20 2a  e.  But make.  *
26a10 2a 20 73 75 72 65 20 6e 6f 20 6f 74 68 65 72 20  * sure no other 
26a20 74 65 72 6d 73 20 61 72 65 20 6d 61 72 6b 65 64  terms are marked
26a30 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 69 6e   SF_Recursive in
26a40 20 63 61 73 65 20 73 6f 6d 65 74 68 69 6e 67 20   case something 
26a50 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 69 6e 20  changes.  ** in 
26a60 74 68 65 20 66 75 74 75 72 65 2e 0a 20 20 2a 2f  the future..  */
26a70 0a 20 20 7b 0a 20 20 20 20 53 65 6c 65 63 74 20  .  {.    Select 
26a80 2a 70 58 3b 20 20 0a 20 20 20 20 66 6f 72 28 70  *pX;  .    for(p
26a90 58 3d 70 53 75 62 71 3b 20 70 58 3b 20 70 58 3d  X=pSubq; pX; pX=
26aa0 70 58 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  pX->pPrior){.   
26ab0 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e     assert( (pX->
26ac0 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 52  selFlags & (SF_R
26ad0 65 63 75 72 73 69 76 65 29 29 3d 3d 30 20 29 3b  ecursive))==0 );
26ae0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
26af0 66 0a 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e  f..  if( pSubq->
26b00 70 4c 69 6d 69 74 21 3d 30 20 29 7b 0a 20 20 20  pLimit!=0 ){.   
26b10 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65   return 0; /* re
26b20 73 74 72 69 63 74 69 6f 6e 20 28 33 29 20 2a 2f  striction (3) */
26b30 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 57  .  }.  while( pW
26b40 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44  here->op==TK_AND
26b50 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 20 2b 3d   ){.    nChng +=
26b60 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65   pushDownWhereTe
26b70 72 6d 73 28 70 50 61 72 73 65 2c 20 70 53 75 62  rms(pParse, pSub
26b80 71 2c 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68  q, pWhere->pRigh
26b90 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
26ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bb0 20 20 20 69 43 75 72 73 6f 72 2c 20 69 73 4c 65     iCursor, isLe
26bc0 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 57 68  ftJoin);.    pWh
26bd0 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e 70 4c  ere = pWhere->pL
26be0 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  eft;.  }.  if( i
26bf0 73 4c 65 66 74 4a 6f 69 6e 0a 20 20 20 26 26 20  sLeftJoin.   && 
26c00 28 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  (ExprHasProperty
26c10 28 70 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a  (pWhere,EP_FromJ
26c20 6f 69 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  oin)==0.        
26c30 20 7c 7c 20 70 57 68 65 72 65 2d 3e 69 52 69 67   || pWhere->iRig
26c40 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 69 43 75  htJoinTable!=iCu
26c50 72 73 6f 72 29 0a 20 20 29 7b 0a 20 20 20 20 72  rsor).  ){.    r
26c60 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74  eturn 0; /* rest
26c70 72 69 63 74 69 6f 6e 20 28 34 29 20 2a 2f 0a 20  riction (4) */. 
26c80 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48 61 73   }.  if( ExprHas
26c90 50 72 6f 70 65 72 74 79 28 70 57 68 65 72 65 2c  Property(pWhere,
26ca0 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 26 26 20  EP_FromJoin) && 
26cb0 70 57 68 65 72 65 2d 3e 69 52 69 67 68 74 4a 6f  pWhere->iRightJo
26cc0 69 6e 54 61 62 6c 65 21 3d 69 43 75 72 73 6f 72  inTable!=iCursor
26cd0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
26ce0 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e  ; /* restriction
26cf0 20 28 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66   (5) */.  }.  if
26d00 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54  ( sqlite3ExprIsT
26d10 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70 57 68  ableConstant(pWh
26d20 65 72 65 2c 20 69 43 75 72 73 6f 72 29 20 29 7b  ere, iCursor) ){
26d30 0a 20 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20  .    nChng++;.  
26d40 20 20 77 68 69 6c 65 28 20 70 53 75 62 71 20 29    while( pSubq )
26d50 7b 0a 20 20 20 20 20 20 53 75 62 73 74 43 6f 6e  {.      SubstCon
26d60 74 65 78 74 20 78 3b 0a 20 20 20 20 20 20 70 4e  text x;.      pN
26d70 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
26d80 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
26d90 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20  pWhere, 0);.    
26da0 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28    unsetJoinExpr(
26db0 70 4e 65 77 2c 20 2d 31 29 3b 0a 20 20 20 20 20  pNew, -1);.     
26dc0 20 78 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   x.pParse = pPar
26dd0 73 65 3b 0a 20 20 20 20 20 20 78 2e 69 54 61 62  se;.      x.iTab
26de0 6c 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20  le = iCursor;.  
26df0 20 20 20 20 78 2e 69 4e 65 77 54 61 62 6c 65 20      x.iNewTable 
26e00 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  = iCursor;.     
26e10 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20   x.isLeftJoin = 
26e20 30 3b 0a 20 20 20 20 20 20 78 2e 70 45 4c 69 73  0;.      x.pELis
26e30 74 20 3d 20 70 53 75 62 71 2d 3e 70 45 4c 69 73  t = pSubq->pELis
26e40 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  t;.      pNew = 
26e50 73 75 62 73 74 45 78 70 72 28 26 78 2c 20 70 4e  substExpr(&x, pN
26e60 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ew);.      if( p
26e70 53 75 62 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Subq->selFlags &
26e80 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b   SF_Aggregate ){
26e90 0a 20 20 20 20 20 20 20 20 70 53 75 62 71 2d 3e  .        pSubq->
26ea0 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
26eb0 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
26ec0 3e 64 62 2c 20 70 53 75 62 71 2d 3e 70 48 61 76  >db, pSubq->pHav
26ed0 69 6e 67 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  ing, pNew);.    
26ee0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26ef0 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65 20 3d   pSubq->pWhere =
26f00 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
26f10 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 75 62  pParse->db, pSub
26f20 71 2d 3e 70 57 68 65 72 65 2c 20 70 4e 65 77 29  q->pWhere, pNew)
26f30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26f40 70 53 75 62 71 20 3d 20 70 53 75 62 71 2d 3e 70  pSubq = pSubq->p
26f50 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Prior;.    }.  }
26f60 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 6e 67 3b  .  return nChng;
26f70 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
26f80 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
26f90 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
26fa0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
26fb0 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a  MIT_VIEW) */../*
26fc0 0a 2a 2a 20 54 68 65 20 70 46 75 6e 63 20 69 73  .** The pFunc is
26fd0 20 74 68 65 20 6f 6e 6c 79 20 61 67 67 72 65 67   the only aggreg
26fe0 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20  ate function in 
26ff0 74 68 65 20 71 75 65 72 79 2e 20 20 43 68 65 63  the query.  Chec
27000 6b 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66 20 74  k to see.** if t
27010 68 65 20 71 75 65 72 79 20 69 73 20 61 20 63 61  he query is a ca
27020 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68 65 20  ndidate for the 
27030 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a 61  min/max optimiza
27040 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  tion. .**.** If 
27050 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20 63  the query is a c
27060 61 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68 65  andidate for the
27070 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a   min/max optimiz
27080 61 74 69 6f 6e 2c 20 74 68 65 6e 20 73 65 74 0a  ation, then set.
27090 2a 2a 20 2a 70 70 4d 69 6e 4d 61 78 20 74 6f 20  ** *ppMinMax to 
270a0 62 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  be an ORDER BY c
270b0 6c 61 75 73 65 20 74 6f 20 62 65 20 75 73 65 64  lause to be used
270c0 20 66 6f 72 20 74 68 65 20 6f 70 74 69 6d 69 7a   for the optimiz
270d0 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65 74  ation.** and ret
270e0 75 72 6e 20 65 69 74 68 65 72 20 57 48 45 52 45  urn either WHERE
270f0 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20  _ORDERBY_MIN or 
27100 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
27110 58 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 0a 2a  X depending on.*
27120 2a 20 77 68 65 74 68 65 72 20 70 46 75 6e 63 20  * whether pFunc 
27130 69 73 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61  is a min() or ma
27140 78 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  x() function..**
27150 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79  .** If the query
27160 20 69 73 20 6e 6f 74 20 61 20 63 61 6e 64 69 64   is not a candid
27170 61 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f  ate for the min/
27180 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  max optimization
27190 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 57 48 45 52  , return.** WHER
271a0 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
271b0 20 28 77 68 69 63 68 20 6d 75 73 74 20 62 65 20   (which must be 
271c0 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  zero)..**.** Thi
271d0 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
271e0 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61  e called after a
271f0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
27200 6e 73 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  ns have been.** 
27210 6c 6f 63 61 74 65 64 20 62 75 74 20 62 65 66 6f  located but befo
27220 72 65 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e  re their argumen
27230 74 73 20 68 61 76 65 20 62 65 65 6e 20 73 75 62  ts have been sub
27240 6a 65 63 74 65 64 20 74 6f 20 61 67 67 72 65 67  jected to aggreg
27250 61 74 65 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2e  ate.** analysis.
27260 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69  .*/.static u8 mi
27270 6e 4d 61 78 51 75 65 72 79 28 73 71 6c 69 74 65  nMaxQuery(sqlite
27280 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 46 75  3 *db, Expr *pFu
27290 6e 63 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a 70  nc, ExprList **p
272a0 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20  pMinMax){.  int 
272b0 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44  eRet = WHERE_ORD
272c0 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20  ERBY_NORMAL;    
272d0 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
272e0 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
272f0 2a 70 45 4c 69 73 74 20 3d 20 70 46 75 6e 63 2d  *pEList = pFunc-
27300 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20  >x.pList;    /* 
27310 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 67 67  Arguments to agg
27320 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 63   function */.  c
27330 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
27340 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27350 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
27360 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
27370 6f 6e 20 70 46 75 6e 63 20 2a 2f 0a 20 20 45 78  on pFunc */.  Ex
27380 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
27390 3b 0a 20 20 75 38 20 73 6f 72 74 4f 72 64 65 72  ;.  u8 sortOrder
273a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70  ;..  assert( *pp
273b0 4d 69 6e 4d 61 78 3d 3d 30 20 29 3b 0a 20 20 61  MinMax==0 );.  a
273c0 73 73 65 72 74 28 20 70 46 75 6e 63 2d 3e 6f 70  ssert( pFunc->op
273d0 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  ==TK_AGG_FUNCTIO
273e0 4e 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  N );.  if( pELis
273f0 74 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74 2d 3e  t==0 || pEList->
27400 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72  nExpr!=1 ) retur
27410 6e 20 65 52 65 74 3b 0a 20 20 7a 46 75 6e 63 20  n eRet;.  zFunc 
27420 3d 20 70 46 75 6e 63 2d 3e 75 2e 7a 54 6f 6b 65  = pFunc->u.zToke
27430 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  n;.  if( sqlite3
27440 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22  StrICmp(zFunc, "
27450 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  min")==0 ){.    
27460 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44  eRet = WHERE_ORD
27470 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 73 6f  ERBY_MIN;.    so
27480 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49 54 45  rtOrder = SQLITE
27490 5f 53 4f 5f 41 53 43 3b 0a 20 20 7d 65 6c 73 65  _SO_ASC;.  }else
274a0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
274b0 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22  Cmp(zFunc, "max"
274c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65 52 65 74  )==0 ){.    eRet
274d0 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   = WHERE_ORDERBY
274e0 5f 4d 41 58 3b 0a 20 20 20 20 73 6f 72 74 4f 72  _MAX;.    sortOr
274f0 64 65 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f  der = SQLITE_SO_
27500 44 45 53 43 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  DESC;.  }else{. 
27510 20 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a     return eRet;.
27520 20 20 7d 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20    }.  *ppMinMax 
27530 3d 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  = pOrderBy = sql
27540 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
27550 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a  db, pEList, 0);.
27560 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
27570 42 79 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  By!=0 || db->mal
27580 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
27590 66 28 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f  f( pOrderBy ) pO
275a0 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 73 6f 72  rderBy->a[0].sor
275b0 74 4f 72 64 65 72 20 3d 20 73 6f 72 74 4f 72 64  tOrder = sortOrd
275c0 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 65 52 65  er;.  return eRe
275d0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
275e0 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
275f0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
27600 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
27610 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75   an aggregate qu
27620 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ery..** The seco
27630 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  nd argument is t
27640 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 61 67  he associated ag
27650 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a  gregate-info obj
27660 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  ect. This .** fu
27670 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20  nction tests if 
27680 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66  the SELECT is of
27690 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
276a0 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
276b0 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a  *) FROM <tbl>.**
276c0 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20  .** where table 
276d0 69 73 20 61 20 64 61 74 61 62 61 73 65 20 74 61  is a database ta
276e0 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73  ble, not a sub-s
276f0 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49  elect or view. I
27700 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64  f the query.** d
27710 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73 20 70  oes match this p
27720 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70  attern, then a p
27730 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61  ointer to the Ta
27740 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65  ble object repre
27750 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e  senting.** <tbl>
27760 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
27770 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65  herwise, 0 is re
27780 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
27790 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c  c Table *isSimpl
277a0 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70  eCount(Select *p
277b0 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
277c0 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  nfo){.  Table *p
277d0 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78  Tab;.  Expr *pEx
277e0 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  pr;..  assert( !
277f0 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a  p->pGroupBy );..
27800 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
27810 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  || p->pEList->nE
27820 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d  xpr!=1 .   || p-
27830 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c  >pSrc->nSrc!=1 |
27840 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  | p->pSrc->a[0].
27850 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20  pSelect.  ){.   
27860 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
27870 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pTab = p->pSrc-
27880 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45  >a[0].pTab;.  pE
27890 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
278a0 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61  >a[0].pExpr;.  a
278b0 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20 21  ssert( pTab && !
278c0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26  pTab->pSelect &&
278d0 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28   pExpr );..  if(
278e0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
278f0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
27900 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
27910 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20  _AGG_FUNCTION ) 
27920 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
27930 4e 45 56 45 52 28 70 41 67 67 49 6e 66 6f 2d 3e  NEVER(pAggInfo->
27940 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72 65 74 75  nFunc==0) ) retu
27950 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67  rn 0;.  if( (pAg
27960 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e  gInfo->aFunc[0].
27970 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73  pFunc->funcFlags
27980 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55  &SQLITE_FUNC_COU
27990 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  NT)==0 ) return 
279a0 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
279b0 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69 6e 63  flags&EP_Distinc
279c0 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  t ) return 0;.. 
279d0 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
279e0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f  ./*.** If the so
279f0 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d 20 70  urce-list item p
27a00 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
27a10 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65 6e 74  ment was augment
27a20 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e  ed with an.** IN
27a30 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
27a40 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63   then try to loc
27a50 61 74 65 20 74 68 65 20 73 70 65 63 69 66 69 65  ate the specifie
27a60 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 72  d index. If ther
27a70 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20 61 20  e.** was such a 
27a80 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6e  clause and the n
27a90 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f  amed index canno
27aa0 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75  t be found, retu
27ab0 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52  rn .** SQLITE_ER
27ac0 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20 61 6e  ROR and leave an
27ad0 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65   error in pParse
27ae0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70  . Otherwise, pop
27af0 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d  ulate .** pFrom-
27b00 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65 74 75  >pIndex and retu
27b10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  rn SQLITE_OK..*/
27b20 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65  .int sqlite3Inde
27b30 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73  xedByLookup(Pars
27b40 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63  e *pParse, struc
27b50 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
27b60 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46  pFrom){.  if( pF
27b70 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70 46 72  rom->pTab && pFr
27b80 6f 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64  om->fg.isIndexed
27b90 42 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  By ){.    Table 
27ba0 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
27bb0 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Tab;.    char *z
27bc0 49 6e 64 65 78 65 64 42 79 20 3d 20 70 46 72 6f  IndexedBy = pFro
27bd0 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
27be0 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
27bf0 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  x;.    for(pIdx=
27c00 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20  pTab->pIndex; . 
27c10 20 20 20 20 20 20 20 70 49 64 78 20 26 26 20 73         pIdx && s
27c20 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49  qlite3StrICmp(pI
27c30 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65  dx->zName, zInde
27c40 78 65 64 42 79 29 3b 20 0a 20 20 20 20 20 20 20  xedBy); .       
27c50 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
27c60 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  t.    );.    if(
27c70 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20   !pIdx ){.      
27c80 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
27c90 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
27ca0 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e   index: %s", zIn
27cb0 64 65 78 65 64 42 79 2c 20 30 29 3b 0a 20 20 20  dexedBy, 0);.   
27cc0 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
27cd0 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20  Schema = 1;.    
27ce0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27cf0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
27d00 20 70 46 72 6f 6d 2d 3e 70 49 42 49 6e 64 65 78   pFrom->pIBIndex
27d10 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72   = pIdx;.  }.  r
27d20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27d30 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74 20  .}./*.** Detect 
27d40 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
27d50 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
27d60 75 73 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  use an ORDER BY 
27d70 63 6c 61 75 73 65 20 77 69 74 68 20 0a 2a 2a 20  clause with .** 
27d80 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63  an alternative c
27d90 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
27da0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  e..**.**    SELE
27db0 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45  CT ... FROM t1 E
27dc0 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e  XCEPT SELECT ...
27dd0 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42   FROM t2 ORDER B
27de0 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e  Y .. COLLATE ...
27df0 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65  .**.** These are
27e00 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20   rewritten as a 
27e10 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  subquery:.**.** 
27e20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
27e30 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f   (SELECT ... FRO
27e40 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45  M t1 EXCEPT SELE
27e50 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29 0a  CT ... FROM t2).
27e60 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20  **     ORDER BY 
27e70 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a  ... COLLATE ....
27e80 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73  **.** This trans
27e90 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63  formation is nec
27ea0 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20 74  essary because t
27eb0 68 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  he multiSelectOr
27ec0 64 65 72 42 79 28 29 20 72 6f 75 74 69 6e 65 0a  derBy() routine.
27ed0 2a 2a 20 61 62 6f 76 65 20 74 68 61 74 20 67 65  ** above that ge
27ee0 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
27ef0 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20   for a compound 
27f00 53 45 4c 45 43 54 20 77 69 74 68 20 61 6e 20 4f  SELECT with an O
27f10 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a  RDER BY clause.*
27f20 2a 20 75 73 65 73 20 61 20 6d 65 72 67 65 20 61  * uses a merge a
27f30 6c 67 6f 72 69 74 68 6d 20 74 68 61 74 20 72 65  lgorithm that re
27f40 71 75 69 72 65 73 20 74 68 65 20 73 61 6d 65 20  quires the same 
27f50 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
27f60 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65 73  ce on the.** res
27f70 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20 6f  ult columns as o
27f80 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
27f90 6c 61 75 73 65 2e 20 20 53 65 65 20 74 69 63 6b  lause.  See tick
27fa0 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77  et.** http://www
27fb0 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f  .sqlite.org/src/
27fc0 69 6e 66 6f 2f 36 37 30 39 35 37 34 64 32 61 0a  info/6709574d2a.
27fd0 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73  **.** This trans
27fe0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c  formation is onl
27ff0 79 20 6e 65 65 64 65 64 20 66 6f 72 20 45 58 43  y needed for EXC
28000 45 50 54 2c 20 49 4e 54 45 52 53 45 43 54 2c 20  EPT, INTERSECT, 
28010 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68  and UNION..** Th
28020 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
28030 61 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65 20  ator works fine 
28040 77 69 74 68 20 6d 75 6c 74 69 53 65 6c 65 63 74  with multiSelect
28050 4f 72 64 65 72 42 79 28 29 20 65 76 65 6e 20 77  OrderBy() even w
28060 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72 65  hen.** there are
28070 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20 69   COLLATE terms i
28080 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a  n the ORDER BY..
28090 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
280a0 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c  nvertCompoundSel
280b0 65 63 74 54 6f 53 75 62 71 75 65 72 79 28 57 61  ectToSubquery(Wa
280c0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
280d0 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74  elect *p){.  int
280e0 20 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e   i;.  Select *pN
280f0 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58  ew;.  Select *pX
28100 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
28110 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
28120 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53 72  st_item *a;.  Sr
28130 63 4c 69 73 74 20 2a 70 4e 65 77 53 72 63 3b 0a  cList *pNewSrc;.
28140 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
28150 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a  .  Token dummy;.
28160 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
28170 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
28180 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28  _Continue;.  if(
28190 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
281a0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
281b0 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58 3d  tinue;.  for(pX=
281c0 70 3b 20 70 58 20 26 26 20 28 70 58 2d 3e 6f 70  p; pX && (pX->op
281d0 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e  ==TK_ALL || pX->
281e0 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b 20  op==TK_SELECT); 
281f0 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d  pX=pX->pPrior){}
28200 0a 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 72  .  if( pX==0 ) r
28210 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
28220 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f 72  ue;.  a = p->pOr
28230 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72 28  derBy->a;.  for(
28240 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  i=p->pOrderBy->n
28250 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Expr-1; i>=0; i-
28260 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 5b 69 5d  -){.    if( a[i]
28270 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  .pExpr->flags & 
28280 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72 65  EP_Collate ) bre
28290 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c  ak;.  }.  if( i<
282a0 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
282b0 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49  ontinue;..  /* I
282c0 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
282d0 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e  point, that mean
282e0 73 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61  s the transforma
282f0 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64  tion is required
28300 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d  . */..  pParse =
28310 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
28320 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
28330 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  >db;.  pNew = sq
28340 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
28350 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  o(db, sizeof(*pN
28360 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ew) );.  if( pNe
28370 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  w==0 ) return WR
28380 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73 65  C_Abort;.  memse
28390 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69 7a  t(&dummy, 0, siz
283a0 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20 70  eof(dummy));.  p
283b0 4e 65 77 53 72 63 20 3d 20 73 71 6c 69 74 65 33  NewSrc = sqlite3
283c0 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f  SrcListAppendFro
283d0 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 30 2c 30  mTerm(pParse,0,0
283e0 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c 30  ,0,&dummy,pNew,0
283f0 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 53  ,0);.  if( pNewS
28400 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  rc==0 ) return W
28410 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e 65  RC_Abort;.  *pNe
28420 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53 72  w = *p;.  p->pSr
28430 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20 70  c = pNewSrc;.  p
28440 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pEList = sqlit
28450 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
28460 28 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69  (pParse, 0, sqli
28470 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 41  te3Expr(db, TK_A
28480 53 54 45 52 49 53 4b 2c 20 30 29 29 3b 0a 20 20  STERISK, 0));.  
28490 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43  p->op = TK_SELEC
284a0 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  T;.  p->pWhere =
284b0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f   0;.  pNew->pGro
284c0 75 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77  upBy = 0;.  pNew
284d0 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20  ->pHaving = 0;. 
284e0 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
284f0 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72  = 0;.  p->pPrior
28500 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78 74   = 0;.  p->pNext
28510 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 57 69 74 68   = 0;.  p->pWith
28520 20 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c   = 0;.  p->selFl
28530 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f  ags &= ~SF_Compo
28540 75 6e 64 3b 0a 20 20 61 73 73 65 72 74 28 20 28  und;.  assert( (
28550 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
28560 5f 43 6f 6e 76 65 72 74 65 64 29 3d 3d 30 20 29  _Converted)==0 )
28570 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ;.  p->selFlags 
28580 7c 3d 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 3b  |= SF_Converted;
28590 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
285a0 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a 20 20  >pPrior!=0 );.  
285b0 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e  pNew->pPrior->pN
285c0 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e  ext = pNew;.  pN
285d0 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a  ew->pLimit = 0;.
285e0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
285f0 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
28600 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
28610 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
28620 74 65 72 6d 20 70 46 72 6f 6d 20 68 61 73 20 74  term pFrom has t
28630 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63  able-valued func
28640 74 69 6f 6e 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  tion.** argument
28650 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73 2c 20  s.  If it does, 
28660 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
28670 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
28680 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e   and return.** n
28690 6f 6e 2d 7a 65 72 6f 2c 20 73 69 6e 63 65 20 70  on-zero, since p
286a0 46 72 6f 6d 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  From is not allo
286b0 77 65 64 20 74 6f 20 62 65 20 61 20 74 61 62 6c  wed to be a tabl
286c0 65 2d 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f  e-valued functio
286d0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
286e0 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f   cannotBeFunctio
286f0 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
28700 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
28710 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  item *pFrom){.  
28720 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73  if( pFrom->fg.is
28730 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 73  TabFunc ){.    s
28740 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
28750 50 61 72 73 65 2c 20 22 27 25 73 27 20 69 73 20  Parse, "'%s' is 
28760 6e 6f 74 20 61 20 66 75 6e 63 74 69 6f 6e 22 2c  not a function",
28770 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pFrom->zName);.
28780 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
28790 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
287a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
287b0 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41  OMIT_CTE./*.** A
287c0 72 67 75 6d 65 6e 74 20 70 57 69 74 68 20 28 77  rgument pWith (w
287d0 68 69 63 68 20 6d 61 79 20 62 65 20 4e 55 4c 4c  hich may be NULL
287e0 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c 69  ) points to a li
287f0 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e 65 73  nked list of nes
28800 74 65 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f 6e  ted .** WITH con
28810 74 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e 65  texts, from inne
28820 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e 20  r to outermost. 
28830 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 64 65  If the table ide
28840 6e 74 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 46  ntified by .** F
28850 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65  ROM clause eleme
28860 6e 74 20 70 49 74 65 6d 20 69 73 20 72 65 61 6c  nt pItem is real
28870 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c  ly a common-tabl
28880 65 2d 65 78 70 72 65 73 73 69 6f 6e 20 28 43 54  e-expression (CT
28890 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  E) .** then retu
288a0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
288b0 74 68 65 20 43 54 45 20 64 65 66 69 6e 69 74 69  the CTE definiti
288c0 6f 6e 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c  on for that tabl
288d0 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  e. Otherwise.** 
288e0 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
288f0 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  ** If a non-NULL
28900 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
28910 65 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74 65  ed, set *ppConte
28920 78 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  xt to point to t
28930 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65 63  he With.** objec
28940 74 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72  t that the retur
28950 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e 67 73 20  ned CTE belongs 
28960 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  to..*/.static st
28970 72 75 63 74 20 43 74 65 20 2a 73 65 61 72 63 68  ruct Cte *search
28980 57 69 74 68 28 0a 20 20 57 69 74 68 20 2a 70 57  With(.  With *pW
28990 69 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ith,            
289a0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
289b0 6e 74 20 69 6e 6e 65 72 6d 6f 73 74 20 57 49 54  nt innermost WIT
289c0 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  H clause */.  st
289d0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
289e0 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f 2a  m *pItem,     /*
289f0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65   FROM clause ele
28a00 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65 20  ment to resolve 
28a10 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70 43 6f  */.  With **ppCo
28a20 6e 74 65 78 74 20 20 20 20 20 20 20 20 20 20 20  ntext           
28a30 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49 54       /* OUT: WIT
28a40 48 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e 20  H clause return 
28a50 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74 6f  value belongs to
28a60 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
28a70 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66  har *zName;.  if
28a80 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  ( pItem->zDataba
28a90 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65 20  se==0 && (zName 
28aa0 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21  = pItem->zName)!
28ab0 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a  =0 ){.    With *
28ac0 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 57 69  p;.    for(p=pWi
28ad0 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75 74  th; p; p=p->pOut
28ae0 65 72 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  er){.      int i
28af0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
28b00 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29   i<p->nCte; i++)
28b10 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
28b20 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61  lite3StrICmp(zNa
28b30 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  me, p->a[i].zNam
28b40 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
28b50 20 20 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d 20     *ppContext = 
28b60 70 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  p;.          ret
28b70 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  urn &p->a[i];.  
28b80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
28b90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
28ba0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  rn 0;.}../* The 
28bb0 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6d  code generator m
28bc0 61 69 6e 74 61 69 6e 73 20 61 20 73 74 61 63 6b  aintains a stack
28bd0 20 6f 66 20 61 63 74 69 76 65 20 57 49 54 48 20   of active WITH 
28be0 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74 68 20  clauses.** with 
28bf0 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 57  the inner-most W
28c00 49 54 48 20 63 6c 61 75 73 65 20 62 65 69 6e 67  ITH clause being
28c10 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
28c20 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  he stack..**.** 
28c30 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75 73  This routine pus
28c40 68 65 73 20 74 68 65 20 57 49 54 48 20 63 6c 61  hes the WITH cla
28c50 75 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68  use passed as th
28c60 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
28c70 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74 6f  t.** onto the to
28c80 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20  p of the stack. 
28c90 49 66 20 61 72 67 75 6d 65 6e 74 20 62 46 72 65  If argument bFre
28ca0 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
28cb0 74 68 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c 61  this.** WITH cla
28cc0 75 73 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  use will never b
28cd0 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68  e popped from th
28ce0 65 20 73 74 61 63 6b 2e 20 49 6e 20 74 68 69 73  e stack. In this
28cf0 20 63 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f 75   case it.** shou
28d00 6c 64 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e  ld be freed alon
28d10 67 20 77 69 74 68 20 74 68 65 20 50 61 72 73 65  g with the Parse
28d20 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68 65   object. In othe
28d30 72 20 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a 2a  r cases, when.**
28d40 20 62 46 72 65 65 3d 3d 30 2c 20 74 68 65 20 57   bFree==0, the W
28d50 69 74 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  ith object will 
28d60 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77  be freed along w
28d70 69 74 68 20 74 68 65 20 53 45 4c 45 43 54 20 0a  ith the SELECT .
28d80 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74  ** statement wit
28d90 68 20 77 68 69 63 68 20 69 74 20 69 73 20 61 73  h which it is as
28da0 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69  sociated..*/.voi
28db0 64 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73  d sqlite3WithPus
28dc0 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  h(Parse *pParse,
28dd0 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 75 38   With *pWith, u8
28de0 20 62 46 72 65 65 29 7b 0a 20 20 61 73 73 65 72   bFree){.  asser
28df0 74 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20 28  t( bFree==0 || (
28e00 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 30  pParse->pWith==0
28e10 20 26 26 20 70 50 61 72 73 65 2d 3e 70 57 69 74   && pParse->pWit
28e20 68 54 6f 46 72 65 65 3d 3d 30 29 20 29 3b 0a 20  hToFree==0) );. 
28e30 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20   if( pWith ){.  
28e40 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
28e50 2d 3e 70 57 69 74 68 21 3d 70 57 69 74 68 20 29  ->pWith!=pWith )
28e60 3b 0a 20 20 20 20 70 57 69 74 68 2d 3e 70 4f 75  ;.    pWith->pOu
28e70 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 70 57  ter = pParse->pW
28e80 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ith;.    pParse-
28e90 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a  >pWith = pWith;.
28ea0 20 20 20 20 69 66 28 20 62 46 72 65 65 20 29 20      if( bFree ) 
28eb0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46  pParse->pWithToF
28ec0 72 65 65 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d  ree = pWith;.  }
28ed0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
28ee0 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69  unction checks i
28ef0 66 20 61 72 67 75 6d 65 6e 74 20 70 46 72 6f 6d  f argument pFrom
28f00 20 72 65 66 65 72 73 20 74 6f 20 61 20 43 54 45   refers to a CTE
28f10 20 64 65 63 6c 61 72 65 64 20 62 79 20 0a 2a 2a   declared by .**
28f20 20 61 20 57 49 54 48 20 63 6c 61 75 73 65 20 6f   a WITH clause o
28f30 6e 20 74 68 65 20 73 74 61 63 6b 20 63 75 72 72  n the stack curr
28f40 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65 64  ently maintained
28f50 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e 20   by the parser. 
28f60 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72 65  And,.** if curre
28f70 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20  ntly processing 
28f80 61 20 43 54 45 20 65 78 70 72 65 73 73 69 6f 6e  a CTE expression
28f90 2c 20 69 66 20 69 74 20 69 73 20 61 20 72 65 63  , if it is a rec
28fa0 75 72 73 69 76 65 0a 2a 2a 20 72 65 66 65 72 65  ursive.** refere
28fb0 6e 63 65 20 74 6f 20 74 68 65 20 63 75 72 72 65  nce to the curre
28fc0 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  nt CTE..**.** If
28fd0 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e 74   pFrom falls int
28fe0 6f 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  o either of the 
28ff0 74 77 6f 20 63 61 74 65 67 6f 72 69 65 73 20 61  two categories a
29000 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54 61  bove, pFrom->pTa
29010 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66  b.** and other f
29020 69 65 6c 64 73 20 61 72 65 20 70 6f 70 75 6c 61  ields are popula
29030 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
29040 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75   The caller shou
29050 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46 72  ld check.** (pFr
29060 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f 20  om->pTab!=0) to 
29070 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
29080 72 20 6f 72 20 6e 6f 74 20 61 20 73 75 63 63 65  r or not a succe
29090 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20 77  ssful match.** w
290a0 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20  as found..**.** 
290b0 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
290c0 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c   match is found,
290d0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
290e0 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
290f0 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49 66  or.** occurs. If
29100 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f   an error does o
29110 63 63 75 72 2c 20 61 6e 20 65 72 72 6f 72 20 6d  ccur, an error m
29120 65 73 73 61 67 65 20 69 73 20 73 74 6f 72 65 64  essage is stored
29130 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73 65   in the.** parse
29140 72 20 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f 72  r and some error
29150 20 63 6f 64 65 20 6f 74 68 65 72 20 74 68 61 6e   code other than
29160 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
29170 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
29180 6e 74 20 77 69 74 68 45 78 70 61 6e 64 28 0a 20  nt withExpand(. 
29190 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72   Walker *pWalker
291a0 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  , .  struct SrcL
291b0 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 0a  ist_item *pFrom.
291c0 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
291d0 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
291e0 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20  arse;.  sqlite3 
291f0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
29200 3b 0a 20 20 73 74 72 75 63 74 20 43 74 65 20 2a  ;.  struct Cte *
29210 70 43 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  pCte;           
29220 20 20 20 20 2f 2a 20 4d 61 74 63 68 65 64 20 43      /* Matched C
29230 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20 6e  TE (or NULL if n
29240 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57 69  o match) */.  Wi
29250 74 68 20 2a 70 57 69 74 68 3b 20 20 20 20 20 20  th *pWith;      
29260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29270 20 57 49 54 48 20 63 6c 61 75 73 65 20 74 68 61   WITH clause tha
29280 74 20 70 43 74 65 20 62 65 6c 6f 6e 67 73 20 74  t pCte belongs t
29290 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  o */..  assert( 
292a0 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
292b0 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73 65 61 72  ;..  pCte = sear
292c0 63 68 57 69 74 68 28 70 50 61 72 73 65 2d 3e 70  chWith(pParse->p
292d0 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70 57  With, pFrom, &pW
292e0 69 74 68 29 3b 0a 20 20 69 66 28 20 70 43 74 65  ith);.  if( pCte
292f0 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
29300 54 61 62 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  Tab;.    ExprLis
29310 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53  t *pEList;.    S
29320 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20  elect *pSel;.   
29330 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b 20   Select *pLeft; 
29340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29350 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45  * Left-most SELE
29360 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
29370 20 20 20 20 69 6e 74 20 62 4d 61 79 52 65 63 75      int bMayRecu
29380 72 73 69 76 65 3b 20 20 20 20 20 20 20 20 20 20  rsive;          
29390 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 6f 6d    /* True if com
293a0 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79 20  pound joined by 
293b0 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20  UNION [ALL] */. 
293c0 20 20 20 57 69 74 68 20 2a 70 53 61 76 65 64 57     With *pSavedW
293d0 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ith;            
293e0 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75   /* Initial valu
293f0 65 20 6f 66 20 70 50 61 72 73 65 2d 3e 70 57 69  e of pParse->pWi
29400 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66  th */..    /* If
29410 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69   pCte->zCteErr i
29420 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68  s non-NULL at th
29430 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74  is point, then t
29440 68 69 73 20 69 73 20 61 6e 20 69 6c 6c 65 67 61  his is an illega
29450 6c 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69  l.    ** recursi
29460 76 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ve reference to 
29470 43 54 45 20 70 43 74 65 2e 20 4c 65 61 76 65 20  CTE pCte. Leave 
29480 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
29490 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  se and return.  
294a0 20 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20 70    ** early. If p
294b0 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69 73 20  Cte->zCteErr is 
294c0 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20  NULL, then this 
294d0 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69  is not a recursi
294e0 76 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 20 20  ve reference..  
294f0 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
29500 65 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a  e, proceed.  */.
29510 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e 7a 43      if( pCte->zC
29520 74 65 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73  teErr ){.      s
29530 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
29540 50 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a 43 74  Parse, pCte->zCt
29550 65 45 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d  eErr, pCte->zNam
29560 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
29570 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
29580 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 61 6e     }.    if( can
29590 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50  notBeFunction(pP
295a0 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 20 72  arse, pFrom) ) r
295b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
295c0 4f 52 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  OR;..    assert(
295d0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
295e0 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  );.    pFrom->pT
295f0 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69  ab = pTab = sqli
29600 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
29610 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
29620 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ));.    if( pTab
29630 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
29640 5f 41 62 6f 72 74 3b 0a 20 20 20 20 70 54 61 62  _Abort;.    pTab
29650 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20  ->nTabRef = 1;. 
29660 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d     pTab->zName =
29670 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
29680 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  (db, pCte->zName
29690 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b  );.    pTab->iPK
296a0 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 70 54 61  ey = -1;.    pTa
296b0 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20  b->nRowLogEst = 
296c0 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30  200; assert( 200
296d0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
296e0 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20  1048576) );.    
296f0 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
29700 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 20 7c  = TF_Ephemeral |
29710 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77   TF_NoVisibleRow
29720 69 64 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70  id;.    pFrom->p
29730 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
29740 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 43  SelectDup(db, pC
29750 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b  te->pSelect, 0);
29760 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
29770 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
29780 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
29790 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74  BKPT;.    assert
297a0 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  ( pFrom->pSelect
297b0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63   );..    /* Chec
297c0 6b 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72  k if this is a r
297d0 65 63 75 72 73 69 76 65 20 43 54 45 2e 20 2a 2f  ecursive CTE. */
297e0 0a 20 20 20 20 70 53 65 6c 20 3d 20 70 46 72 6f  .    pSel = pFro
297f0 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
29800 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 3d 20  bMayRecursive = 
29810 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41  ( pSel->op==TK_A
29820 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d  LL || pSel->op==
29830 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20  TK_UNION );.    
29840 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76  if( bMayRecursiv
29850 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  e ){.      int i
29860 3b 0a 20 20 20 20 20 20 53 72 63 4c 69 73 74 20  ;.      SrcList 
29870 2a 70 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSrc = pFrom->p
29880 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20  Select->pSrc;.  
29890 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
298a0 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  Src->nSrc; i++){
298b0 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
298c0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
298d0 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69  tem = &pSrc->a[i
298e0 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
298f0 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d  Item->zDatabase=
29900 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0 .         && 
29910 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20  pItem->zName!=0 
29920 0a 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d  .         && 0==
29930 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
29940 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74  Item->zName, pCt
29950 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20  e->zName).      
29960 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
29970 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70   pItem->pTab = p
29980 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
29990 49 74 65 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72  Item->fg.isRecur
299a0 73 69 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  sive = 1;.      
299b0 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65      pTab->nTabRe
299c0 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  f++;.          p
299d0 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  Sel->selFlags |=
299e0 20 53 46 5f 52 65 63 75 72 73 69 76 65 3b 0a 20   SF_Recursive;. 
299f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
29a00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f  .    }..    /* O
29a10 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72 73 69 76  nly one recursiv
29a20 65 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 70  e reference is p
29a30 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20  ermitted. */ .  
29a40 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 54 61 62    if( pTab->nTab
29a50 52 65 66 3e 32 20 29 7b 0a 20 20 20 20 20 20 73  Ref>2 ){.      s
29a60 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 0a  qlite3ErrorMsg(.
29a70 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
29a80 2c 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 66 65  , "multiple refe
29a90 72 65 6e 63 65 73 20 74 6f 20 72 65 63 75 72 73  rences to recurs
29aa0 69 76 65 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  ive table: %s", 
29ab0 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  pCte->zName.    
29ac0 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72    );.      retur
29ad0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
29ae0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
29af0 28 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3d  ( pTab->nTabRef=
29b00 3d 31 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  =1 || .         
29b10 20 20 20 28 28 70 53 65 6c 2d 3e 73 65 6c 46 6c     ((pSel->selFl
29b20 61 67 73 26 53 46 5f 52 65 63 75 72 73 69 76 65  ags&SF_Recursive
29b30 29 20 26 26 20 70 54 61 62 2d 3e 6e 54 61 62 52  ) && pTab->nTabR
29b40 65 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20 20 70  ef==2 ));..    p
29b50 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22  Cte->zCteErr = "
29b60 63 69 72 63 75 6c 61 72 20 72 65 66 65 72 65 6e  circular referen
29b70 63 65 3a 20 25 73 22 3b 0a 20 20 20 20 70 53 61  ce: %s";.    pSa
29b80 76 65 64 57 69 74 68 20 3d 20 70 50 61 72 73 65  vedWith = pParse
29b90 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61  ->pWith;.    pPa
29ba0 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69  rse->pWith = pWi
29bb0 74 68 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79  th;.    if( bMay
29bc0 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
29bd0 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f     Select *pPrio
29be0 72 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  r = pSel->pPrior
29bf0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
29c00 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 3d 3d 30  pPrior->pWith==0
29c10 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72   );.      pPrior
29c20 2d 3e 70 57 69 74 68 20 3d 20 70 53 65 6c 2d 3e  ->pWith = pSel->
29c30 70 57 69 74 68 3b 0a 20 20 20 20 20 20 73 71 6c  pWith;.      sql
29c40 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
29c50 57 61 6c 6b 65 72 2c 20 70 50 72 69 6f 72 29 3b  Walker, pPrior);
29c60 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70  .      pPrior->p
29c70 57 69 74 68 20 3d 20 30 3b 0a 20 20 20 20 7d 65  With = 0;.    }e
29c80 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
29c90 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
29ca0 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20  lker, pSel);.   
29cb0 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70   }.    pParse->p
29cc0 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 0a 20  With = pWith;.. 
29cd0 20 20 20 66 6f 72 28 70 4c 65 66 74 3d 70 53 65     for(pLeft=pSe
29ce0 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72  l; pLeft->pPrior
29cf0 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70  ; pLeft=pLeft->p
29d00 50 72 69 6f 72 29 3b 0a 20 20 20 20 70 45 4c 69  Prior);.    pELi
29d10 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45 4c 69  st = pLeft->pELi
29d20 73 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 65  st;.    if( pCte
29d30 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20 20 20  ->pCols ){.     
29d40 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70   if( pEList && p
29d50 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 43  EList->nExpr!=pC
29d60 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72  te->pCols->nExpr
29d70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
29d80 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
29d90 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61  se, "table %s ha
29da0 73 20 25 64 20 76 61 6c 75 65 73 20 66 6f 72 20  s %d values for 
29db0 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20  %d columns",.   
29dc0 20 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a           pCte->z
29dd0 4e 61 6d 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Name, pEList->nE
29de0 78 70 72 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73  xpr, pCte->pCols
29df0 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20  ->nExpr.        
29e00 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
29e10 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65  e->pWith = pSave
29e20 64 57 69 74 68 3b 0a 20 20 20 20 20 20 20 20 72  dWith;.        r
29e30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
29e40 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
29e50 20 20 70 45 4c 69 73 74 20 3d 20 70 43 74 65 2d    pEList = pCte-
29e60 3e 70 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20  >pCols;.    }.. 
29e70 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
29e80 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  sFromExprList(pP
29e90 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 26 70  arse, pEList, &p
29ea0 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  Tab->nCol, &pTab
29eb0 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28  ->aCol);.    if(
29ec0 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29   bMayRecursive )
29ed0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c  {.      if( pSel
29ee0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
29ef0 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
29f00 20 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45       pCte->zCteE
29f10 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20 72  rr = "multiple r
29f20 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
29f30 63 65 73 3a 20 25 73 22 3b 0a 20 20 20 20 20 20  ces: %s";.      
29f40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
29f50 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22  Cte->zCteErr = "
29f60 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
29f70 6e 63 65 20 69 6e 20 61 20 73 75 62 71 75 65 72  nce in a subquer
29f80 79 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a  y: %s";.      }.
29f90 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
29fa0 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
29fb0 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   pSel);.    }.  
29fc0 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20    pCte->zCteErr 
29fd0 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  = 0;.    pParse-
29fe0 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57  >pWith = pSavedW
29ff0 69 74 68 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ith;.  }..  retu
2a000 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2a010 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
2a020 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
2a030 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c  /*.** If the SEL
2a040 45 43 54 20 70 61 73 73 65 64 20 61 73 20 74 68  ECT passed as th
2a050 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2a060 74 20 68 61 73 20 61 6e 20 61 73 73 6f 63 69 61  t has an associa
2a070 74 65 64 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61  ted WITH .** cla
2a080 75 73 65 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d  use, pop it from
2a090 20 74 68 65 20 73 74 61 63 6b 20 73 74 6f 72 65   the stack store
2a0a0 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
2a0b0 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a   Parse object..*
2a0c0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2a0d0 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20 74 68  on is used as th
2a0e0 65 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  e xSelectCallbac
2a0f0 6b 32 28 29 20 63 61 6c 6c 62 61 63 6b 20 62 79  k2() callback by
2a100 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63  .** sqlite3Selec
2a110 74 45 78 70 61 6e 64 28 29 20 77 68 65 6e 20 77  tExpand() when w
2a120 61 6c 6b 69 6e 67 20 61 20 53 45 4c 45 43 54 20  alking a SELECT 
2a130 74 72 65 65 20 74 6f 20 72 65 73 6f 6c 76 65 20  tree to resolve 
2a140 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61  table.** names a
2a150 6e 64 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c  nd other FROM cl
2a160 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a  ause elements. .
2a170 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
2a180 65 6c 65 63 74 50 6f 70 57 69 74 68 28 57 61 6c  electPopWith(Wal
2a190 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
2a1a0 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73  lect *p){.  Pars
2a1b0 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
2a1c0 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  ker->pParse;.  i
2a1d0 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f  f( OK_IF_ALWAYS_
2a1e0 54 52 55 45 28 70 50 61 72 73 65 2d 3e 70 57 69  TRUE(pParse->pWi
2a1f0 74 68 29 20 26 26 20 70 2d 3e 70 50 72 69 6f 72  th) && p->pPrior
2a200 3d 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20  ==0 ){.    With 
2a210 2a 70 57 69 74 68 20 3d 20 66 69 6e 64 52 69 67  *pWith = findRig
2a220 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68  htmost(p)->pWith
2a230 3b 0a 20 20 20 20 69 66 28 20 70 57 69 74 68 21  ;.    if( pWith!
2a240 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
2a250 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74  rt( pParse->pWit
2a260 68 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20  h==pWith );.    
2a270 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
2a280 3d 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 3b  = pWith->pOuter;
2a290 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c  .    }.  }.}.#el
2a2a0 73 65 0a 23 64 65 66 69 6e 65 20 73 65 6c 65 63  se.#define selec
2a2b0 74 50 6f 70 57 69 74 68 20 30 0a 23 65 6e 64 69  tPopWith 0.#endi
2a2c0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 53 72 63  f../*.** The Src
2a2d0 4c 69 73 74 5f 69 74 65 6d 20 73 74 72 75 63 74  List_item struct
2a2e0 75 72 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ure passed as th
2a2f0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2a300 74 20 72 65 70 72 65 73 65 6e 74 73 20 61 0a 2a  t represents a.*
2a310 2a 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  * sub-query in t
2a320 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
2a330 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  f a SELECT state
2a340 6d 65 6e 74 2e 20 54 68 69 73 20 66 75 6e 63 74  ment. This funct
2a350 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73  ion.** allocates
2a360 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 73 20 74   and populates t
2a370 68 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 2e  he SrcList_item.
2a380 70 54 61 62 20 6f 62 6a 65 63 74 2e 20 49 66 20  pTab object. If 
2a390 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 53  successful,.** S
2a3a0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2a3b0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
2a3c0 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   if an OOM error
2a3d0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
2a3e0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
2a3f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2a400 45 78 70 61 6e 64 53 75 62 71 75 65 72 79 28 50  ExpandSubquery(P
2a410 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74  arse *pParse, st
2a420 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2a430 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 53 65 6c  m *pFrom){.  Sel
2a440 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f  ect *pSel = pFro
2a450 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 54 61  m->pSelect;.  Ta
2a460 62 6c 65 20 2a 70 54 61 62 3b 0a 0a 20 20 61 73  ble *pTab;..  as
2a470 73 65 72 74 28 20 70 53 65 6c 20 29 3b 0a 20 20  sert( pSel );.  
2a480 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
2a490 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ab = sqlite3DbMa
2a4a0 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
2a4b0 3e 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  >db, sizeof(Tabl
2a4c0 65 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  e));.  if( pTab=
2a4d0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
2a4e0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 54 61 62  TE_NOMEM;.  pTab
2a4f0 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20  ->nTabRef = 1;. 
2a500 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69   if( pFrom->zAli
2a510 61 73 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  as ){.    pTab->
2a520 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
2a530 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e  bStrDup(pParse->
2a540 64 62 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61  db, pFrom->zAlia
2a550 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  s);.  }else{.   
2a560 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pTab->zName = s
2a570 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50  qlite3MPrintf(pP
2a580 61 72 73 65 2d 3e 64 62 2c 20 22 73 75 62 71 75  arse->db, "subqu
2a590 65 72 79 5f 25 75 22 2c 20 70 53 65 6c 2d 3e 73  ery_%u", pSel->s
2a5a0 65 6c 49 64 29 3b 0a 20 20 7d 0a 20 20 77 68 69  elId);.  }.  whi
2a5b0 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  le( pSel->pPrior
2a5c0 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d   ){ pSel = pSel-
2a5d0 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 73 71 6c  >pPrior; }.  sql
2a5e0 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
2a5f0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
2a600 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 26 70 54  pSel->pEList,&pT
2a610 61 62 2d 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e  ab->nCol,&pTab->
2a620 61 43 6f 6c 29 3b 0a 20 20 70 54 61 62 2d 3e 69  aCol);.  pTab->i
2a630 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61  PKey = -1;.  pTa
2a640 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20  b->nRowLogEst = 
2a650 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30  200; assert( 200
2a660 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
2a670 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 70 54  1048576) );.  pT
2a680 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
2a690 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 0a 20  TF_Ephemeral;.. 
2a6a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2a6b0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
2a6c0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61   routine is a Wa
2a6d0 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f  lker callback fo
2a6e0 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20  r "expanding" a 
2a6f0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2a700 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22  ..** "Expanding"
2a710 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65   means to do the
2a720 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
2a730 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73  *    (1)  Make s
2a740 75 72 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  ure VDBE cursor 
2a750 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
2a760 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76  n assigned to ev
2a770 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65  ery.**         e
2a780 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52  lement of the FR
2a790 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
2a7a0 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e      (2)  Fill in
2a7b0 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61   the pTabList->a
2a7c0 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69  [].pTab fields i
2a7d0 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68  n the SrcList th
2a7e0 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64  at .**         d
2a7f0 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75  efines FROM clau
2a800 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20  se.  When views 
2a810 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
2a820 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20  OM clause,.**   
2a830 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c        fill pTabL
2a840 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74  ist->a[].pSelect
2a850 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
2a860 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
2a870 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
2a880 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
2a890 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70  the view.  A cop
2a8a0 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65  y is made of the
2a8b0 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a   view's SELECT.*
2a8c0 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d  *         statem
2a8d0 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63  ent so that we c
2a8e0 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79  an freely modify
2a8f0 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20   or delete that 
2a900 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
2a910 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72       without wor
2a920 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73  rying about mess
2a930 69 6e 67 20 75 70 20 74 68 65 20 70 65 72 73 69  ing up the persi
2a940 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61  stent representa
2a950 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tion.**         
2a960 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a  of the view..**.
2a970 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64 20 74  **    (3)  Add t
2a980 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52  erms to the WHER
2a990 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f  E clause to acco
2a9a0 6d 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55  mmodate the NATU
2a9b0 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20  RAL keyword.**  
2a9c0 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20         on joins 
2a9d0 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55  and the ON and U
2a9e0 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a  SING clause of j
2a9f0 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  oins..**.**    (
2aa00 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73  4)  Scan the lis
2aa10 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  t of columns in 
2aa20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28  the result set (
2aa30 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a  pEList) looking.
2aa40 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69  **         for i
2aa50 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
2aa60 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  "*" operator or 
2aa70 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72  the TABLE.* oper
2aa80 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ator..**        
2aa90 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e   If found, expan
2aaa0 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65  d each "*" to be
2aab0 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
2aac0 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20   every table.** 
2aad0 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c          and TABL
2aae0 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20  E.* to be every 
2aaf0 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e  column in TABLE.
2ab00 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
2ab10 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  t selectExpander
2ab20 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2ab30 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
2ab40 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
2ab50 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
2ab60 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a  .  int i, j, k;.
2ab70 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
2ab80 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
2ab90 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  *pEList;.  struc
2aba0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2abb0 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pFrom;.  sqlite3
2abc0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
2abd0 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 2a  b;.  Expr *pE, *
2abe0 70 52 69 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a  pRight, *pExpr;.
2abf0 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 20 3d    u16 selFlags =
2ac00 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 20 20   p->selFlags;.  
2ac10 75 33 32 20 65 6c 69 73 74 46 6c 61 67 73 20 3d  u32 elistFlags =
2ac20 20 30 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c 61   0;..  p->selFla
2ac30 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65  gs |= SF_Expande
2ac40 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  d;.  if( db->mal
2ac50 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20  locFailed  ){.  
2ac60 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
2ac70 72 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rt;.  }.  assert
2ac80 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a  ( p->pSrc!=0 );.
2ac90 20 20 69 66 28 20 28 73 65 6c 46 6c 61 67 73 20    if( (selFlags 
2aca0 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d  & SF_Expanded)!=
2acb0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
2acc0 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20  WRC_Prune;.  }. 
2acd0 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
2ace0 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  Src;.  pEList = 
2acf0 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c  p->pEList;.  sql
2ad00 69 74 65 33 57 69 74 68 50 75 73 68 28 70 50 61  ite3WithPush(pPa
2ad10 72 73 65 2c 20 70 2d 3e 70 57 69 74 68 2c 20 30  rse, p->pWith, 0
2ad20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  );..  /* Make su
2ad30 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  re cursor number
2ad40 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69  s have been assi
2ad50 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72  gned to all entr
2ad60 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20  ies in.  ** the 
2ad70 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
2ad80 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
2ad90 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ent..  */.  sqli
2ada0 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
2adb0 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
2adc0 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a  pTabList);..  /*
2add0 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74   Look up every t
2ade0 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68  able named in th
2adf0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
2ae00 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66   the select.  If
2ae10 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f  .  ** an entry o
2ae20 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
2ae30 65 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20  e is a subquery 
2ae40 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61 62  instead of a tab
2ae50 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a  le or view,.  **
2ae60 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 74   then create a t
2ae70 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73  ransient table s
2ae80 74 72 75 63 74 75 72 65 20 74 6f 20 64 65 73 63  tructure to desc
2ae90 72 69 62 65 20 74 68 65 20 73 75 62 71 75 65 72  ribe the subquer
2aea0 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  y..  */.  for(i=
2aeb0 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
2aec0 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
2aed0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
2aee0 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  om++){.    Table
2aef0 20 2a 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65   *pTab;.    asse
2af00 72 74 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73  rt( pFrom->fg.is
2af10 52 65 63 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20  Recursive==0 || 
2af20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29  pFrom->pTab!=0 )
2af30 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  ;.    if( pFrom-
2af40 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  >fg.isRecursive 
2af50 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2af60 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
2af70 54 61 62 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65  Tab==0 );.#ifnde
2af80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
2af90 45 0a 20 20 20 20 69 66 28 20 77 69 74 68 45 78  E.    if( withEx
2afa0 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c 20 70 46  pand(pWalker, pF
2afb0 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52  rom) ) return WR
2afc0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69 66 28  C_Abort;.    if(
2afd0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b   pFrom->pTab ) {
2afe0 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20  } else.#endif.  
2aff0 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61    if( pFrom->zNa
2b000 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66  me==0 ){.#ifndef
2b010 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
2b020 51 55 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65  QUERY.      Sele
2b030 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d  ct *pSel = pFrom
2b040 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
2b050 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
2b060 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2b070 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
2b080 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
2b090 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  pSel!=0 );.     
2b0a0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
2b0b0 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  pTab==0 );.     
2b0c0 20 69 66 28 20 73 71 6c 69 74 65 33 57 61 6c 6b   if( sqlite3Walk
2b0d0 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
2b0e0 70 53 65 6c 29 20 29 20 72 65 74 75 72 6e 20 57  pSel) ) return W
2b0f0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
2b100 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 61 6e  if( sqlite3Expan
2b110 64 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65  dSubquery(pParse
2b120 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72  , pFrom) ) retur
2b130 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 23 65 6e  n WRC_Abort;.#en
2b140 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
2b150 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e       /* An ordin
2b160 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65  ary table or vie
2b170 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52  w name in the FR
2b180 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
2b190 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
2b1a0 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
2b1b0 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
2b1c0 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
2b1d0 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70  ocateTableItem(p
2b1e0 50 61 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29  Parse, 0, pFrom)
2b1f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
2b200 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
2b210 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 69 66  _Abort;.      if
2b220 28 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e  ( pTab->nTabRef>
2b230 3d 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20 20  =0xffff ){.     
2b240 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2b250 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
2b260 6d 61 6e 79 20 72 65 66 65 72 65 6e 63 65 73 20  many references 
2b270 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36  to \"%s\": max 6
2b280 35 35 33 35 22 2c 0a 20 20 20 20 20 20 20 20 20  5535",.         
2b290 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a    pTab->zName);.
2b2a0 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70          pFrom->p
2b2b0 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Tab = 0;.       
2b2c0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
2b2d0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
2b2e0 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b   pTab->nTabRef++
2b2f0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 56  ;.      if( !IsV
2b300 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26 20  irtual(pTab) && 
2b310 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e  cannotBeFunction
2b320 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20  (pParse, pFrom) 
2b330 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
2b340 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
2b350 20 20 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65     }.#if !define
2b360 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
2b370 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20  EW) || !defined 
2b380 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
2b390 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20  TUALTABLE).     
2b3a0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
2b3b0 54 61 62 29 20 7c 7c 20 70 54 61 62 2d 3e 70 53  Tab) || pTab->pS
2b3c0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
2b3d0 20 69 31 36 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   i16 nCol;.     
2b3e0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69     if( sqlite3Vi
2b3f0 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
2b400 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29  (pParse, pTab) )
2b410 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
2b420 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
2b430 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  t( pFrom->pSelec
2b440 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
2b450 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pFrom->pSelect =
2b460 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
2b470 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c  p(db, pTab->pSel
2b480 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ect, 0);.       
2b490 20 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43   nCol = pTab->nC
2b4a0 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62  ol;.        pTab
2b4b0 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20  ->nCol = -1;.   
2b4c0 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
2b4d0 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
2b4e0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pFrom->pSelect);
2b4f0 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  .        pTab->n
2b500 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20  Col = nCol;.    
2b510 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
2b520 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20  ..    /* Locate 
2b530 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 64 20  the index named 
2b540 62 79 20 74 68 65 20 49 4e 44 45 58 45 44 20 42  by the INDEXED B
2b550 59 20 63 6c 61 75 73 65 2c 20 69 66 20 61 6e 79  Y clause, if any
2b560 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  . */.    if( sql
2b570 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f  ite3IndexedByLoo
2b580 6b 75 70 28 70 50 61 72 73 65 2c 20 70 46 72 6f  kup(pParse, pFro
2b590 6d 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  m) ){.      retu
2b5a0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
2b5b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72    }.  }..  /* Pr
2b5c0 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65  ocess NATURAL ke
2b5d0 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61  ywords, and ON a
2b5e0 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
2b5f0 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a   of joins..  */.
2b600 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
2b610 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65  Failed || sqlite
2b620 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72  ProcessJoin(pPar
2b630 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65  se, p) ){.    re
2b640 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
2b650 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76    }..  /* For ev
2b660 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63  ery "*" that occ
2b670 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  urs in the colum
2b680 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74  n list, insert t
2b690 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a  he names of.  **
2b6a0 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
2b6b0 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64  all tables.  And
2b6c0 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45   for every TABLE
2b6d0 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  .* insert the na
2b6e0 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20  mes.  ** of all 
2b6f0 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45  columns in TABLE
2b700 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e  .  The parser in
2b710 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c  serted a special
2b720 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
2b730 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 53 54   with the TK_AST
2b740 45 52 49 53 4b 20 6f 70 65 72 61 74 6f 72 20 66  ERISK operator f
2b750 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74  or each "*" that
2b760 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   it found in the
2b770 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6c 69 73   column.  ** lis
2b780 74 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  t.  The followin
2b790 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20  g code just has 
2b7a0 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b  to locate the TK
2b7b0 5f 41 53 54 45 52 49 53 4b 0a 20 20 2a 2a 20 65  _ASTERISK.  ** e
2b7c0 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65  xpressions and e
2b7d0 78 70 61 6e 64 20 65 61 63 68 20 6f 6e 65 20 74  xpand each one t
2b7e0 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
2b7f0 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a 20 20 2a  l columns in.  *
2b800 2a 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20  * all tables..  
2b810 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
2b820 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63  t loop just chec
2b830 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ks to see if the
2b840 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f  re are any "*" o
2b850 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68  perators.  ** th
2b860 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e  at need expandin
2b870 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d  g..  */.  for(k=
2b880 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
2b890 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 70 45  pr; k++){.    pE
2b8a0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e   = pEList->a[k].
2b8b0 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
2b8c0 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49  E->op==TK_ASTERI
2b8d0 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  SK ) break;.    
2b8e0 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
2b8f0 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52  TK_DOT || pE->pR
2b900 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  ight!=0 );.    a
2b910 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54  ssert( pE->op!=T
2b920 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c  K_DOT || (pE->pL
2b930 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c  eft!=0 && pE->pL
2b940 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20  eft->op==TK_ID) 
2b950 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  );.    if( pE->o
2b960 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
2b970 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f  >pRight->op==TK_
2b980 41 53 54 45 52 49 53 4b 20 29 20 62 72 65 61 6b  ASTERISK ) break
2b990 3b 0a 20 20 20 20 65 6c 69 73 74 46 6c 61 67 73  ;.    elistFlags
2b9a0 20 7c 3d 20 70 45 2d 3e 66 6c 61 67 73 3b 0a 20   |= pE->flags;. 
2b9b0 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73   }.  if( k<pELis
2b9c0 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
2b9d0 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20  /*.    ** If we 
2b9e0 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e  get here it mean
2b9f0 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
2ba00 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
2ba10 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a   more "*".    **
2ba20 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
2ba30 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
2ba40 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75  ded.  Loop throu
2ba50 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
2ba60 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  on.    ** in the
2ba70 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20   result set and 
2ba80 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20  expand them one 
2ba90 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  by one..    */. 
2baa0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
2bab0 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c  st_item *a = pEL
2bac0 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72  ist->a;.    Expr
2bad0 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  List *pNew = 0;.
2bae0 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
2baf0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
2bb00 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e  s;.    int longN
2bb10 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20  ames = (flags & 
2bb20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
2bb30 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20  mes)!=0.        
2bb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
2bb50 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
2bb60 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d  _ShortColNames)=
2bb70 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30  =0;..    for(k=0
2bb80 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
2bb90 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 70  r; k++){.      p
2bba0 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  E = a[k].pExpr;.
2bbb0 20 20 20 20 20 20 65 6c 69 73 74 46 6c 61 67 73        elistFlags
2bbc0 20 7c 3d 20 70 45 2d 3e 66 6c 61 67 73 3b 0a 20   |= pE->flags;. 
2bbd0 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45       pRight = pE
2bbe0 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
2bbf0 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
2bc00 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74  TK_DOT || pRight
2bc10 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
2bc20 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45   pE->op!=TK_ASTE
2bc30 52 49 53 4b 0a 20 20 20 20 20 20 20 26 26 20 28  RISK.       && (
2bc40 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
2bc50 7c 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b  | pRight->op!=TK
2bc60 5f 41 53 54 45 52 49 53 4b 29 0a 20 20 20 20 20  _ASTERISK).     
2bc70 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
2bc80 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65  his particular e
2bc90 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e  xpression does n
2bca0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  ot need to be ex
2bcb0 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20  panded..        
2bcc0 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  */.        pNew 
2bcd0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
2bce0 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
2bcf0 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72  pNew, a[k].pExpr
2bd00 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2bd10 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  New ){.         
2bd20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
2bd30 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20  Expr-1].zName = 
2bd40 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[k].zName;.    
2bd50 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
2bd60 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70  ew->nExpr-1].zSp
2bd70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b  an = a[k].zSpan;
2bd80 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  .          a[k].
2bd90 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
2bda0 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20       a[k].zSpan 
2bdb0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
2bdc0 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70         a[k].pExp
2bdd0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  r = 0;.      }el
2bde0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
2bdf0 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69  his expression i
2be00 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41  s a "*" or a "TA
2be10 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73  BLE.*" and needs
2be20 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a   to be.        *
2be30 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20  * expanded. */. 
2be40 20 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65         int table
2be50 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f  Seen = 0;      /
2be60 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20  * Set to 1 when 
2be70 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f  TABLE matches */
2be80 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
2be90 54 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  TName = 0;      
2bea0 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65   /* text of name
2beb0 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20   of TABLE */.   
2bec0 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d       if( pE->op=
2bed0 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20  =TK_DOT ){.     
2bee0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d       assert( pE-
2bef0 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20  >pLeft!=0 );.   
2bf00 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
2bf10 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2bf20 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e  pE->pLeft, EP_In
2bf30 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
2bf40 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45       zTName = pE
2bf50 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65  ->pLeft->u.zToke
2bf60 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
2bf70 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46       for(i=0, pF
2bf80 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
2bf90 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
2bfa0 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
2bfb0 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c  {.          Tabl
2bfc0 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
2bfd0 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  >pTab;.         
2bfe0 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20   Select *pSub = 
2bff0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
2c000 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
2c010 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d  zTabName = pFrom
2c020 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20  ->zAlias;.      
2c030 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2c040 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b  zSchemaName = 0;
2c050 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
2c060 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  Db;.          if
2c070 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b  ( zTabName==0 ){
2c080 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61  .            zTa
2c090 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e  bName = pTab->zN
2c0a0 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ame;.          }
2c0b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64  .          if( d
2c0c0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2c0d0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
2c0e0 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c     if( pSub==0 |
2c0f0 7c 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  | (pSub->selFlag
2c100 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f  s & SF_NestedFro
2c110 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)==0 ){.       
2c120 20 20 20 20 20 70 53 75 62 20 3d 20 30 3b 0a 20       pSub = 0;. 
2c130 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
2c140 54 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33  TName && sqlite3
2c150 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20  StrICmp(zTName, 
2c160 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  zTabName)!=0 ){.
2c170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
2c180 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2c190 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2c1a0 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
2c1b0 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
2c1c0 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
2c1d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63  .            zSc
2c1e0 68 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d  hemaName = iDb>=
2c1f0 30 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  0 ? db->aDb[iDb]
2c200 2e 7a 44 62 53 4e 61 6d 65 20 3a 20 22 2a 22 3b  .zDbSName : "*";
2c210 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2c220 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
2c230 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
2c240 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2c250 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54  char *zName = pT
2c260 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
2c270 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  e;.            c
2c280 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20  har *zColname;  
2c290 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20  /* The computed 
2c2a0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  column name */. 
2c2b0 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
2c2c0 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d  *zToFree;   /* M
2c2d0 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74  alloced string t
2c2e0 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
2c2f0 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  freed */.       
2c300 20 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e       Token sColn
2c310 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ame;  /* Compute
2c320 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73  d column name as
2c330 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20   a token */..   
2c340 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2c350 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20   zName );.      
2c360 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
2c370 20 26 26 20 70 53 75 62 0a 20 20 20 20 20 20 20   && pSub.       
2c380 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
2c390 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65 28 70 53  MatchSpanName(pS
2c3a0 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  ub->pEList->a[j]
2c3b0 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d  .zSpan, 0, zTNam
2c3c0 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20  e, 0)==0.       
2c3d0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2c3e0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
2c3f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20              }.. 
2c400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
2c410 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72   a column is mar
2c420 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e 27 2c  ked as 'hidden',
2c430 20 6f 6d 69 74 20 69 74 20 66 72 6f 6d 20 74 68   omit it from th
2c440 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20  e expanded.     
2c450 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74         ** result
2c460 2d 73 65 74 20 6c 69 73 74 20 75 6e 6c 65 73 73  -set list unless
2c470 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73 20   the SELECT has 
2c480 74 68 65 20 53 46 5f 49 6e 63 6c 75 64 65 48 69  the SF_IncludeHi
2c490 64 64 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20  dden.           
2c4a0 20 2a 2a 20 62 69 74 20 73 65 74 2e 0a 20 20 20   ** bit set..   
2c4b0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2c4c0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 2d 3e          if( (p->
2c4d0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 49 6e  selFlags & SF_In
2c4e0 63 6c 75 64 65 48 69 64 64 65 6e 29 3d 3d 30 0a  cludeHidden)==0.
2c4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
2c500 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26  IsHiddenColumn(&
2c510 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 0a  pTab->aCol[j]) .
2c520 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
2c530 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
2c540 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
2c550 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2c560 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a   tableSeen = 1;.
2c570 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2c580 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d   i>0 && zTName==
2c590 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2c5a0 20 20 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 66     if( (pFrom->f
2c5b0 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  g.jointype & JT_
2c5c0 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20 20 20 20  NATURAL)!=0.    
2c5d0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 74              && t
2c5e0 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64  ableAndColumnInd
2c5f0 65 78 28 70 54 61 62 4c 69 73 74 2c 20 69 2c 20  ex(pTabList, i, 
2c600 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20  zName, 0, 0).   
2c610 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
2c620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c630 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f   In a NATURAL jo
2c640 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69  in, omit the joi
2c650 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74  n columns from t
2c660 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  he .            
2c670 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20      ** table to 
2c680 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65  the right of the
2c690 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20   join */.       
2c6a0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
2c6b0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
2c6c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
2c6d0 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69   if( sqlite3IdLi
2c6e0 73 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70  stIndex(pFrom->p
2c6f0 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30  Using, zName)>=0
2c700 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c710 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e      /* In a join
2c720 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c   with a USING cl
2c730 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d  ause, omit colum
2c740 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ns in the.      
2c750 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69            ** usi
2c760 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74  ng clause from t
2c770 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  he table on the 
2c780 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20  right. */.      
2c790 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
2c7a0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
2c7b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2c7c0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  }.            pR
2c7d0 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
2c7e0 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e  pr(db, TK_ID, zN
2c7f0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
2c800 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61    zColname = zNa
2c810 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
2c820 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  zToFree = 0;.   
2c830 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e           if( lon
2c840 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69  gNames || pTabLi
2c850 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20  st->nSrc>1 ){.  
2c860 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
2c870 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20   *pLeft;.       
2c880 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73         pLeft = s
2c890 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
2c8a0 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b  K_ID, zTabName);
2c8b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2c8c0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
2c8d0 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44  xpr(pParse, TK_D
2c8e0 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  OT, pLeft, pRigh
2c8f0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
2c900 20 20 69 66 28 20 7a 53 63 68 65 6d 61 4e 61 6d    if( zSchemaNam
2c910 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
2c920 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c       pLeft = sql
2c930 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
2c940 49 44 2c 20 7a 53 63 68 65 6d 61 4e 61 6d 65 29  ID, zSchemaName)
2c950 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2c960 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
2c970 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
2c980 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 45  K_DOT, pLeft, pE
2c990 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
2c9a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2c9b0 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65      if( longName
2c9c0 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
2c9d0 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20       zColname = 
2c9e0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
2c9f0 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62  b, "%s.%s", zTab
2ca00 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  Name, zName);.  
2ca10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54                zT
2ca20 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65  oFree = zColname
2ca30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2ca40 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  }.            }e
2ca50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2ca60 20 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68     pExpr = pRigh
2ca70 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  t;.            }
2ca80 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65  .            pNe
2ca90 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
2caa0 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
2cab0 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a  , pNew, pExpr);.
2cac0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2cad0 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 73 43  te3TokenInit(&sC
2cae0 6f 6c 6e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65  olname, zColname
2caf0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
2cb00 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
2cb10 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
2cb20 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30  ew, &sColname, 0
2cb30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2cb40 66 28 20 70 4e 65 77 20 26 26 20 28 70 2d 3e 73  f( pNew && (p->s
2cb50 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73  elFlags & SF_Nes
2cb60 74 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b 0a 20  tedFrom)!=0 ){. 
2cb70 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
2cb80 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
2cb90 6d 20 2a 70 58 20 3d 20 26 70 4e 65 77 2d 3e 61  m *pX = &pNew->a
2cba0 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b  [pNew->nExpr-1];
2cbb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2cbc0 66 28 20 70 53 75 62 20 29 7b 0a 20 20 20 20 20  f( pSub ){.     
2cbd0 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a             pX->z
2cbe0 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62  Span = sqlite3Db
2cbf0 53 74 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d  StrDup(db, pSub-
2cc00 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53  >pEList->a[j].zS
2cc10 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pan);.          
2cc20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2cc30 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a  pX->zSpan==0 );.
2cc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
2cc50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2cc60 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d       pX->zSpan =
2cc70 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
2cc80 64 62 2c 20 22 25 73 2e 25 73 2e 25 73 22 2c 0a  db, "%s.%s.%s",.
2cc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ccb0 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68 65             zSche
2ccc0 6d 61 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65  maName, zTabName
2ccd0 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20  , zColname);.   
2cce0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
2ccf0 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e  tcase( pX->zSpan
2cd00 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
2cd10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2cd20 20 20 20 20 20 70 58 2d 3e 62 53 70 61 6e 49 73       pX->bSpanIs
2cd30 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Tab = 1;.       
2cd40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2cd50 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2cd60 28 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20  (db, zToFree);. 
2cd70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2cd80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2cd90 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20   !tableSeen ){. 
2cda0 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
2cdb0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
2cdc0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2cdd0 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
2cde0 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  uch table: %s", 
2cdf0 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  zTName);.       
2ce00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ce10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2ce20 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
2ce30 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69  o tables specifi
2ce40 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ed");.          
2ce50 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2ce60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
2ce70 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2ce80 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b  ete(db, pEList);
2ce90 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d  .    p->pEList =
2cea0 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28   pNew;.  }.  if(
2ceb0 20 70 2d 3e 70 45 4c 69 73 74 20 29 7b 0a 20 20   p->pEList ){.  
2cec0 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d    if( p->pEList-
2ced0 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69  >nExpr>db->aLimi
2cee0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
2cef0 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 20 20  OLUMN] ){.      
2cf00 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2cf10 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
2cf20 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73  y columns in res
2cf30 75 6c 74 20 73 65 74 22 29 3b 0a 20 20 20 20 20  ult set");.     
2cf40 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
2cf50 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
2cf60 20 28 65 6c 69 73 74 46 6c 61 67 73 20 26 20 28   (elistFlags & (
2cf70 45 50 5f 48 61 73 46 75 6e 63 7c 45 50 5f 53 75  EP_HasFunc|EP_Su
2cf80 62 71 75 65 72 79 29 29 21 3d 30 20 29 7b 0a 20  bquery))!=0 ){. 
2cf90 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73       p->selFlags
2cfa0 20 7c 3d 20 53 46 5f 43 6f 6d 70 6c 65 78 52 65   |= SF_ComplexRe
2cfb0 73 75 6c 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  sult;.    }.  }.
2cfc0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2cfd0 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
2cfe0 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f  No-op routine fo
2cff0 72 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65  r the parse-tree
2d000 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57   walker..**.** W
2d010 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2d020 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78   is the Walker.x
2d030 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65  ExprCallback the
2d040 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
2d050 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64  es.** are walked
2d060 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74   without any act
2d070 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e  ions being taken
2d080 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20   at each node.  
2d090 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77  Presumably,.** w
2d0a0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2d0b0 20 69 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c   is used for Wal
2d0c0 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
2d0d0 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65  k then .** Walke
2d0e0 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  r.xSelectCallbac
2d0f0 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73  k is set to do s
2d100 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20  omething useful 
2d110 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75  for every .** su
2d120 62 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61  bquery in the pa
2d130 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e  rser tree..*/.in
2d140 74 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c  t sqlite3ExprWal
2d150 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f  kNoop(Walker *No
2d160 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74  tUsed, Expr *Not
2d170 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
2d180 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
2d190 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
2d1a0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2d1b0 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
2d1c0 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f  No-op routine fo
2d1d0 72 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65  r the parse-tree
2d1e0 20 77 61 6c 6b 65 72 20 66 6f 72 20 53 45 4c 45   walker for SELE
2d1f0 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
2d200 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68  * subquery in th
2d210 65 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a  e parser tree..*
2d220 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
2d230 65 63 74 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b  ectWalkNoop(Walk
2d240 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 53 65 6c  er *NotUsed, Sel
2d250 65 63 74 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a  ect *NotUsed2){.
2d260 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2d270 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
2d280 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
2d290 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
2d2a0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42  ..#if SQLITE_DEB
2d2b0 55 47 0a 2f 2a 0a 2a 2a 20 41 6c 77 61 79 73 20  UG./*.** Always 
2d2c0 61 73 73 65 72 74 2e 20 20 54 68 69 73 20 78 53  assert.  This xS
2d2d0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 69  electCallback2 i
2d2e0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 72  mplementation pr
2d2f0 6f 76 65 73 20 74 68 61 74 20 74 68 65 0a 2a 2a  oves that the.**
2d300 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b   xSelectCallback
2d310 32 20 69 73 20 6e 65 76 65 72 20 69 6e 76 6f 6b  2 is never invok
2d320 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
2d330 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 41 73 73  te3SelectWalkAss
2d340 65 72 74 32 28 57 61 6c 6b 65 72 20 2a 4e 6f 74  ert2(Walker *Not
2d350 55 73 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e 6f  Used, Select *No
2d360 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
2d370 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
2d380 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
2d390 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a  .  assert( 0 );.
2d3a0 7d 0a 23 65 6e 64 69 66 0a 2f 2a 0a 2a 2a 20 54  }.#endif./*.** T
2d3b0 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70  his routine "exp
2d3c0 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20 73  ands" a SELECT s
2d3d0 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c  tatement and all
2d3e0 20 6f 66 20 69 74 73 20 73 75 62 71 75 65 72 69   of its subqueri
2d3f0 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74  es..** For addit
2d400 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
2d410 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61  n on what it mea
2d420 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61  ns to "expand" a
2d430 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
2d440 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f  ment, see the co
2d450 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c  mment on the sel
2d460 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72  ectExpand worker
2d470 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e   callback above.
2d480 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67  .**.** Expanding
2d490 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
2d4a0 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74  ent is the first
2d4b0 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73   step in process
2d4c0 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20  ing a.** SELECT 
2d4d0 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
2d4e0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2d4f0 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65   must be expande
2d500 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65  d before.** name
2d510 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70   resolution is p
2d520 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20  erformed..**.** 
2d530 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  If anything goes
2d540 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72   wrong, an error
2d550 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74   message is writ
2d560 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e  ten into pParse.
2d570 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
2d580 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74  function can det
2d590 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ect the problem 
2d5a0 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50  by looking at pP
2d5b0 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e  arse->nErr.** an
2d5c0 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d  d/or pParse->db-
2d5d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a  >mallocFailed..*
2d5e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
2d5f0 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
2d600 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  d(Parse *pParse,
2d610 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
2d620 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
2d630 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
2d640 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61   = sqlite3ExprWa
2d650 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72  lkNoop;.  w.pPar
2d660 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69  se = pParse;.  i
2d670 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f  f( OK_IF_ALWAYS_
2d680 54 52 55 45 28 70 50 61 72 73 65 2d 3e 68 61 73  TRUE(pParse->has
2d690 43 6f 6d 70 6f 75 6e 64 29 20 29 7b 0a 20 20 20  Compound) ){.   
2d6a0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
2d6b0 63 6b 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70  ck = convertComp
2d6c0 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71  oundSelectToSubq
2d6d0 75 65 72 79 3b 0a 20 20 20 20 77 2e 78 53 65 6c  uery;.    w.xSel
2d6e0 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30  ectCallback2 = 0
2d6f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
2d700 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
2d710 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53  ect);.  }.  w.xS
2d720 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
2d730 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a  selectExpander;.
2d740 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
2d750 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f 70  ack2 = selectPop
2d760 57 69 74 68 3b 0a 20 20 73 71 6c 69 74 65 33 57  With;.  sqlite3W
2d770 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
2d780 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e  elect);.}...#ifn
2d790 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2d7a0 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54  SUBQUERY./*.** T
2d7b0 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e  his is a Walker.
2d7c0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
2d7d0 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65  callback for the
2d7e0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79   sqlite3SelectTy
2d7f0 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65  peInfo().** inte
2d800 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  rface..**.** For
2d810 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73   each FROM-claus
2d820 65 20 73 75 62 71 75 65 72 79 2c 20 61 64 64 20  e subquery, add 
2d830 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64  Column.zType and
2d840 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a   Column.zColl.**
2d850 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
2d860 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
2d870 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65  ure that represe
2d880 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  nts the result s
2d890 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75  et.** of that su
2d8a0 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  bquery..**.** Th
2d8b0 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
2d8c0 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74  e that represent
2d8d0 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
2d8e0 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64   was constructed
2d8f0 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70  .** by selectExp
2d900 61 6e 64 65 72 28 29 20 62 75 74 20 74 68 65 20  ander() but the 
2d910 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
2d920 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  on information w
2d930 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74  as omitted.** at
2d940 20 74 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61   that point beca
2d950 75 73 65 20 69 64 65 6e 74 69 66 69 65 72 73 20  use identifiers 
2d960 68 61 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  had not yet been
2d970 20 72 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73   resolved.  This
2d980 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63  .** routine is c
2d990 61 6c 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e  alled after iden
2d9a0 74 69 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f  tifier resolutio
2d9b0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
2d9c0 64 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75  d selectAddSubqu
2d9d0 65 72 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b  eryTypeInfo(Walk
2d9e0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
2d9f0 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
2da00 20 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20   *pParse;.  int 
2da10 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  i;.  SrcList *pT
2da20 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74  abList;.  struct
2da30 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2da40 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  From;..  assert(
2da50 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
2da60 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20  F_Resolved );.  
2da70 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
2da80 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  & SF_HasTypeInfo
2da90 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e   ) return;.  p->
2daa0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48  selFlags |= SF_H
2dab0 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 70 50  asTypeInfo;.  pP
2dac0 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
2dad0 70 50 61 72 73 65 3b 0a 20 20 70 54 61 62 4c 69  pParse;.  pTabLi
2dae0 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
2daf0 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
2db00 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
2db10 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
2db20 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
2db30 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
2db40 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
2db50 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
2db60 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62  );.    if( (pTab
2db70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
2db80 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b  Ephemeral)!=0 ){
2db90 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d  .      /* A sub-
2dba0 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
2dbb0 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
2dbc0 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 53 65  LECT */.      Se
2dbd0 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72  lect *pSel = pFr
2dbe0 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
2dbf0 20 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20     if( pSel ){. 
2dc00 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
2dc10 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  el->pPrior ) pSe
2dc20 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
2dc30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2dc40 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e  3SelectAddColumn
2dc50 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
2dc60 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
2dc70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Sel);.      }.  
2dc80 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
2dc90 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
2dca0 75 74 69 6e 65 20 61 64 64 73 20 64 61 74 61 74  utine adds datat
2dcb0 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e  ype and collatin
2dcc0 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72  g sequence infor
2dcd0 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65  mation to.** the
2dce0 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
2dcf0 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  s of all FROM-cl
2dd00 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73 20  ause subqueries 
2dd10 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  in a.** SELECT s
2dd20 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
2dd30 55 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  Use this routine
2dd40 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f   after name reso
2dd50 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lution..*/.stati
2dd60 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  c void sqlite3Se
2dd70 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28  lectAddTypeInfo(
2dd80 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
2dd90 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
2dda0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2ddb0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
2ddc0 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53  Walker w;.  w.xS
2ddd0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
2dde0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
2ddf0 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65  kNoop;.  w.xSele
2de00 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65  ctCallback2 = se
2de10 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54  lectAddSubqueryT
2de20 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78  ypeInfo;.  w.xEx
2de30 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c  prCallback = sql
2de40 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70  ite3ExprWalkNoop
2de50 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
2de60 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
2de70 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70  WalkSelect(&w, p
2de80 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a  Select);.#endif.
2de90 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
2dea0 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61  outine sets up a
2deb0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2dec0 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  t for processing
2ded0 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  .  The.** follow
2dee0 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73  ing is accomplis
2def0 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  hed:.**.**     *
2df00 20 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75    VDBE Cursor nu
2df10 6d 62 65 72 73 20 61 72 65 20 61 73 73 69 67 6e  mbers are assign
2df20 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63  ed to all FROM-c
2df30 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20  lause terms..** 
2df40 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c      *  Ephemeral
2df50 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61   Table objects a
2df60 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61  re created for a
2df70 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ll FROM-clause s
2df80 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20  ubqueries..**   
2df90 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e    *  ON and USIN
2dfa0 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 73 68  G clauses are sh
2dfb0 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45  ifted into WHERE
2dfc0 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20   statements.**  
2dfd0 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20     *  Wildcards 
2dfe0 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a  "*" and "TABLE.*
2dff0 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73  " in result sets
2e000 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a   are expanded..*
2e010 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66  *     *  Identif
2e020 69 65 72 73 20 69 6e 20 65 78 70 72 65 73 73 69  iers in expressi
2e030 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20 74  on are matched t
2e040 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  o tables..**.** 
2e050 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74  This routine act
2e060 73 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e  s recursively on
2e070 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20   all subqueries 
2e080 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43  within the SELEC
2e090 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  T..*/.void sqlit
2e0a0 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20  e3SelectPrep(.  
2e0b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2e0c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
2e0d0 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
2e0e0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
2e0f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2e100 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2e110 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
2e120 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
2e130 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d  pOuterNC  /* Nam
2e140 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f  e context for co
2e150 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20  ntainer */.){.  
2e160 61 73 73 65 72 74 28 20 70 21 3d 30 20 7c 7c 20  assert( p!=0 || 
2e170 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
2e180 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
2e190 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
2e1a0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
2e1b0 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65  urn;.  if( p->se
2e1c0 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54  lFlags & SF_HasT
2e1d0 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e  ypeInfo ) return
2e1e0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
2e1f0 74 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c 20  tExpand(pParse, 
2e200 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  p);.  if( pParse
2e210 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65  ->nErr || pParse
2e220 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
2e230 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ed ) return;.  s
2e240 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
2e250 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  ectNames(pParse,
2e260 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20   p, pOuterNC);. 
2e270 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
2e280 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  r || pParse->db-
2e290 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
2e2a0 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
2e2b0 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e  3SelectAddTypeIn
2e2c0 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d  fo(pParse, p);.}
2e2d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68  ../*.** Reset th
2e2e0 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
2e2f0 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  mulator..**.** T
2e300 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
2e310 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65  umulator is a se
2e320 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  t of memory cell
2e330 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69  s that hold.** i
2e340 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
2e350 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c  lts while calcul
2e360 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61  ating an aggrega
2e370 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  te.  This.** rou
2e380 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
2e390 6f 64 65 20 74 68 61 74 20 73 74 6f 72 65 73 20  ode that stores 
2e3a0 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20  NULLs in all of 
2e3b0 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  those memory.** 
2e3c0 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cells..*/.static
2e3d0 20 76 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d   void resetAccum
2e3e0 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
2e3f0 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
2e400 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
2e410 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
2e420 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
2e430 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
2e440 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 6e  unc *pFunc;.  in
2e450 74 20 6e 52 65 67 20 3d 20 70 41 67 67 49 6e 66  t nReg = pAggInf
2e460 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70 41 67 67 49  o->nFunc + pAggI
2e470 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  nfo->nColumn;.  
2e480 69 66 28 20 6e 52 65 67 3d 3d 30 20 29 20 72 65  if( nReg==0 ) re
2e490 74 75 72 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c  turn;.#ifdef SQL
2e4a0 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56  ITE_DEBUG.  /* V
2e4b0 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20 41  erify that all A
2e4c0 67 67 49 6e 66 6f 20 72 65 67 69 73 74 65 72 73  ggInfo registers
2e4d0 20 61 72 65 20 77 69 74 68 69 6e 20 74 68 65 20   are within the 
2e4e0 72 61 6e 67 65 20 73 70 65 63 69 66 69 65 64 20  range specified 
2e4f0 62 79 0a 20 20 2a 2a 20 41 67 67 49 6e 66 6f 2e  by.  ** AggInfo.
2e500 6d 6e 52 65 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d  mnReg..AggInfo.m
2e510 78 52 65 67 20 2a 2f 0a 20 20 61 73 73 65 72 74  xReg */.  assert
2e520 28 20 6e 52 65 67 3d 3d 70 41 67 67 49 6e 66 6f  ( nReg==pAggInfo
2e530 2d 3e 6d 78 52 65 67 2d 70 41 67 67 49 6e 66 6f  ->mxReg-pAggInfo
2e540 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a 20 20 66  ->mnReg+1 );.  f
2e550 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
2e560 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  fo->nColumn; i++
2e570 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2e580 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d  AggInfo->aCol[i]
2e590 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d  .iMem>=pAggInfo-
2e5a0 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20  >mnReg.         
2e5b0 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  && pAggInfo->aCo
2e5c0 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49  l[i].iMem<=pAggI
2e5d0 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20  nfo->mxReg );.  
2e5e0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
2e5f0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
2e600 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
2e610 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  ( pAggInfo->aFun
2e620 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49  c[i].iMem>=pAggI
2e630 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20  nfo->mnReg.     
2e640 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d      && pAggInfo-
2e650 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d  >aFunc[i].iMem<=
2e660 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20  pAggInfo->mxReg 
2e670 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
2e680 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2e690 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  3(v, OP_Null, 0,
2e6a0 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67   pAggInfo->mnReg
2e6b0 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  , pAggInfo->mxRe
2e6c0 67 29 3b 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d  g);.  for(pFunc=
2e6d0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c  pAggInfo->aFunc,
2e6e0 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f   i=0; i<pAggInfo
2e6f0 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
2e700 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  unc++){.    if( 
2e710 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
2e720 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70  >=0 ){.      Exp
2e730 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70  r *pE = pFunc->p
2e740 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
2e750 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2e760 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49 73 53  erty(pE, EP_xIsS
2e770 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
2e780 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d  if( pE->x.pList=
2e790 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73  =0 || pE->x.pLis
2e7a0 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  t->nExpr!=1 ){. 
2e7b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
2e7c0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2e7d0 44 49 53 54 49 4e 43 54 20 61 67 67 72 65 67 61  DISTINCT aggrega
2e7e0 74 65 73 20 6d 75 73 74 20 68 61 76 65 20 65 78  tes must have ex
2e7f0 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20  actly one ".    
2e800 20 20 20 20 20 20 20 22 61 72 67 75 6d 65 6e 74         "argument
2e810 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e  ");.        pFun
2e820 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  c->iDistinct = -
2e830 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
2e840 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20          KeyInfo 
2e850 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69  *pKeyInfo = sqli
2e860 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  te3KeyInfoFromEx
2e870 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2e880 45 2d 3e 78 2e 70 4c 69 73 74 2c 30 2c 30 29 3b  E->x.pList,0,0);
2e890 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2e8a0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2e8b0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
2e8c0 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
2e8d0 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
2e8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e8f0 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
2e900 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
2e910 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2e920 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
2e930 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61  e the OP_AggFina
2e940 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20  lize opcode for 
2e950 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20  every aggregate 
2e960 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  function.** in t
2e970 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63  he AggInfo struc
2e980 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
2e990 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67  void finalizeAgg
2e9a0 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20  Functions(Parse 
2e9b0 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
2e9c0 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
2e9d0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
2e9e0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
2e9f0 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
2ea00 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f  o_func *pF;.  fo
2ea10 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
2ea20 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
2ea30 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
2ea40 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78  +, pF++){.    Ex
2ea50 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
2ea60 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  pF->pExpr->x.pLi
2ea70 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
2ea80 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2ea90 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78  (pF->pExpr, EP_x
2eaa0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
2eab0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2eac0 70 32 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61  p2(v, OP_AggFina
2ead0 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69  l, pF->iMem, pLi
2eae0 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
2eaf0 72 20 3a 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  r : 0);.    sqli
2eb00 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
2eb10 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34  v, pF->pFunc, P4
2eb20 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d  _FUNCDEF);.  }.}
2eb30 0a 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20  .../*.** Update 
2eb40 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
2eb50 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72  memory cells for
2eb60 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61   an aggregate ba
2eb70 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75  sed on.** the cu
2eb80 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
2eb90 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ition..**.** If 
2eba0 72 65 67 41 63 63 20 69 73 20 6e 6f 6e 2d 7a 65  regAcc is non-ze
2ebb0 72 6f 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  ro and there are
2ebc0 20 6e 6f 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78   no min() or max
2ebd0 28 29 20 61 67 67 72 65 67 61 74 65 73 0a 2a 2a  () aggregates.**
2ebe0 20 69 6e 20 70 41 67 67 49 6e 66 6f 2c 20 74 68   in pAggInfo, th
2ebf0 65 6e 20 6f 6e 6c 79 20 70 6f 70 75 6c 61 74 65  en only populate
2ec00 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 6e   the pAggInfo->n
2ec10 41 63 63 75 6d 75 6c 61 74 6f 72 20 61 63 63 75  Accumulator accu
2ec20 6d 75 6c 61 74 6f 72 0a 2a 2a 20 72 65 67 69 73  mulator.** regis
2ec30 74 65 72 73 20 69 20 72 65 67 69 73 74 65 72 20  ters i register 
2ec40 72 65 67 41 63 63 20 63 6f 6e 74 61 69 6e 73 20  regAcc contains 
2ec50 30 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  0. The caller wi
2ec60 6c 6c 20 74 61 6b 65 20 63 61 72 65 0a 2a 2a 20  ll take care.** 
2ec70 6f 66 20 73 65 74 74 69 6e 67 20 61 6e 64 20 63  of setting and c
2ec80 6c 65 61 72 69 6e 67 20 72 65 67 41 63 63 2e 0a  learing regAcc..
2ec90 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
2eca0 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
2ecb0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2ecc0 69 6e 74 20 72 65 67 41 63 63 2c 20 41 67 67 49  int regAcc, AggI
2ecd0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
2ece0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
2ecf0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
2ed00 20 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74   i;.  int regHit
2ed10 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72   = 0;.  int addr
2ed20 48 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73  HitTest = 0;.  s
2ed30 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
2ed40 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74  nc *pF;.  struct
2ed50 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
2ed60 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64  ;..  pAggInfo->d
2ed70 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20  irectMode = 1;. 
2ed80 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
2ed90 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
2eda0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
2edb0 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
2edc0 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69   int nArg;.    i
2edd0 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b  nt addrNext = 0;
2ede0 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b  .    int regAgg;
2edf0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
2ee00 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
2ee10 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61  ->x.pList;.    a
2ee20 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2ee30 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70  roperty(pF->pExp
2ee40 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
2ee50 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
2ee60 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  t ){.      nArg 
2ee70 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
2ee80 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73        regAgg = s
2ee90 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
2eea0 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29  ge(pParse, nArg)
2eeb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2eec0 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
2eed0 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72  pParse, pList, r
2eee0 65 67 41 67 67 2c 20 30 2c 20 53 51 4c 49 54 45  egAgg, 0, SQLITE
2eef0 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20  _ECEL_DUP);.    
2ef00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72  }else{.      nAr
2ef10 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67  g = 0;.      reg
2ef20 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Agg = 0;.    }. 
2ef30 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74     if( pF->iDist
2ef40 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  inct>=0 ){.     
2ef50 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69   addrNext = sqli
2ef60 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
2ef70 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  (v);.      testc
2ef80 61 73 65 28 20 6e 41 72 67 3d 3d 30 20 29 3b 20  ase( nArg==0 ); 
2ef90 20 2f 2a 20 45 72 72 6f 72 20 63 6f 6e 64 69 74   /* Error condit
2efa0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  ion */.      tes
2efb0 74 63 61 73 65 28 20 6e 41 72 67 3e 31 20 29 3b  tcase( nArg>1 );
2efc0 20 20 20 2f 2a 20 41 6c 73 6f 20 61 6e 20 65 72     /* Also an er
2efd0 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64  ror */.      cod
2efe0 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65  eDistinct(pParse
2eff0 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c  , pF->iDistinct,
2f000 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65   addrNext, 1, re
2f010 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gAgg);.    }.   
2f020 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e   if( pF->pFunc->
2f030 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
2f040 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
2f050 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   ){.      CollSe
2f060 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20  q *pColl = 0;.  
2f070 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
2f080 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
2f090 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
2f0a0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
2f0b0 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73  t!=0 );  /* pLis
2f0c0 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e  t!=0 if pF->pFun
2f0d0 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a  c has NEEDCOLL *
2f0e0 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c  /.      for(j=0,
2f0f0 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
2f100 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72   !pColl && j<nAr
2f110 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  g; j++, pItem++)
2f120 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
2f130 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
2f140 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74  lSeq(pParse, pIt
2f150 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
2f160 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
2f170 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
2f180 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
2f190 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
2f1a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2f1b0 20 72 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41   regHit==0 && pA
2f1c0 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c  ggInfo->nAccumul
2f1d0 61 74 6f 72 20 29 20 72 65 67 48 69 74 20 3d 20  ator ) regHit = 
2f1e0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2f1f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2f200 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
2f210 6c 6c 53 65 71 2c 20 72 65 67 48 69 74 2c 20 30  llSeq, regHit, 0
2f220 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
2f230 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
2f240 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2f250 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2f260 4f 50 5f 41 67 67 53 74 65 70 2c 20 30 2c 20 72  OP_AggStep, 0, r
2f270 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 29  egAgg, pF->iMem)
2f280 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2f290 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46 2d  eAppendP4(v, pF-
2f2a0 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
2f2b0 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EF);.    sqlite3
2f2c0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
2f2d0 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73  (u8)nArg);.    s
2f2e0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
2f2f0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
2f300 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20  egAgg, nArg);.  
2f310 20 20 69 66 28 20 61 64 64 72 4e 65 78 74 20 29    if( addrNext )
2f320 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
2f330 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
2f340 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20  v, addrNext);.  
2f350 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 65    }.  }.  if( re
2f360 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49  gHit==0 && pAggI
2f370 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f  nfo->nAccumulato
2f380 72 20 29 7b 0a 20 20 20 20 72 65 67 48 69 74 20  r ){.    regHit 
2f390 3d 20 72 65 67 41 63 63 3b 0a 20 20 7d 0a 20 20  = regAcc;.  }.  
2f3a0 69 66 28 20 72 65 67 48 69 74 20 29 7b 0a 20 20  if( regHit ){.  
2f3b0 20 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20    addrHitTest = 
2f3c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2f3d0 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48  1(v, OP_If, regH
2f3e0 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  it); VdbeCoverag
2f3f0 65 28 76 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  e(v);.  }.  for(
2f400 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f  i=0, pC=pAggInfo
2f410 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e  ->aCol; i<pAggIn
2f420 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
2f430 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20  ; i++, pC++){.  
2f440 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
2f450 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45  e(pParse, pC->pE
2f460 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a  xpr, pC->iMem);.
2f470 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e    }.  pAggInfo->
2f480 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a  directMode = 0;.
2f490 20 20 69 66 28 20 61 64 64 72 48 69 74 54 65 73    if( addrHitTes
2f4a0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
2f4b0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2f4c0 61 64 64 72 48 69 74 54 65 73 74 29 3b 0a 20 20  addrHitTest);.  
2f4d0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  }.}../*.** Add a
2f4e0 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61   single OP_Expla
2f4f0 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  in instruction t
2f500 6f 20 74 68 65 20 56 44 42 45 20 74 6f 20 65 78  o the VDBE to ex
2f510 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a  plain a simple.*
2f520 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75 65 72 79  * count(*) query
2f530 20 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28   ("SELECT count(
2f540 2a 29 20 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a  *) FROM pTab")..
2f550 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2f560 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73  E_OMIT_EXPLAIN.s
2f570 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
2f580 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20  inSimpleCount(. 
2f590 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2f5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f5b0 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
2f5c0 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  t */.  Table *pT
2f5d0 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ab,             
2f5e0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
2f5f0 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f  being queried */
2f600 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20  .  Index *pIdx  
2f610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f620 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64     /* Index used
2f630 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63 61   to optimize sca
2f640 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  n, or NULL */.){
2f650 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
2f660 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20  xplain==2 ){.   
2f670 20 69 6e 74 20 62 43 6f 76 65 72 20 3d 20 28 70   int bCover = (p
2f680 49 64 78 21 3d 30 20 26 26 20 28 48 61 73 52 6f  Idx!=0 && (HasRo
2f690 77 69 64 28 70 54 61 62 29 20 7c 7c 20 21 49 73  wid(pTab) || !Is
2f6a0 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
2f6b0 70 49 64 78 29 29 29 3b 0a 20 20 20 20 73 71 6c  pIdx)));.    sql
2f6c0 69 74 65 33 56 64 62 65 45 78 70 6c 61 69 6e 28  ite3VdbeExplain(
2f6d0 70 50 61 72 73 65 2c 20 30 2c 20 22 53 43 41 4e  pParse, 0, "SCAN
2f6e0 20 54 41 42 4c 45 20 25 73 25 73 25 73 22 2c 0a   TABLE %s%s%s",.
2f6f0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
2f700 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 62 43 6f  ame,.        bCo
2f710 76 65 72 20 3f 20 22 20 55 53 49 4e 47 20 43 4f  ver ? " USING CO
2f720 56 45 52 49 4e 47 20 49 4e 44 45 58 20 22 20 3a  VERING INDEX " :
2f730 20 22 22 2c 0a 20 20 20 20 20 20 20 20 62 43 6f   "",.        bCo
2f740 76 65 72 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d  ver ? pIdx->zNam
2f750 65 20 3a 20 22 22 0a 20 20 20 20 29 3b 0a 20 20  e : "".    );.  
2f760 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
2f770 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65  ne explainSimple
2f780 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e  Count(a,b,c).#en
2f790 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74  dif../*.** sqlit
2f7a0 65 33 57 61 6c 6b 45 78 70 72 28 29 20 63 61 6c  e3WalkExpr() cal
2f7b0 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20 68 61  lback used by ha
2f7c0 76 69 6e 67 54 6f 57 68 65 72 65 28 29 2e 0a 2a  vingToWhere()..*
2f7d0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 64 65  *.** If the node
2f7e0 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 63   passed to the c
2f7f0 61 6c 6c 62 61 63 6b 20 69 73 20 61 20 54 4b 5f  allback is a TK_
2f800 41 4e 44 20 6e 6f 64 65 2c 20 72 65 74 75 72 6e  AND node, return
2f810 20 0a 2a 2a 20 57 52 43 5f 43 6f 6e 74 69 6e 75   .** WRC_Continu
2f820 65 20 74 6f 20 74 65 6c 6c 20 73 71 6c 69 74 65  e to tell sqlite
2f830 33 57 61 6c 6b 45 78 70 72 28 29 20 74 6f 20 69  3WalkExpr() to i
2f840 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 63  terate through c
2f850 68 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a  hild nodes..**.*
2f860 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  * Otherwise, ret
2f870 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 2e 20 49  urn WRC_Prune. I
2f880 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 6c 73  n this case, als
2f890 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 0a  o check if the .
2f8a0 2a 2a 20 73 75 62 2d 65 78 70 72 65 73 73 69 6f  ** sub-expressio
2f8b0 6e 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 72  n matches the cr
2f8c0 69 74 65 72 69 61 20 66 6f 72 20 62 65 69 6e 67  iteria for being
2f8d0 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 57 48   moved to the WH
2f8e0 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65 2e 20 49  ERE.** clause. I
2f8f0 66 20 73 6f 2c 20 61 64 64 20 69 74 20 74 6f 20  f so, add it to 
2f900 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2f910 20 61 6e 64 20 72 65 70 6c 61 63 65 20 74 68 65   and replace the
2f920 20 73 75 62 2d 65 78 70 72 65 73 73 69 6f 6e 0a   sub-expression.
2f930 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 48 41  ** within the HA
2f940 56 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20  VING expression 
2f950 77 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20  with a constant 
2f960 22 31 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  "1"..*/.static i
2f970 6e 74 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65  nt havingToWhere
2f980 45 78 70 72 43 62 28 57 61 6c 6b 65 72 20 2a 70  ExprCb(Walker *p
2f990 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
2f9a0 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70  xpr){.  if( pExp
2f9b0 72 2d 3e 6f 70 21 3d 54 4b 5f 41 4e 44 20 29 7b  r->op!=TK_AND ){
2f9c0 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20  .    Select *pS 
2f9d0 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 65  = pWalker->u.pSe
2f9e0 6c 65 63 74 3b 0a 20 20 20 20 69 66 28 20 73 71  lect;.    if( sq
2f9f0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
2fa00 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 70 57 61  antOrGroupBy(pWa
2fa10 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70 45  lker->pParse, pE
2fa20 78 70 72 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42  xpr, pS->pGroupB
2fa30 79 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  y) ){.      sqli
2fa40 74 65 33 20 2a 64 62 20 3d 20 70 57 61 6c 6b 65  te3 *db = pWalke
2fa50 72 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20  r->pParse->db;. 
2fa60 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20       Expr *pNew 
2fa70 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
2fa80 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  oc(db, TK_INTEGE
2fa90 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f  R, &sqlite3IntTo
2faa0 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20 20 20  kens[1], 0);.   
2fab0 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
2fac0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 57 68         Expr *pWh
2fad0 65 72 65 20 3d 20 70 53 2d 3e 70 57 68 65 72 65  ere = pS->pWhere
2fae0 3b 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 45  ;.        SWAP(E
2faf0 78 70 72 2c 20 2a 70 4e 65 77 2c 20 2a 70 45 78  xpr, *pNew, *pEx
2fb00 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  pr);.        pNe
2fb10 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  w = sqlite3ExprA
2fb20 6e 64 28 64 62 2c 20 70 57 68 65 72 65 2c 20 70  nd(db, pWhere, p
2fb30 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 53  New);.        pS
2fb40 2d 3e 70 57 68 65 72 65 20 3d 20 70 4e 65 77 3b  ->pWhere = pNew;
2fb50 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72  .        pWalker
2fb60 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20  ->eCode = 1;.   
2fb70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
2fb80 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
2fb90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
2fba0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
2fbb0 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 6c  *.** Transfer el
2fbc0 69 67 69 62 6c 65 20 74 65 72 6d 73 20 66 72 6f  igible terms fro
2fbd0 6d 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61  m the HAVING cla
2fbe0 75 73 65 20 6f 66 20 61 20 71 75 65 72 79 2c 20  use of a query, 
2fbf0 77 68 69 63 68 20 69 73 0a 2a 2a 20 70 72 6f 63  which is.** proc
2fc00 65 73 73 65 64 20 61 66 74 65 72 20 67 72 6f 75  essed after grou
2fc10 70 69 6e 67 2c 20 74 6f 20 74 68 65 20 57 48 45  ping, to the WHE
2fc20 52 45 20 63 6c 61 75 73 65 2c 20 77 68 69 63 68  RE clause, which
2fc30 20 69 73 20 70 72 6f 63 65 73 73 65 64 20 62 65   is processed be
2fc40 66 6f 72 65 0a 2a 2a 20 67 72 6f 75 70 69 6e 67  fore.** grouping
2fc50 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  . For example, t
2fc60 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  he query:.**.** 
2fc70 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2fc80 3c 74 61 62 6c 65 73 3e 20 57 48 45 52 45 20 61  <tables> WHERE a
2fc90 3d 3f 20 47 52 4f 55 50 20 42 59 20 62 20 48 41  =? GROUP BY b HA
2fca0 56 49 4e 47 20 62 3d 3f 20 41 4e 44 20 63 3d 3f  VING b=? AND c=?
2fcb0 0a 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65 20 72 65  .**.** can be re
2fcc0 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a  written as:.**.*
2fcd0 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
2fce0 4d 20 3c 74 61 62 6c 65 73 3e 20 57 48 45 52 45  M <tables> WHERE
2fcf0 20 61 3d 3f 20 41 4e 44 20 62 3d 3f 20 47 52 4f   a=? AND b=? GRO
2fd00 55 50 20 42 59 20 62 20 48 41 56 49 4e 47 20 63  UP BY b HAVING c
2fd10 3d 3f 0a 2a 2a 0a 2a 2a 20 41 20 74 65 72 6d 20  =?.**.** A term 
2fd20 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20 65 78  of the HAVING ex
2fd30 70 72 65 73 73 69 6f 6e 20 69 73 20 65 6c 69 67  pression is elig
2fd40 69 62 6c 65 20 66 6f 72 20 74 72 61 6e 73 66 65  ible for transfe
2fd50 72 20 69 66 20 69 74 20 63 6f 6e 73 69 73 74 73  r if it consists
2fd60 0a 2a 2a 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  .** entirely of 
2fd70 63 6f 6e 73 74 61 6e 74 73 20 61 6e 64 20 65 78  constants and ex
2fd80 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61  pressions that a
2fd90 72 65 20 61 6c 73 6f 20 47 52 4f 55 50 20 42 59  re also GROUP BY
2fda0 20 74 65 72 6d 73 20 74 68 61 74 0a 2a 2a 20 75   terms that.** u
2fdb0 73 65 20 74 68 65 20 22 42 49 4e 41 52 59 22 20  se the "BINARY" 
2fdc0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
2fdd0 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ce..*/.static vo
2fde0 69 64 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65  id havingToWhere
2fdf0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2fe00 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 57 61  Select *p){.  Wa
2fe10 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b 0a 20 20  lker sWalker;.  
2fe20 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b 65 72 2c  memset(&sWalker,
2fe30 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 61 6c 6b   0, sizeof(sWalk
2fe40 65 72 29 29 3b 0a 20 20 73 57 61 6c 6b 65 72 2e  er));.  sWalker.
2fe50 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
2fe60 0a 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72  .  sWalker.xExpr
2fe70 43 61 6c 6c 62 61 63 6b 20 3d 20 68 61 76 69 6e  Callback = havin
2fe80 67 54 6f 57 68 65 72 65 45 78 70 72 43 62 3b 0a  gToWhereExprCb;.
2fe90 20 20 73 57 61 6c 6b 65 72 2e 75 2e 70 53 65 6c    sWalker.u.pSel
2fea0 65 63 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74  ect = p;.  sqlit
2feb0 65 33 57 61 6c 6b 45 78 70 72 28 26 73 57 61 6c  e3WalkExpr(&sWal
2fec0 6b 65 72 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29  ker, p->pHaving)
2fed0 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
2fee0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
2fef0 73 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 26 26  sWalker.eCode &&
2ff00 20 28 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54   (sqlite3SelectT
2ff10 72 61 63 65 20 26 20 30 78 31 30 30 29 21 3d 30  race & 0x100)!=0
2ff20 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52   ){.    SELECTTR
2ff30 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65  ACE(0x100,pParse
2ff40 2c 70 2c 28 22 4d 6f 76 65 20 48 41 56 49 4e 47  ,p,("Move HAVING
2ff50 20 74 65 72 6d 73 20 69 6e 74 6f 20 57 48 45 52   terms into WHER
2ff60 45 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c  E:\n"));.    sql
2ff70 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
2ff80 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
2ff90 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
2ffa0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
2ffb0 20 74 68 65 20 70 54 68 69 73 20 65 6e 74 72 79   the pThis entry
2ffc0 20 6f 66 20 70 54 61 62 4c 69 73 74 20 69 73 20   of pTabList is 
2ffd0 61 20 73 65 6c 66 2d 6a 6f 69 6e 20 6f 66 20 61  a self-join of a
2ffe0 20 70 72 69 6f 72 20 76 69 65 77 2e 0a 2a 2a 20   prior view..** 
2fff0 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 72  If it is, then r
30000 65 74 75 72 6e 20 74 68 65 20 53 72 63 4c 69 73  eturn the SrcLis
30010 74 5f 69 74 65 6d 20 66 6f 72 20 74 68 65 20 70  t_item for the p
30020 72 69 6f 72 20 76 69 65 77 2e 20 20 49 66 20 69  rior view.  If i
30030 74 20 69 73 20 6e 6f 74 2c 0a 2a 2a 20 74 68 65  t is not,.** the
30040 6e 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  n return 0..*/.s
30050 74 61 74 69 63 20 73 74 72 75 63 74 20 53 72 63  tatic struct Src
30060 4c 69 73 74 5f 69 74 65 6d 20 2a 69 73 53 65 6c  List_item *isSel
30070 66 4a 6f 69 6e 56 69 65 77 28 0a 20 20 53 72 63  fJoinView(.  Src
30080 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
30090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61            /* Sea
300a0 72 63 68 20 66 6f 72 20 73 65 6c 66 2d 6a 6f 69  rch for self-joi
300b0 6e 73 20 69 6e 20 74 68 69 73 20 46 52 4f 4d 20  ns in this FROM 
300c0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
300d0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
300e0 2a 70 54 68 69 73 20 20 20 2f 2a 20 53 65 61 72  *pThis   /* Sear
300f0 63 68 20 66 6f 72 20 70 72 69 6f 72 20 72 65 66  ch for prior ref
30100 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 73  erence to this s
30110 75 62 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20  ubquery */.){.  
30120 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
30130 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 66 6f  tem *pItem;.  fo
30140 72 28 70 49 74 65 6d 20 3d 20 70 54 61 62 4c 69  r(pItem = pTabLi
30150 73 74 2d 3e 61 3b 20 70 49 74 65 6d 3c 70 54 68  st->a; pItem<pTh
30160 69 73 3b 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  is; pItem++){.  
30170 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
30180 6c 65 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  lect==0 ) contin
30190 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  ue;.    if( pIte
301a0 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69  m->fg.viaCorouti
301b0 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ne ) continue;. 
301c0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e     if( pItem->zN
301d0 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ame==0 ) continu
301e0 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
301f0 65 33 5f 73 74 72 69 63 6d 70 28 70 49 74 65 6d  e3_stricmp(pItem
30200 2d 3e 7a 44 61 74 61 62 61 73 65 2c 20 70 54 68  ->zDatabase, pTh
30210 69 73 2d 3e 7a 44 61 74 61 62 61 73 65 29 21 3d  is->zDatabase)!=
30220 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
30230 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
30240 72 69 63 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61  ricmp(pItem->zNa
30250 6d 65 2c 20 70 54 68 69 73 2d 3e 7a 4e 61 6d 65  me, pThis->zName
30260 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
30270 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
30280 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 0a  ExprCompare(0, .
30290 20 20 20 20 20 20 20 20 20 20 70 54 68 69 73 2d            pThis-
302a0 3e 70 53 65 6c 65 63 74 2d 3e 70 57 68 65 72 65  >pSelect->pWhere
302b0 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
302c0 2d 3e 70 57 68 65 72 65 2c 20 2d 31 29 20 0a 20  ->pWhere, -1) . 
302d0 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54     ){.      /* T
302e0 68 65 20 76 69 65 77 20 77 61 73 20 6d 6f 64 69  he view was modi
302f0 66 69 65 64 20 62 79 20 73 6f 6d 65 20 6f 74 68  fied by some oth
30300 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  er optimization 
30310 73 75 63 68 20 61 73 0a 20 20 20 20 20 20 2a 2a  such as.      **
30320 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65   pushDownWhereTe
30330 72 6d 73 28 29 20 2a 2f 0a 20 20 20 20 20 20 63  rms() */.      c
30340 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
30350 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d 3b     return pItem;
30360 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
30370 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
30380 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50  E_COUNTOFVIEW_OP
30390 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a  TIMIZATION./*.**
303a0 20 41 74 74 65 6d 70 74 20 74 6f 20 74 72 61 6e   Attempt to tran
303b0 73 66 6f 72 6d 20 61 20 71 75 65 72 79 20 6f 66  sform a query of
303c0 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20   the form.**.** 
303d0 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
303e0 2a 29 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  *) FROM (SELECT 
303f0 78 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20  x FROM t1 UNION 
30400 41 4c 4c 20 53 45 4c 45 43 54 20 79 20 46 52 4f  ALL SELECT y FRO
30410 4d 20 74 32 29 0a 2a 2a 0a 2a 2a 20 49 6e 74 6f  M t2).**.** Into
30420 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
30430 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
30440 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 29  ount(*) FROM t1)
30450 2b 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  +(SELECT count(*
30460 29 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a  ) FROM t2).**.**
30470 20 54 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74   The transformat
30480 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69  ion only works i
30490 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
304a0 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
304b0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20  .**.**   *  The 
304c0 73 75 62 71 75 65 72 79 20 69 73 20 61 20 55 4e  subquery is a UN
304d0 49 4f 4e 20 41 4c 4c 20 6f 66 20 74 77 6f 20 6f  ION ALL of two o
304e0 72 20 6d 6f 72 65 20 74 65 72 6d 73 0a 2a 2a 20  r more terms.** 
304f0 20 20 2a 20 20 54 68 65 20 73 75 62 71 75 65 72    *  The subquer
30500 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  y does not have 
30510 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 0a 2a  a LIMIT clause.*
30520 2a 20 20 20 2a 20 20 54 68 65 72 65 20 69 73 20  *   *  There is 
30530 6e 6f 20 57 48 45 52 45 20 6f 72 20 47 52 4f 55  no WHERE or GROU
30540 50 20 42 59 20 6f 72 20 48 41 56 49 4e 47 20 63  P BY or HAVING c
30550 6c 61 75 73 65 73 20 6f 6e 20 74 68 65 20 73 75  lauses on the su
30560 62 71 75 65 72 69 65 73 0a 2a 2a 20 20 20 2a 20  bqueries.**   * 
30570 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
30580 20 69 73 20 61 20 73 69 6d 70 6c 65 20 63 6f 75   is a simple cou
30590 6e 74 28 2a 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75  nt(*).**.** Retu
305a0 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6f  rn TRUE if the o
305b0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75  ptimization is u
305c0 6e 64 65 72 74 61 6b 65 6e 2e 0a 2a 2f 0a 73 74  ndertaken..*/.st
305d0 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 4f 66  atic int countOf
305e0 56 69 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  ViewOptimization
305f0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
30600 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 65  Select *p){.  Se
30610 6c 65 63 74 20 2a 70 53 75 62 2c 20 2a 70 50 72  lect *pSub, *pPr
30620 69 6f 72 3b 0a 20 20 45 78 70 72 20 2a 70 45 78  ior;.  Expr *pEx
30630 70 72 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 75  pr;.  Expr *pCou
30640 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  nt;.  sqlite3 *d
30650 62 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c  b;.  if( (p->sel
30660 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
30670 67 61 74 65 29 3d 3d 30 20 29 20 72 65 74 75 72  gate)==0 ) retur
30680 6e 20 30 3b 20 20 20 2f 2a 20 54 68 69 73 20 69  n 0;   /* This i
30690 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a  s an aggregate *
306a0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73  /.  if( p->pELis
306b0 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65  t->nExpr!=1 ) re
306c0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
306d0 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20        /* Single 
306e0 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f  result column */
306f0 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45  .  pExpr = p->pE
30700 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
30710 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
30720 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p!=TK_AGG_FUNCTI
30730 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ON ) return 0;  
30740 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
30750 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
30760 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
30770 5f 73 74 72 69 63 6d 70 28 70 45 78 70 72 2d 3e  _stricmp(pExpr->
30780 75 2e 7a 54 6f 6b 65 6e 2c 22 63 6f 75 6e 74 22  u.zToken,"count"
30790 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  ) ) return 0;  /
307a0 2a 20 49 73 20 63 6f 75 6e 74 28 29 20 2a 2f 0a  * Is count() */.
307b0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 78 2e 70    if( pExpr->x.p
307c0 4c 69 73 74 21 3d 30 20 29 20 72 65 74 75 72 6e  List!=0 ) return
307d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
307e0 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
307f0 6f 75 6e 74 28 2a 29 20 2a 2f 0a 20 20 69 66 28  ount(*) */.  if(
30800 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d   p->pSrc->nSrc!=
30810 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
30820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30830 2a 20 4f 6e 65 20 74 61 62 6c 65 20 69 6e 20 46  * One table in F
30840 52 4f 4d 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d  ROM  */.  pSub =
30850 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
30860 53 65 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 53  Select;.  if( pS
30870 75 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ub==0 ) return 0
30880 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
308a0 68 65 20 46 52 4f 4d 20 69 73 20 61 20 73 75 62  he FROM is a sub
308b0 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 70  query */.  if( p
308c0 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  Sub->pPrior==0 )
308d0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
308e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
308f0 4d 75 73 74 20 62 65 20 61 20 63 6f 6d 70 6f 75  Must be a compou
30900 6e 64 20 72 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20  nd ry */.  do{. 
30910 20 20 20 69 66 28 20 70 53 75 62 2d 3e 6f 70 21     if( pSub->op!
30920 3d 54 4b 5f 41 4c 4c 20 26 26 20 70 53 75 62 2d  =TK_ALL && pSub-
30930 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e  >pPrior ) return
30940 20 30 3b 20 20 2f 2a 20 4d 75 73 74 20 62 65 20   0;  /* Must be 
30950 55 4e 49 4f 4e 20 41 4c 4c 20 2a 2f 0a 20 20 20  UNION ALL */.   
30960 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72   if( pSub->pWher
30970 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
30980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30990 20 20 20 2f 2a 20 4e 6f 20 57 48 45 52 45 20 63     /* No WHERE c
309a0 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 69 66 28  lause */.    if(
309b0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 20   pSub->pLimit ) 
309c0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
309d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
309e0 2a 20 4e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73  * No LIMIT claus
309f0 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75  e */.    if( pSu
30a00 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
30a10 5f 41 67 67 72 65 67 61 74 65 20 29 20 72 65 74  _Aggregate ) ret
30a20 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 4e 6f  urn 0;     /* No
30a30 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a  t an aggregate *
30a40 2f 0a 20 20 20 20 70 53 75 62 20 3d 20 70 53 75  /.    pSub = pSu
30a50 62 2d 3e 70 50 72 69 6f 72 3b 20 20 20 20 20 20  b->pPrior;      
30a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a70 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 65 61          /* Repea
30a80 74 20 6f 76 65 72 20 63 6f 6d 70 6f 75 6e 64 20  t over compound 
30a90 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 70 53 75  */.  }while( pSu
30aa0 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  b );..  /* If we
30ab0 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
30ac0 74 20 74 68 65 6e 20 69 74 20 69 73 20 4f 4b 20  t then it is OK 
30ad0 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20 74  to perform the t
30ae0 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  ransformation */
30af0 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ..  db = pParse-
30b00 3e 64 62 3b 0a 20 20 70 43 6f 75 6e 74 20 3d 20  >db;.  pCount = 
30b10 70 45 78 70 72 3b 0a 20 20 70 45 78 70 72 20 3d  pExpr;.  pExpr =
30b20 20 30 3b 0a 20 20 70 53 75 62 20 3d 20 70 2d 3e   0;.  pSub = p->
30b30 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
30b40 63 74 3b 0a 20 20 70 2d 3e 70 53 72 63 2d 3e 61  ct;.  p->pSrc->a
30b50 5b 30 5d 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b  [0].pSelect = 0;
30b60 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
30b70 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
30b80 53 72 63 29 3b 0a 20 20 70 2d 3e 70 53 72 63 20  Src);.  p->pSrc 
30b90 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
30ba0 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
30bb0 2c 20 73 69 7a 65 6f 66 28 2a 70 2d 3e 70 53 72  , sizeof(*p->pSr
30bc0 63 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 53  c));.  while( pS
30bd0 75 62 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  ub ){.    Expr *
30be0 70 54 65 72 6d 3b 0a 20 20 20 20 70 50 72 69 6f  pTerm;.    pPrio
30bf0 72 20 3d 20 70 53 75 62 2d 3e 70 50 72 69 6f 72  r = pSub->pPrior
30c00 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 50 72 69  ;.    pSub->pPri
30c10 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62  or = 0;.    pSub
30c20 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  ->pNext = 0;.   
30c30 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
30c40 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b  |= SF_Aggregate;
30c50 0a 20 20 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c  .    pSub->selFl
30c60 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f  ags &= ~SF_Compo
30c70 75 6e 64 3b 0a 20 20 20 20 70 53 75 62 2d 3e 6e  und;.    pSub->n
30c80 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20  SelectRow = 0;. 
30c90 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
30ca0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75  stDelete(db, pSu
30cb0 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
30cc0 70 54 65 72 6d 20 3d 20 70 50 72 69 6f 72 20 3f  pTerm = pPrior ?
30cd0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
30ce0 64 62 2c 20 70 43 6f 75 6e 74 2c 20 30 29 20 3a  db, pCount, 0) :
30cf0 20 70 43 6f 75 6e 74 3b 0a 20 20 20 20 70 53 75   pCount;.    pSu
30d00 62 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  b->pEList = sqli
30d10 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
30d20 64 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54 65  d(pParse, 0, pTe
30d30 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  rm);.    pTerm =
30d40 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
30d50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43 54 2c  arse, TK_SELECT,
30d60 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
30d70 74 65 33 50 45 78 70 72 41 64 64 53 65 6c 65 63  te3PExprAddSelec
30d80 74 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  t(pParse, pTerm,
30d90 20 70 53 75 62 29 3b 0a 20 20 20 20 69 66 28 20   pSub);.    if( 
30da0 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20  pExpr==0 ){.    
30db0 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 3b    pExpr = pTerm;
30dc0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
30dd0 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
30de0 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
30df0 4b 5f 50 4c 55 53 2c 20 70 54 65 72 6d 2c 20 70  K_PLUS, pTerm, p
30e00 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Expr);.    }.   
30e10 20 70 53 75 62 20 3d 20 70 50 72 69 6f 72 3b 0a   pSub = pPrior;.
30e20 20 20 7d 0a 20 20 70 2d 3e 70 45 4c 69 73 74 2d    }.  p->pEList-
30e30 3e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70 45  >a[0].pExpr = pE
30e40 78 70 72 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  xpr;.  p->selFla
30e50 67 73 20 26 3d 20 7e 53 46 5f 41 67 67 72 65 67  gs &= ~SF_Aggreg
30e60 61 74 65 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54  ate;..#if SELECT
30e70 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
30e80 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
30e90 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29  tTrace & 0x400 )
30ea0 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  {.    SELECTTRAC
30eb0 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70  E(0x400,pParse,p
30ec0 2c 28 22 41 66 74 65 72 20 63 6f 75 6e 74 2d 6f  ,("After count-o
30ed0 66 2d 76 69 65 77 20 6f 70 74 69 6d 69 7a 61 74  f-view optimizat
30ee0 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73  ion:\n"));.    s
30ef0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
30f00 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
30f10 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
30f20 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
30f30 2a 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46  * SQLITE_COUNTOF
30f40 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  VIEW_OPTIMIZATIO
30f50 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  N */../*.** Gene
30f60 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
30f70 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
30f80 6e 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  nt given in the 
30f90 70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a  p argument.  .**
30fa0 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
30fb0 61 72 65 20 72 65 74 75 72 6e 65 64 20 61 63 63  are returned acc
30fc0 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 53 65  ording to the Se
30fd0 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75  lectDest structu
30fe0 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65  re..** See comme
30ff0 6e 74 73 20 69 6e 20 73 71 6c 69 74 65 49 6e 74  nts in sqliteInt
31000 2e 68 20 66 6f 72 20 66 75 72 74 68 65 72 20 69  .h for further i
31010 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nformation..**.*
31020 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
31030 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
31040 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  r of errors.  If
31050 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a   any errors are.
31060 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  ** encountered, 
31070 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69  then an appropri
31080 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ate error messag
31090 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20  e is left in.** 
310a0 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
310b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
310c0 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65  ine does NOT fre
310d0 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72  e the Select str
310e0 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e  ucture passed in
310f0 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  .  The.** callin
31100 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73  g function needs
31110 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
31120 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
31130 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
31140 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
31150 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
31160 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
31170 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
31180 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
31190 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
311a0 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  d. */.  SelectDe
311b0 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f  st *pDest      /
311c0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
311d0 68 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  h the query resu
311e0 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
311f0 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
31200 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
31210 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ers */.  WhereIn
31220 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
31230 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73  /* Return from s
31240 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
31250 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  () */.  Vdbe *v;
31260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31270 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61  * The virtual ma
31280 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73  chine under cons
31290 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
312a0 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20  t isAgg;        
312b0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
312c0 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69   select lists li
312d0 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f  ke "count(*)" */
312e0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
312f0 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20 4c 69 73  ist = 0;  /* Lis
31300 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
31310 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72  extract. */.  Sr
31320 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
31330 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
31340 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74  tables to select
31350 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20   from */.  Expr 
31360 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
31370 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
31380 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
31390 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
313a0 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20  t *pGroupBy;    
313b0 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20  /* The GROUP BY 
313c0 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
313d0 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
313e0 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20  pHaving;        
313f0 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63   /* The HAVING c
31400 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
31410 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ULL */.  int rc 
31420 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
31430 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
31440 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  rn from this fun
31450 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69  ction */.  Disti
31460 6e 63 74 43 74 78 20 73 44 69 73 74 69 6e 63 74  nctCtx sDistinct
31470 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77  ; /* Info on how
31480 20 74 6f 20 63 6f 64 65 20 74 68 65 20 44 49 53   to code the DIS
31490 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f  TINCT keyword */
314a0 0a 20 20 53 6f 72 74 43 74 78 20 73 53 6f 72 74  .  SortCtx sSort
314b0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66  ;         /* Inf
314c0 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65  o on how to code
314d0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
314e0 61 75 73 65 20 2a 2f 0a 20 20 41 67 67 49 6e 66  ause */.  AggInf
314f0 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20  o sAggInfo;     
31500 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
31510 75 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74  used by aggregat
31520 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69  e queries */.  i
31530 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20  nt iEnd;        
31540 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
31550 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74   of the end of t
31560 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71  he query */.  sq
31570 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
31580 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
31590 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
315a0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
315b0 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79 20 3d 20  MinMaxOrderBy = 
315c0 30 3b 20 20 2f 2a 20 41 64 64 65 64 20 4f 52 44  0;  /* Added ORD
315d0 45 52 20 42 59 20 66 6f 72 20 6d 69 6e 2f 6d 61  ER BY for min/ma
315e0 78 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 75  x queries */.  u
315f0 38 20 6d 69 6e 4d 61 78 46 6c 61 67 3b 20 20 20  8 minMaxFlag;   
31600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31610 20 46 6c 61 67 20 66 6f 72 20 6d 69 6e 2f 6d 61   Flag for min/ma
31620 78 20 71 75 65 72 69 65 73 20 2a 2f 0a 0a 20 20  x queries */..  
31630 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
31640 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
31650 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
31660 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d   if( p==0 || db-
31670 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
31680 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b   pParse->nErr ){
31690 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
316a0 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
316b0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
316c0 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c  , SQLITE_SELECT,
316d0 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75   0, 0, 0) ) retu
316e0 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26  rn 1;.  memset(&
316f0 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a  sAggInfo, 0, siz
31700 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a  eof(sAggInfo));.
31710 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
31720 45 4e 41 42 4c 45 44 0a 20 20 53 45 4c 45 43 54  ENABLED.  SELECT
31730 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
31740 2c 20 28 22 62 65 67 69 6e 20 70 72 6f 63 65 73  , ("begin proces
31750 73 69 6e 67 3a 5c 6e 22 2c 20 70 50 61 72 73 65  sing:\n", pParse
31760 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 29 29 3b  ->addrExplain));
31770 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
31780 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
31790 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
317a0 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
317b0 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , p, 0);.  }.#en
317c0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
317d0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
317e0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
317f0 52 54 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a 20  RT_DistFifo );. 
31800 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
31810 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74  erBy==0 || pDest
31820 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 46 69 66  ->eDest!=SRT_Fif
31830 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  o );.  assert( p
31840 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
31850 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
31860 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 3b 0a  RT_DistQueue );.
31870 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
31880 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
31890 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 51 75  t->eDest!=SRT_Qu
318a0 65 75 65 20 29 3b 0a 20 20 69 66 28 20 49 67 6e  eue );.  if( Ign
318b0 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44  orableOrderby(pD
318c0 65 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65  est) ){.    asse
318d0 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  rt(pDest->eDest=
318e0 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70  =SRT_Exists || p
318f0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
31900 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20  _Union || .     
31910 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65        pDest->eDe
31920 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c  st==SRT_Except |
31930 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
31940 53 52 54 5f 44 69 73 63 61 72 64 20 7c 7c 0a 20  SRT_Discard ||. 
31950 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d            pDest-
31960 3e 65 44 65 73 74 3d 3d 53 52 54 5f 51 75 65 75  >eDest==SRT_Queu
31970 65 20 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  e  || pDest->eDe
31980 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f  st==SRT_DistFifo
31990 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70   ||.           p
319a0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
319b0 5f 44 69 73 74 51 75 65 75 65 20 7c 7c 20 70 44  _DistQueue || pD
319c0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
319d0 46 69 66 6f 29 3b 0a 20 20 20 20 2f 2a 20 49 66  Fifo);.    /* If
319e0 20 4f 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20   ORDER BY makes 
319f0 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e  no difference in
31a00 20 74 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e   the output then
31a10 20 6e 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20   neither does.  
31a20 20 20 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f    ** DISTINCT so
31a30 20 69 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76   it can be remov
31a40 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73  ed too. */.    s
31a50 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
31a60 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64  lete(db, p->pOrd
31a70 65 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f  erBy);.    p->pO
31a80 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
31a90 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  p->selFlags &= ~
31aa0 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d  SF_Distinct;.  }
31ab0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
31ac0 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Prep(pParse, p, 
31ad0 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  0);.  if( pParse
31ae0 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
31af0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
31b00 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
31b10 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  d;.  }.  assert(
31b20 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b   p->pEList!=0 );
31b30 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
31b40 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
31b50 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
31b60 65 20 26 20 30 78 31 30 34 20 29 7b 0a 20 20 20  e & 0x104 ){.   
31b70 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
31b80 30 34 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 61  04,pParse,p, ("a
31b90 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75  fter name resolu
31ba0 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  tion:\n"));.    
31bb0 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
31bc0 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
31bd0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
31be0 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
31bf0 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
31c00 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
31c10 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29  Names(pParse, p)
31c20 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
31c30 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
31c40 57 46 55 4e 43 0a 20 20 69 66 28 20 73 71 6c 69  WFUNC.  if( sqli
31c50 74 65 33 57 69 6e 64 6f 77 52 65 77 72 69 74 65  te3WindowRewrite
31c60 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20  (pParse, p) ){. 
31c70 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
31c80 6e 64 3b 0a 20 20 7d 0a 23 69 66 20 53 45 4c 45  nd;.  }.#if SELE
31c90 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
31ca0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
31cb0 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30 38  ectTrace & 0x108
31cc0 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52   ){.    SELECTTR
31cd0 41 43 45 28 30 78 31 30 34 2c 70 50 61 72 73 65  ACE(0x104,pParse
31ce0 2c 70 2c 20 28 22 61 66 74 65 72 20 77 69 6e 64  ,p, ("after wind
31cf0 6f 77 20 72 65 77 72 69 74 65 3a 5c 6e 22 29 29  ow rewrite:\n"))
31d00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
31d10 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
31d20 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
31d30 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
31d40 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
31d50 43 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74 20  C */.  pTabList 
31d60 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 73 41  = p->pSrc;.  isA
31d70 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67  gg = (p->selFlag
31d80 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
31d90 29 21 3d 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26  )!=0;.  memset(&
31da0 73 53 6f 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66  sSort, 0, sizeof
31db0 28 73 53 6f 72 74 29 29 3b 0a 20 20 73 53 6f 72  (sSort));.  sSor
31dc0 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e  t.pOrderBy = p->
31dd0 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20  pOrderBy;..  /* 
31de0 54 72 79 20 74 6f 20 76 61 72 69 6f 75 73 20 6f  Try to various o
31df0 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 28 66 6c  ptimizations (fl
31e00 61 74 74 65 6e 69 6e 67 20 73 75 62 71 75 65 72  attening subquer
31e10 69 65 73 2c 20 61 6e 64 20 73 74 72 65 6e 67 74  ies, and strengt
31e20 68 0a 20 20 2a 2a 20 72 65 64 75 63 74 69 6f 6e  h.  ** reduction
31e30 20 6f 66 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f   of join operato
31e40 72 73 29 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  rs) in the FROM 
31e50 63 6c 61 75 73 65 20 75 70 20 69 6e 74 6f 20 74  clause up into t
31e60 68 65 20 6d 61 69 6e 20 71 75 65 72 79 0a 20 20  he main query.  
31e70 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
31e80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
31e90 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
31ea0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
31eb0 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21  EW).  for(i=0; !
31ec0 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70  p->pPrior && i<p
31ed0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
31ee0 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
31ef0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
31f00 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
31f10 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63  >a[i];.    Selec
31f20 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d  t *pSub = pItem-
31f30 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 54 61  >pSelect;.    Ta
31f40 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65  ble *pTab = pIte
31f50 6d 2d 3e 70 54 61 62 3b 0a 0a 20 20 20 20 2f 2a  m->pTab;..    /*
31f60 20 43 6f 6e 76 65 72 74 20 4c 45 46 54 20 4a 4f   Convert LEFT JO
31f70 49 4e 20 69 6e 74 6f 20 4a 4f 49 4e 20 69 66 20  IN into JOIN if 
31f80 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20  there are terms 
31f90 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
31fa0 6c 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  le.    ** of the
31fb0 20 4c 45 46 54 20 4a 4f 49 4e 20 75 73 65 64 20   LEFT JOIN used 
31fc0 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
31fd0 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  use..    */.    
31fe0 69 66 28 20 28 70 49 74 65 6d 2d 3e 66 67 2e 6a  if( (pItem->fg.j
31ff0 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
32000 54 29 21 3d 30 0a 20 20 20 20 20 26 26 20 73 71  T)!=0.     && sq
32010 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
32020 4e 6f 6e 4e 75 6c 6c 52 6f 77 28 70 2d 3e 70 57  NonNullRow(p->pW
32030 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75  here, pItem->iCu
32040 72 73 6f 72 29 0a 20 20 20 20 20 26 26 20 4f 70  rsor).     && Op
32050 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
32060 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 69 6d  d(db, SQLITE_Sim
32070 70 6c 69 66 79 4a 6f 69 6e 29 0a 20 20 20 20 29  plifyJoin).    )
32080 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  {.      SELECTTR
32090 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65  ACE(0x100,pParse
320a0 2c 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ,p,.            
320b0 20 20 20 20 28 22 4c 45 46 54 2d 4a 4f 49 4e 20      ("LEFT-JOIN 
320c0 73 69 6d 70 6c 69 66 69 65 73 20 74 6f 20 4a 4f  simplifies to JO
320d0 49 4e 20 6f 6e 20 74 65 72 6d 20 25 64 5c 6e 22  IN on term %d\n"
320e0 2c 69 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65  ,i));.      pIte
320f0 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  m->fg.jointype &
32100 3d 20 7e 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f  = ~(JT_LEFT|JT_O
32110 55 54 45 52 29 3b 0a 20 20 20 20 20 20 75 6e 73  UTER);.      uns
32120 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 57  etJoinExpr(p->pW
32130 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75  here, pItem->iCu
32140 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  rsor);.    }..  
32150 20 20 2f 2a 20 4e 6f 20 66 75 74 68 65 72 20 61    /* No futher a
32160 63 74 69 6f 6e 20 69 66 20 74 68 69 73 20 74 65  ction if this te
32170 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  rm of the FROM c
32180 6c 61 75 73 65 20 69 73 20 6e 6f 20 61 20 73 75  lause is no a su
32190 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 69 66  bquery */.    if
321a0 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74  ( pSub==0 ) cont
321b0 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 43 61  inue;..    /* Ca
321c0 74 63 68 20 6d 69 73 6d 61 74 63 68 20 69 6e 20  tch mismatch in 
321d0 74 68 65 20 64 65 63 6c 61 72 65 64 20 63 6f 6c  the declared col
321e0 75 6d 6e 73 20 6f 66 20 61 20 76 69 65 77 20 61  umns of a view a
321f0 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
32200 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20  .    ** columns 
32210 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 6f 6e  in the SELECT on
32220 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 20 20   the RHS */.    
32230 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 21 3d  if( pTab->nCol!=
32240 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  pSub->pEList->nE
32250 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  xpr ){.      sql
32260 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
32270 72 73 65 2c 20 22 65 78 70 65 63 74 65 64 20 25  rse, "expected %
32280 64 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 27 25  d columns for '%
32290 73 27 20 62 75 74 20 67 6f 74 20 25 64 22 2c 0a  s' but got %d",.
322a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
322b0 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c        pTab->nCol
322c0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70  , pTab->zName, p
322d0 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  Sub->pEList->nEx
322e0 70 72 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  pr);.      goto 
322f0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
32300 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  }..    /* Do not
32310 20 74 72 79 20 74 6f 20 66 6c 61 74 74 65 6e 20   try to flatten 
32320 61 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62  an aggregate sub
32330 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20  query..    **.  
32340 20 20 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20    ** Flattening 
32350 61 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62  an aggregate sub
32360 71 75 65 72 79 20 69 73 20 6f 6e 6c 79 20 70 6f  query is only po
32370 73 73 69 62 6c 65 20 69 66 20 74 68 65 20 6f 75  ssible if the ou
32380 74 65 72 20 71 75 65 72 79 0a 20 20 20 20 2a 2a  ter query.    **
32390 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 20   is not a join. 
323a0 20 42 75 74 20 69 66 20 74 68 65 20 6f 75 74 65   But if the oute
323b0 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
323c0 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65 20   join, then the 
323d0 73 75 62 71 75 65 72 79 0a 20 20 20 20 2a 2a 20  subquery.    ** 
323e0 77 69 6c 6c 20 62 65 20 69 6d 70 6c 65 6d 65 6e  will be implemen
323f0 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74  ted as a co-rout
32400 69 6e 65 20 61 6e 64 20 74 68 65 72 65 20 69 73  ine and there is
32410 20 6e 6f 20 61 64 76 61 6e 74 61 67 65 20 74 6f   no advantage to
32420 0a 20 20 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69  .    ** flatteni
32430 6e 67 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e  ng in that case.
32440 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
32450 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20  (pSub->selFlags 
32460 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21  & SF_Aggregate)!
32470 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
32480 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d     assert( pSub-
32490 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
324a0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
324b0 75 74 65 72 20 71 75 65 72 79 20 63 6f 6e 74 61  uter query conta
324c0 69 6e 73 20 61 20 22 63 6f 6d 70 6c 65 78 22 20  ins a "complex" 
324d0 72 65 73 75 6c 74 20 73 65 74 20 28 74 68 61 74  result set (that
324e0 20 69 73 2c 0a 20 20 20 20 2a 2a 20 69 66 20 74   is,.    ** if t
324f0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
32500 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
32510 20 75 73 65 73 20 66 75 6e 63 74 69 6f 6e 73 20   uses functions 
32520 6f 72 20 73 75 62 71 75 65 72 69 65 73 29 0a 20  or subqueries). 
32530 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65     ** and if the
32540 20 73 75 62 71 75 65 72 79 20 63 6f 6e 74 61 69   subquery contai
32550 6e 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  ns an ORDER BY c
32560 6c 61 75 73 65 20 61 6e 64 20 69 66 0a 20 20 20  lause and if.   
32570 20 2a 2a 20 69 74 20 77 69 6c 6c 20 62 65 20 69   ** it will be i
32580 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
32590 63 6f 2d 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e  co-routine, then
325a0 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e 2e   do not flatten.
325b0 20 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 72 65    This.    ** re
325c0 73 74 72 69 63 74 69 6f 6e 20 61 6c 6c 6f 77 73  striction allows
325d0 20 53 51 4c 20 63 6f 6e 73 74 72 75 63 74 73 20   SQL constructs 
325e0 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a  like this:.    *
325f0 2a 0a 20 20 20 20 2a 2a 20 20 53 45 4c 45 43 54  *.    **  SELECT
32600 20 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63 74   expensive_funct
32610 69 6f 6e 28 78 29 0a 20 20 20 20 2a 2a 20 20 20  ion(x).    **   
32620 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 20   FROM (SELECT x 
32630 46 52 4f 4d 20 74 61 62 20 4f 52 44 45 52 20 42  FROM tab ORDER B
32640 59 20 79 20 4c 49 4d 49 54 20 31 30 29 3b 0a 20  Y y LIMIT 10);. 
32650 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
32660 20 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63 74   expensive_funct
32670 69 6f 6e 28 29 20 69 73 20 6f 6e 6c 79 20 63 6f  ion() is only co
32680 6d 70 75 74 65 64 20 6f 6e 20 74 68 65 20 31 30  mputed on the 10
32690 20 72 6f 77 73 20 74 68 61 74 0a 20 20 20 20 2a   rows that.    *
326a0 2a 20 61 72 65 20 6f 75 74 70 75 74 2c 20 72 61  * are output, ra
326b0 74 68 65 72 20 74 68 61 6e 20 65 76 65 72 79 20  ther than every 
326c0 72 6f 77 20 6f 66 20 74 68 65 20 74 61 62 6c 65  row of the table
326d0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
326e0 54 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 20  The requirement 
326f0 74 68 61 74 20 74 68 65 20 6f 75 74 65 72 20 71  that the outer q
32700 75 65 72 79 20 68 61 76 65 20 61 20 63 6f 6d 70  uery have a comp
32710 6c 65 78 20 72 65 73 75 6c 74 20 73 65 74 0a 20  lex result set. 
32720 20 20 20 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74     ** means that
32730 20 66 6c 61 74 74 65 6e 69 6e 67 20 64 6f 65 73   flattening does
32740 20 6f 63 63 75 72 20 6f 6e 20 73 69 6d 70 6c 65   occur on simple
32750 72 20 53 51 4c 20 63 6f 6e 73 74 72 61 69 6e 74  r SQL constraint
32760 73 20 77 69 74 68 6f 75 74 0a 20 20 20 20 2a 2a  s without.    **
32770 20 74 68 65 20 65 78 70 65 6e 73 69 76 65 5f 66   the expensive_f
32780 75 6e 63 74 69 6f 6e 28 29 20 6c 69 6b 65 3a 0a  unction() like:.
32790 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 53      **.    **  S
327a0 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28 53 45  ELECT x FROM (SE
327b0 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 20  LECT x FROM tab 
327c0 4f 52 44 45 52 20 42 59 20 79 20 4c 49 4d 49 54  ORDER BY y LIMIT
327d0 20 31 30 29 3b 0a 20 20 20 20 2a 2f 0a 20 20 20   10);.    */.   
327e0 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
327f0 72 42 79 21 3d 30 0a 20 20 20 20 20 26 26 20 69  rBy!=0.     && i
32800 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 2d 3e  ==0.     && (p->
32810 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f  selFlags & SF_Co
32820 6d 70 6c 65 78 52 65 73 75 6c 74 29 21 3d 30 0a  mplexResult)!=0.
32830 20 20 20 20 20 26 26 20 28 70 54 61 62 4c 69 73       && (pTabLis
32840 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20  t->nSrc==1.     
32850 20 20 20 20 7c 7c 20 28 70 54 61 62 4c 69 73 74      || (pTabList
32860 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79  ->a[1].fg.jointy
32870 70 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43  pe&(JT_LEFT|JT_C
32880 52 4f 53 53 29 29 21 3d 30 29 0a 20 20 20 20 29  ROSS))!=0).    )
32890 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
328a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
328b0 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
328c0 28 70 50 61 72 73 65 2c 20 70 2c 20 69 2c 20 69  (pParse, p, i, i
328d0 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 2f  sAgg) ){.      /
328e0 2a 20 54 68 69 73 20 73 75 62 71 75 65 72 79 20  * This subquery 
328f0 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20  can be absorbed 
32900 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e  into its parent.
32910 20 2a 2f 0a 20 20 20 20 20 20 69 20 3d 20 2d 31   */.      i = -1
32920 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
32930 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
32940 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
32950 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
32960 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
32970 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72  if( !IgnorableOr
32980 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
32990 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64        sSort.pOrd
329a0 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
329b0 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  By;.    }.  }.#e
329c0 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
329d0 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
329e0 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 48  ND_SELECT.  /* H
329f0 61 6e 64 6c 65 20 63 6f 6d 70 6f 75 6e 64 20 53  andle compound S
32a00 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
32a10 20 75 73 69 6e 67 20 74 68 65 20 73 65 70 61 72   using the separ
32a20 61 74 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  ate multiSelect(
32a30 29 0a 20 20 2a 2a 20 70 72 6f 63 65 64 75 72 65  ).  ** procedure
32a40 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
32a50 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 63  pPrior ){.    rc
32a60 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70   = multiSelect(p
32a70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29  Parse, p, pDest)
32a80 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
32a90 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 53 45  E_ENABLED.    SE
32aa0 4c 45 43 54 54 52 41 43 45 28 30 78 31 2c 70 50  LECTTRACE(0x1,pP
32ab0 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 63 6f 6d  arse,p,("end com
32ac0 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70 72 6f  pound-select pro
32ad0 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20  cessing\n"));.  
32ae0 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 53 65    if( (sqlite3Se
32af0 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 32 30  lectTrace & 0x20
32b00 30 30 29 21 3d 30 20 26 26 20 45 78 70 6c 61 69  00)!=0 && Explai
32b10 6e 51 75 65 72 79 50 6c 61 6e 50 61 72 65 6e 74  nQueryPlanParent
32b20 28 70 50 61 72 73 65 29 3d 3d 30 20 29 7b 0a 20  (pParse)==0 ){. 
32b30 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
32b40 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
32b50 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   0);.    }.#endi
32b60 66 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65  f.    if( p->pNe
32b70 78 74 3d 3d 30 20 29 20 45 78 70 6c 61 69 6e 51  xt==0 ) ExplainQ
32b80 75 65 72 79 50 6c 61 6e 50 6f 70 28 70 50 61 72  ueryPlanPop(pPar
32b90 73 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  se);.    return 
32ba0 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rc;.  }.#endif..
32bb0 20 20 2f 2a 20 44 6f 20 74 68 65 20 57 48 45 52    /* Do the WHER
32bc0 45 2d 63 6c 61 75 73 65 20 63 6f 6e 73 74 61 6e  E-clause constan
32bd0 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6f 70  t propagation op
32be0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 74 68  timization if th
32bf0 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 6a 6f 69  is is.  ** a joi
32c00 6e 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 73  n.  No need to s
32c10 70 65 65 64 20 74 69 6d 65 20 6f 6e 20 74 68 69  peed time on thi
32c20 73 20 6f 70 65 72 61 74 69 6f 6e 20 66 6f 72 20  s operation for 
32c30 6e 6f 6e 2d 6a 6f 69 6e 20 71 75 65 72 69 65 73  non-join queries
32c40 0a 20 20 2a 2a 20 61 73 20 74 68 65 20 65 71 75  .  ** as the equ
32c50 69 76 61 6c 65 6e 74 20 6f 70 74 69 6d 69 7a 61  ivalent optimiza
32c60 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 68 61 6e  tion will be han
32c70 64 6c 65 64 20 62 79 20 71 75 65 72 79 20 70 6c  dled by query pl
32c80 61 6e 6e 65 72 20 69 6e 0a 20 20 2a 2a 20 73 71  anner in.  ** sq
32c90 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
32ca0 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  )..  */.  if( pT
32cb0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 0a 20  abList->nSrc>1. 
32cc0 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
32cd0 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
32ce0 49 54 45 5f 50 72 6f 70 61 67 61 74 65 43 6f 6e  ITE_PropagateCon
32cf0 73 74 29 0a 20 20 20 26 26 20 70 72 6f 70 61 67  st).   && propag
32d00 61 74 65 43 6f 6e 73 74 61 6e 74 73 28 70 50 61  ateConstants(pPa
32d10 72 73 65 2c 20 70 29 0a 20 20 29 7b 0a 23 69 66  rse, p).  ){.#if
32d20 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
32d30 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c  BLED.    if( sql
32d40 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
32d50 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 20  & 0x100 ){.     
32d60 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
32d70 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66  00,pParse,p,("Af
32d80 74 65 72 20 63 6f 6e 73 74 61 6e 74 20 70 72 6f  ter constant pro
32d90 70 61 67 61 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a  pagation:\n"));.
32da0 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
32db0 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
32dc0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , 0);.    }.#end
32dd0 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
32de0 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30  SELECTTRACE(0x10
32df0 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 43 6f 6e  0,pParse,p,("Con
32e00 73 74 61 6e 74 20 70 72 6f 70 61 67 61 74 69 6f  stant propagatio
32e10 6e 20 6e 6f 74 20 68 65 6c 70 66 75 6c 5c 6e 22  n not helpful\n"
32e20 29 29 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  ));.  }..#ifdef 
32e30 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49  SQLITE_COUNTOFVI
32e40 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  EW_OPTIMIZATION.
32e50 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
32e60 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
32e70 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65  LITE_QueryFlatte
32e80 6e 65 72 7c 53 51 4c 49 54 45 5f 43 6f 75 6e 74  ner|SQLITE_Count
32e90 4f 66 56 69 65 77 29 0a 20 20 20 26 26 20 63 6f  OfView).   && co
32ea0 75 6e 74 4f 66 56 69 65 77 4f 70 74 69 6d 69 7a  untOfViewOptimiz
32eb0 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 29  ation(pParse, p)
32ec0 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62  .  ){.    if( db
32ed0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
32ee0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
32ef0 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70  ;.    pEList = p
32f00 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 70 54  ->pEList;.    pT
32f10 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
32f20 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
32f30 2f 2a 20 46 6f 72 20 65 61 63 68 20 74 65 72 6d  /* For each term
32f40 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
32f50 75 73 65 2c 20 64 6f 20 74 77 6f 20 74 68 69 6e  use, do two thin
32f60 67 73 3a 0a 20 20 2a 2a 20 28 31 29 20 41 75 74  gs:.  ** (1) Aut
32f70 68 6f 72 69 7a 65 64 20 75 6e 72 65 66 65 72 65  horized unrefere
32f80 6e 63 65 64 20 74 61 62 6c 65 73 0a 20 20 2a 2a  nced tables.  **
32f90 20 28 32 29 20 47 65 6e 65 72 61 74 65 20 63 6f   (2) Generate co
32fa0 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71  de for all sub-q
32fb0 75 65 72 69 65 73 0a 20 20 2a 2f 0a 20 20 66 6f  ueries.  */.  fo
32fc0 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73  r(i=0; i<pTabLis
32fd0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
32fe0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
32ff0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
33000 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b  &pTabList->a[i];
33010 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20  .    SelectDest 
33020 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74  dest;.    Select
33030 20 2a 70 53 75 62 3b 0a 23 69 66 20 21 64 65 66   *pSub;.#if !def
33040 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
33050 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
33060 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
33070 49 54 5f 56 49 45 57 29 0a 20 20 20 20 63 6f 6e  IT_VIEW).    con
33080 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41  st char *zSavedA
33090 75 74 68 43 6f 6e 74 65 78 74 3b 0a 23 65 6e 64  uthContext;.#end
330a0 69 66 0a 0a 20 20 20 20 2f 2a 20 49 73 73 75 65  if..    /* Issue
330b0 20 53 51 4c 49 54 45 5f 52 45 41 44 20 61 75 74   SQLITE_READ aut
330c0 68 6f 72 69 7a 61 74 69 6f 6e 73 20 77 69 74 68  horizations with
330d0 20 61 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e   a fake column n
330e0 61 6d 65 20 66 6f 72 20 61 6e 79 0a 20 20 20 20  ame for any.    
330f0 2a 2a 20 74 61 62 6c 65 73 20 74 68 61 74 20 61  ** tables that a
33100 72 65 20 72 65 66 65 72 65 6e 63 65 64 20 62 75  re referenced bu
33110 74 20 66 72 6f 6d 20 77 68 69 63 68 20 6e 6f 20  t from which no 
33120 76 61 6c 75 65 73 20 61 72 65 20 65 78 74 72 61  values are extra
33130 63 74 65 64 2e 0a 20 20 20 20 2a 2a 20 45 78 61  cted..    ** Exa
33140 6d 70 6c 65 73 20 6f 66 20 77 68 65 72 65 20 74  mples of where t
33150 68 65 73 65 20 6b 69 6e 64 73 20 6f 66 20 6e 75  hese kinds of nu
33160 6c 6c 20 53 51 4c 49 54 45 5f 52 45 41 44 20 61  ll SQLITE_READ a
33170 75 74 68 6f 72 69 7a 61 74 69 6f 6e 73 0a 20 20  uthorizations.  
33180 20 20 2a 2a 20 77 6f 75 6c 64 20 6f 63 63 75 72    ** would occur
33190 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
331a0 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
331b0 28 2a 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 2d  (*) FROM t1;   -
331c0 2d 20 53 51 4c 49 54 45 5f 52 45 41 44 20 74 31  - SQLITE_READ t1
331d0 2e 22 22 0a 20 20 20 20 2a 2a 20 20 20 20 20 53  ."".    **     S
331e0 45 4c 45 43 54 20 74 31 2e 2a 20 46 52 4f 4d 20  ELECT t1.* FROM 
331f0 74 31 2c 20 74 32 3b 20 20 20 2d 2d 20 53 51 4c  t1, t2;   -- SQL
33200 49 54 45 5f 52 45 41 44 20 74 32 2e 22 22 0a 20  ITE_READ t2."". 
33210 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
33220 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d   fake column nam
33230 65 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74  e is an empty st
33240 72 69 6e 67 2e 20 20 49 74 20 69 73 20 70 6f 73  ring.  It is pos
33250 73 69 62 6c 65 20 66 6f 72 20 61 20 74 61 62 6c  sible for a tabl
33260 65 20 74 6f 0a 20 20 20 20 2a 2a 20 68 61 76 65  e to.    ** have
33270 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20   a column named 
33280 62 79 20 74 68 65 20 65 6d 70 74 79 20 73 74 72  by the empty str
33290 69 6e 67 2c 20 69 6e 20 77 68 69 63 68 20 63 61  ing, in which ca
332a0 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  se there is no w
332b0 61 79 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73  ay to.    ** dis
332c0 74 69 6e 67 75 69 73 68 20 62 65 74 77 65 65 6e  tinguish between
332d0 20 61 6e 20 75 6e 72 65 66 65 72 65 6e 63 65 64   an unreferenced
332e0 20 74 61 62 6c 65 20 61 6e 64 20 61 6e 20 61 63   table and an ac
332f0 74 75 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74  tual reference t
33300 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 22 22 20  o the.    ** "" 
33310 63 6f 6c 75 6d 6e 2e 20 54 68 65 20 6f 72 69 67  column. The orig
33320 69 6e 61 6c 20 64 65 73 69 67 6e 20 77 61 73 20  inal design was 
33330 66 6f 72 20 74 68 65 20 66 61 6b 65 20 63 6f 6c  for the fake col
33340 75 6d 6e 20 6e 61 6d 65 20 74 6f 20 62 65 20 61  umn name to be a
33350 20 4e 55 4c 4c 2c 0a 20 20 20 20 2a 2a 20 77 68   NULL,.    ** wh
33360 69 63 68 20 77 6f 75 6c 64 20 62 65 20 75 6e 61  ich would be una
33370 6d 62 69 67 75 6f 75 73 2e 20 20 42 75 74 20 6c  mbiguous.  But l
33380 65 67 61 63 79 20 61 75 74 68 6f 72 69 7a 61 74  egacy authorizat
33390 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 73 20 6d 69  ion callbacks mi
333a0 67 68 74 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d  ght.    ** assum
333b0 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
333c0 65 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e  e is non-NULL an
333d0 64 20 73 65 67 66 61 75 6c 74 2e 20 20 54 68 65  d segfault.  The
333e0 20 75 73 65 20 6f 66 20 61 6e 20 65 6d 70 74 79   use of an empty
333f0 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e 67 20 66  .    ** string f
33400 6f 72 20 74 68 65 20 66 61 6b 65 20 63 6f 6c 75  or the fake colu
33410 6d 6e 20 6e 61 6d 65 20 73 65 65 6d 73 20 73 61  mn name seems sa
33420 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  fer..    */.    
33430 69 66 28 20 70 49 74 65 6d 2d 3e 63 6f 6c 55 73  if( pItem->colUs
33440 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ed==0 ){.      s
33450 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
33460 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52  pParse, SQLITE_R
33470 45 41 44 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  EAD, pItem->zNam
33480 65 2c 20 22 22 2c 20 70 49 74 65 6d 2d 3e 7a 44  e, "", pItem->zD
33490 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 7d 0a  atabase);.    }.
334a0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
334b0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
334c0 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
334d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
334e0 29 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  ).    /* Generat
334f0 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73  e code for all s
33500 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68  ub-queries in th
33510 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  e FROM clause.  
33520 20 20 2a 2f 0a 20 20 20 20 70 53 75 62 20 3d 20    */.    pSub = 
33530 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pItem->pSelect;.
33540 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20      if( pSub==0 
33550 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
33560 20 2f 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68   /* Sometimes th
33570 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 75 62  e code for a sub
33580 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20 67 65  query will be ge
33590 6e 65 72 61 74 65 64 20 6d 6f 72 65 20 74 68 61  nerated more tha
335a0 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69  n.    ** once, i
335b0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
335c0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 57 48  s part of the WH
335d0 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 61 20  ERE clause in a 
335e0 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a  LEFT JOIN,.    *
335f0 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20  * for example.  
33600 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64 6f  In that case, do
33610 20 6e 6f 74 20 72 65 67 65 6e 65 72 61 74 65 20   not regenerate 
33620 74 68 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69  the code to mani
33630 66 65 73 74 0a 20 20 20 20 2a 2a 20 61 20 76 69  fest.    ** a vi
33640 65 77 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75  ew or the co-rou
33650 74 69 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  tine to implemen
33660 74 20 61 20 76 69 65 77 2e 20 20 54 68 65 20 66  t a view.  The f
33670 69 72 73 74 20 69 6e 73 74 61 6e 63 65 0a 20 20  irst instance.  
33680 20 20 2a 2a 20 69 73 20 73 75 66 66 69 63 69 65    ** is sufficie
33690 6e 74 2c 20 74 68 6f 75 67 68 20 74 68 65 20 73  nt, though the s
336a0 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e  ubroutine to man
336b0 69 66 65 73 74 20 74 68 65 20 76 69 65 77 20 64  ifest the view d
336c0 6f 65 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20  oes need.    ** 
336d0 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 67  to be invoked ag
336e0 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ain. */.    if( 
336f0 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
33700 75 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ub ){.      if( 
33710 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72  pItem->fg.viaCor
33720 6f 75 74 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20  outine==0 ){.   
33730 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 72       /* The subr
33740 6f 75 74 69 6e 65 20 74 68 61 74 20 6d 61 6e 69  outine that mani
33750 66 65 73 74 73 20 74 68 65 20 76 69 65 77 20 6d  fests the view m
33760 69 67 68 74 20 62 65 20 61 20 6f 6e 65 2d 74 69  ight be a one-ti
33770 6d 65 20 72 6f 75 74 69 6e 65 2c 0a 20 20 20 20  me routine,.    
33780 20 20 20 20 2a 2a 20 6f 72 20 69 74 20 6d 69 67      ** or it mig
33790 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65  ht need to be re
337a0 72 75 6e 20 6f 6e 20 65 61 63 68 20 69 74 65 72  run on each iter
337b0 61 74 69 6f 6e 20 62 65 63 61 75 73 65 20 69 74  ation because it
337c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 6e 63 6f  .        ** enco
337d0 64 65 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64  des a correlated
337e0 20 73 75 62 71 75 65 72 79 2e 20 2a 2f 0a 20 20   subquery. */.  
337f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
33800 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
33810 28 76 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  (v, pItem->addrF
33820 69 6c 6c 53 75 62 29 2d 3e 6f 70 63 6f 64 65 3d  illSub)->opcode=
33830 3d 4f 50 5f 4f 6e 63 65 20 29 3b 0a 20 20 20 20  =OP_Once );.    
33840 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
33850 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
33860 62 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  b, pItem->regRet
33870 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72  urn, pItem->addr
33880 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20 20  FillSub);.      
33890 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  }.      continue
338a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
338b0 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e  Increment Parse.
338c0 6e 48 65 69 67 68 74 20 62 79 20 74 68 65 20 68  nHeight by the h
338d0 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72  eight of the lar
338e0 67 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a  gest expression.
338f0 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65      ** tree refe
33900 72 72 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c  rred to by this,
33910 20 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65   the parent sele
33920 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65  ct. The child se
33930 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20  lect.    ** may 
33940 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69  contain expressi
33950 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d  on trees of at m
33960 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49  ost.    ** (SQLI
33970 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
33980 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29  H-Parse.nHeight)
33990 20 68 65 69 67 68 74 2e 20 54 68 69 73 20 69 73   height. This is
339a0 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f   a bit.    ** mo
339b0 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20  re conservative 
339c0 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20  than necessary, 
339d0 62 75 74 20 6d 75 63 68 20 65 61 73 69 65 72 20  but much easier 
339e0 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20  than enforcing. 
339f0 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c     ** an exact l
33a00 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  imit..    */.   
33a10 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74   pParse->nHeight
33a20 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63   += sqlite3Selec
33a30 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a  tExprHeight(p);.
33a40 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 63 6f 70  .    /* Make cop
33a50 69 65 73 20 6f 66 20 63 6f 6e 73 74 61 6e 74 20  ies of constant 
33a60 57 48 45 52 45 2d 63 6c 61 75 73 65 20 74 65 72  WHERE-clause ter
33a70 6d 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  ms in the outer 
33a80 71 75 65 72 79 20 64 6f 77 6e 0a 20 20 20 20 2a  query down.    *
33a90 2a 20 69 6e 73 69 64 65 20 74 68 65 20 73 75 62  * inside the sub
33aa0 71 75 65 72 79 2e 20 20 54 68 69 73 20 63 61 6e  query.  This can
33ab0 20 68 65 6c 70 20 74 68 65 20 73 75 62 71 75 65   help the subque
33ac0 72 79 20 74 6f 20 72 75 6e 20 6d 6f 72 65 20 65  ry to run more e
33ad0 66 66 69 63 69 65 6e 74 6c 79 2e 0a 20 20 20 20  fficiently..    
33ae0 2a 2f 0a 20 20 20 20 69 66 28 20 4f 70 74 69 6d  */.    if( Optim
33af0 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64  izationEnabled(d
33b00 62 2c 20 53 51 4c 49 54 45 5f 50 75 73 68 44 6f  b, SQLITE_PushDo
33b10 77 6e 29 0a 20 20 20 20 20 26 26 20 70 75 73 68  wn).     && push
33b20 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 70  DownWhereTerms(p
33b30 50 61 72 73 65 2c 20 70 53 75 62 2c 20 70 2d 3e  Parse, pSub, p->
33b40 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69  pWhere, pItem->i
33b50 43 75 72 73 6f 72 2c 0a 20 20 20 20 20 20 20 20  Cursor,.        
33b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b70 20 20 20 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f     (pItem->fg.jo
33b80 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
33b90 52 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 23 69  R)!=0).    ){.#i
33ba0 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
33bb0 41 42 4c 45 44 0a 20 20 20 20 20 20 69 66 28 20  ABLED.      if( 
33bc0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
33bd0 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20  ce & 0x100 ){.  
33be0 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43        SELECTTRAC
33bf0 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70  E(0x100,pParse,p
33c00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 22  ,.            ("
33c10 41 66 74 65 72 20 57 48 45 52 45 2d 63 6c 61 75  After WHERE-clau
33c20 73 65 20 70 75 73 68 2d 64 6f 77 6e 20 69 6e 74  se push-down int
33c30 6f 20 73 75 62 71 75 65 72 79 20 25 64 3a 5c 6e  o subquery %d:\n
33c40 22 2c 20 70 53 75 62 2d 3e 73 65 6c 49 64 29 29  ", pSub->selId))
33c50 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
33c60 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
33c70 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, p, 0);.      
33c80 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  }.#endif.    }el
33c90 73 65 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  se{.      SELECT
33ca0 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72  TRACE(0x100,pPar
33cb0 73 65 2c 70 2c 28 22 50 75 73 68 2d 64 6f 77 6e  se,p,("Push-down
33cc0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 5c 6e 22   not possible\n"
33cd0 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7a  ));.    }..    z
33ce0 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
33cf0 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68   = pParse->zAuth
33d00 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70 50 61  Context;.    pPa
33d10 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
33d20 74 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  t = pItem->zName
33d30 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ;..    /* Genera
33d40 74 65 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65  te code to imple
33d50 6d 65 6e 74 20 74 68 65 20 73 75 62 71 75 65 72  ment the subquer
33d60 79 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  y.    **.    ** 
33d70 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
33d80 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
33d90 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 66 20 74   co-routine if t
33da0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 0a 20  he subquery is. 
33db0 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64     ** guaranteed
33dc0 20 74 6f 20 62 65 20 74 68 65 20 6f 75 74 65 72   to be the outer
33dd0 20 6c 6f 6f 70 20 28 73 6f 20 74 68 61 74 20 69   loop (so that i
33de0 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
33df0 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 6d  to be.    ** com
33e00 70 75 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 20  puted more than 
33e10 6f 6e 63 65 29 0a 20 20 20 20 2a 2a 0a 20 20 20  once).    **.   
33e20 20 2a 2a 20 54 4f 44 4f 3a 20 41 72 65 20 74 68   ** TODO: Are th
33e30 65 72 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e  ere other reason
33e40 73 20 62 65 73 69 64 65 20 28 31 29 20 74 6f 20  s beside (1) to 
33e50 75 73 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65  use a co-routine
33e60 0a 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e  .    ** implemen
33e70 74 61 74 69 6f 6e 3f 0a 20 20 20 20 2a 2f 0a 20  tation?.    */. 
33e80 20 20 20 69 66 28 20 69 3d 3d 30 0a 20 20 20 20     if( i==0.    
33e90 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e   && (pTabList->n
33ea0 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20  Src==1.         
33eb0 20 20 20 7c 7c 20 28 70 54 61 62 4c 69 73 74 2d     || (pTabList-
33ec0 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70  >a[1].fg.jointyp
33ed0 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52  e&(JT_LEFT|JT_CR
33ee0 4f 53 53 29 29 21 3d 30 29 20 20 2f 2a 20 28 31  OSS))!=0)  /* (1
33ef0 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20  ) */.    ){.    
33f00 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61    /* Implement a
33f10 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74   co-routine that
33f20 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 73   will return a s
33f30 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
33f40 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a   result.      **
33f50 20 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e 76   set on each inv
33f60 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  ocation..      *
33f70 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
33f80 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
33f90 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
33fa0 31 3b 0a 20 20 20 20 20 0a 20 20 20 20 20 20 70  1;.     .      p
33fb0 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
33fc0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
33fd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
33fe0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
33ff0 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 70  InitCoroutine, p
34000 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c  Item->regReturn,
34010 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20   0, addrTop);.  
34020 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
34030 28 76 2c 20 22 25 73 22 2c 20 70 49 74 65 6d 2d  (v, "%s", pItem-
34040 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
34050 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64        pItem->add
34060 72 46 69 6c 6c 53 75 62 20 3d 20 61 64 64 72 54  rFillSub = addrT
34070 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  op;.      sqlite
34080 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
34090 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75  &dest, SRT_Corou
340a0 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67  tine, pItem->reg
340b0 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 45  Return);.      E
340c0 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
340d0 28 70 50 61 72 73 65 2c 20 31 2c 20 22 43 4f 2d  (pParse, 1, "CO-
340e0 52 4f 55 54 49 4e 45 20 25 75 22 2c 20 70 53 75  ROUTINE %u", pSu
340f0 62 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20 20 20  b->selId));.    
34100 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
34110 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64  pParse, pSub, &d
34120 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65  est);.      pIte
34130 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67  m->pTab->nRowLog
34140 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e 53 65 6c  Est = pSub->nSel
34150 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 70 49  ectRow;.      pI
34160 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75  tem->fg.viaCorou
34170 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  tine = 1;.      
34180 70 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74  pItem->regResult
34190 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20   = dest.iSdst;. 
341a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
341b0 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20  EndCoroutine(v, 
341c0 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
341d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
341e0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
341f0 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20 20 20  addrTop-1);.    
34200 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65    sqlite3ClearTe
34210 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73  mpRegCache(pPars
34220 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
34230 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
34240 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
34250 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20  at will fill an 
34260 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
34270 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 74 68  with.      ** th
34280 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69  e content of thi
34290 73 20 73 75 62 71 75 65 72 79 2e 20 20 70 49 74  s subquery.  pIt
342a0 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
342b0 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20  will point.     
342c0 20 2a 2a 20 74 6f 20 74 68 65 20 61 64 64 72 65   ** to the addre
342d0 73 73 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61  ss of the genera
342e0 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  ted subroutine. 
342f0 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
34300 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20  n.      ** is a 
34310 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61 74  register allocat
34320 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 73  ed to hold the s
34330 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  ubroutine return
34340 20 61 64 64 72 65 73 73 0a 20 20 20 20 20 20 2a   address.      *
34350 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70 41  /.      int topA
34360 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f  ddr;.      int o
34370 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a 20 20 20  nceAddr = 0;.   
34380 20 20 20 69 6e 74 20 72 65 74 41 64 64 72 3b 0a     int retAddr;.
34390 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
343a0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 50 72 69 6f  List_item *pPrio
343b0 72 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  r;..      assert
343c0 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  ( pItem->addrFil
343d0 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  lSub==0 );.     
343e0 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
343f0 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
34400 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41 64 64  em;.      topAdd
34410 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
34420 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
34430 67 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72  ger, 0, pItem->r
34440 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20  egReturn);.     
34450 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
34460 53 75 62 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b  Sub = topAddr+1;
34470 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
34480 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65  ->fg.isCorrelate
34490 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
344a0 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71 75 65  /* If the subque
344b0 72 79 20 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c  ry is not correl
344c0 61 74 65 64 20 61 6e 64 20 69 66 20 77 65 20 61  ated and if we a
344d0 72 65 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66  re not inside of
344e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72  .        ** a tr
344f0 69 67 67 65 72 2c 20 74 68 65 6e 20 77 65 20 6f  igger, then we o
34500 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70  nly need to comp
34510 75 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ute the value of
34520 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20 20   the subquery.  
34530 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a        ** once. *
34540 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 41 64  /.        onceAd
34550 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
34560 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp0(v, OP_Onc
34570 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
34580 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  (v);.        Vdb
34590 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61  eComment((v, "ma
345a0 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22  terialize \"%s\"
345b0 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
345c0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d  zName));.      }
345d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 56 64  else{.        Vd
345e0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
345f0 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c  , "materialize \
34600 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70  "%s\"", pItem->p
34610 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
34620 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 72 69      }.      pPri
34630 6f 72 20 3d 20 69 73 53 65 6c 66 4a 6f 69 6e 56  or = isSelfJoinV
34640 69 65 77 28 70 54 61 62 4c 69 73 74 2c 20 70 49  iew(pTabList, pI
34650 74 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tem);.      if( 
34660 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 20 20  pPrior ){.      
34670 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
34680 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75  Op2(v, OP_OpenDu
34690 70 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  p, pItem->iCurso
346a0 72 2c 20 70 50 72 69 6f 72 2d 3e 69 43 75 72 73  r, pPrior->iCurs
346b0 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  or);.        ass
346c0 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 53 65  ert( pPrior->pSe
346d0 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  lect!=0 );.     
346e0 20 20 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74     pSub->nSelect
346f0 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 70 53  Row = pPrior->pS
34700 65 6c 65 63 74 2d 3e 6e 53 65 6c 65 63 74 52 6f  elect->nSelectRo
34710 77 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  w;.      }else{.
34720 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
34730 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
34740 65 73 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61  est, SRT_EphemTa
34750 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  b, pItem->iCurso
34760 72 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 6c  r);.        Expl
34770 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
34780 61 72 73 65 2c 20 31 2c 20 22 4d 41 54 45 52 49  arse, 1, "MATERI
34790 41 4c 49 5a 45 20 25 75 22 2c 20 70 53 75 62 2d  ALIZE %u", pSub-
347a0 3e 73 65 6c 49 64 29 29 3b 0a 20 20 20 20 20 20  >selId));.      
347b0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
347c0 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64  pParse, pSub, &d
347d0 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  est);.      }.  
347e0 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d      pItem->pTab-
347f0 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53  >nRowLogEst = pS
34800 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  ub->nSelectRow;.
34810 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64        if( onceAd
34820 64 72 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  dr ) sqlite3Vdbe
34830 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65  JumpHere(v, once
34840 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74  Addr);.      ret
34850 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
34860 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
34870 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65  eturn, pItem->re
34880 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
34890 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
348a0 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d  "end %s", pItem-
348b0 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
348c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
348d0 65 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70  eChangeP1(v, top
348e0 41 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a  Addr, retAddr);.
348f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65        sqlite3Cle
34900 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70  arTempRegCache(p
34910 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
34920 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
34930 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65  Failed ) goto se
34940 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70 50  lect_end;.    pP
34950 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d  arse->nHeight -=
34960 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
34970 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20 20  prHeight(p);.   
34980 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
34990 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75  ntext = zSavedAu
349a0 74 68 43 6f 6e 74 65 78 74 3b 0a 23 65 6e 64 69  thContext;.#endi
349b0 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 56 61 72 69  f.  }..  /* Vari
349c0 6f 75 73 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  ous elements of 
349d0 74 68 65 20 53 45 4c 45 43 54 20 63 6f 70 69 65  the SELECT copie
349e0 64 20 69 6e 74 6f 20 6c 6f 63 61 6c 20 76 61 72  d into local var
349f0 69 61 62 6c 65 73 20 66 6f 72 0a 20 20 2a 2a 20  iables for.  ** 
34a00 63 6f 6e 76 65 6e 69 65 6e 63 65 20 2a 2f 0a 20  convenience */. 
34a10 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
34a20 69 73 74 3b 0a 20 20 70 57 68 65 72 65 20 3d 20  ist;.  pWhere = 
34a30 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72  p->pWhere;.  pGr
34a40 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
34a50 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d  pBy;.  pHaving =
34a60 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73   p->pHaving;.  s
34a70 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
34a80 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  = (p->selFlags &
34a90 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
34aa0 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ;..#if SELECTTRA
34ab0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
34ac0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
34ad0 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20  ace & 0x400 ){. 
34ae0 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
34af0 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x400,pParse,p,("
34b00 41 66 74 65 72 20 61 6c 6c 20 46 52 4f 4d 2d 63  After all FROM-c
34b10 6c 61 75 73 65 20 61 6e 61 6c 79 73 69 73 3a 5c  lause analysis:\
34b20 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n"));.    sqlite
34b30 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
34b40 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, p, 0);.  }.#e
34b50 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
34b60 65 20 71 75 65 72 79 20 69 73 20 44 49 53 54 49  e query is DISTI
34b70 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45  NCT with an ORDE
34b80 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f 74 20  R BY but is not 
34b90 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20 61 6e  an aggregate, an
34ba0 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 73  d .  ** if the s
34bb0 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20 74 68  elect-list is th
34bc0 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 4f 52  e same as the OR
34bd0 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74 68 65  DER BY list, the
34be0 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a  n this query.  *
34bf0 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69 74 74  * can be rewritt
34c00 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20 42 59  en as a GROUP BY
34c10 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
34c20 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a  , this:.  **.  *
34c30 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44 49 53  *     SELECT DIS
34c40 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e  TINCT xyz FROM .
34c50 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a  .. ORDER BY xyz.
34c60 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61    **.  ** is tra
34c70 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a  nsformed to:.  *
34c80 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
34c90 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47  T xyz FROM ... G
34ca0 52 4f 55 50 20 42 59 20 78 79 7a 20 4f 52 44 45  ROUP BY xyz ORDE
34cb0 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20  R BY xyz.  **.  
34cc0 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f  ** The second fo
34cd0 72 6d 20 69 73 20 70 72 65 66 65 72 72 65 64 20  rm is preferred 
34ce0 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65  as a single inde
34cf0 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c 65  x (or temp-table
34d00 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20 75  ) may be .  ** u
34d10 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65  sed for both the
34d20 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44 49   ORDER BY and DI
34d30 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e  STINCT processin
34d40 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c 79  g. As originally
34d50 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74   .  ** written t
34d60 68 65 20 71 75 65 72 79 20 6d 75 73 74 20 75 73  he query must us
34d70 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20 66  e a temp-table f
34d80 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  or at least one 
34d90 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20 20  of the ORDER .  
34da0 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  ** BY and DISTIN
34db0 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65 78  CT, and an index
34dc0 20 6f 72 20 73 65 70 61 72 61 74 65 20 74 65 6d   or separate tem
34dd0 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20  p-table for the 
34de0 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  other..  */.  if
34df0 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
34e00 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
34e10 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
34e20 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26 26  _Distinct .   &&
34e30 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
34e40 43 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e 70 4f  Compare(sSort.pO
34e50 72 64 65 72 42 79 2c 20 70 45 4c 69 73 74 2c 20  rderBy, pEList, 
34e60 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20  -1)==0.  ){.    
34e70 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  p->selFlags &= ~
34e80 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20  SF_Distinct;.   
34e90 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
34ea0 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
34eb0 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
34ec0 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20   pEList, 0);.   
34ed0 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20   /* Notice that 
34ee0 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46 5f  even thought SF_
34ef0 44 69 73 74 69 6e 63 74 20 68 61 73 20 62 65 65  Distinct has bee
34f00 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20 70  n cleared from p
34f10 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20  ->selFlags,.    
34f20 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63 74  ** the sDistinct
34f30 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c 6c  .isTnct is still
34f40 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69 73   set.  Hence, is
34f50 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73 20  Tnct represents 
34f60 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69  the.    ** origi
34f70 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20 74  nal setting of t
34f80 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20 66  he SF_Distinct f
34f90 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75 72  lag, not the cur
34fa0 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a  rent setting */.
34fb0 20 20 20 20 61 73 73 65 72 74 28 20 73 44 69 73      assert( sDis
34fc0 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a  tinct.isTnct );.
34fd0 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
34fe0 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28  _ENABLED.    if(
34ff0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
35000 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20  ace & 0x400 ){. 
35010 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
35020 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x400,pParse,p,
35030 28 22 54 72 61 6e 73 66 6f 72 6d 20 44 49 53 54  ("Transform DIST
35040 49 4e 43 54 20 69 6e 74 6f 20 47 52 4f 55 50 20  INCT into GROUP 
35050 42 59 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  BY:\n"));.      
35060 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
35070 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
35080 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
35090 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
350a0 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
350b0 6c 61 75 73 65 2c 20 74 68 65 6e 20 63 72 65 61  lause, then crea
350c0 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  te an ephemeral 
350d0 69 6e 64 65 78 20 74 6f 0a 20 20 2a 2a 20 64 6f  index to.  ** do
350e0 20 74 68 65 20 73 6f 72 74 69 6e 67 2e 20 20 42   the sorting.  B
350f0 75 74 20 74 68 69 73 20 73 6f 72 74 69 6e 67 20  ut this sorting 
35100 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
35110 6d 69 67 68 74 20 65 6e 64 20 75 70 0a 20 20 2a  might end up.  *
35120 2a 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20 69  * being unused i
35130 66 20 74 68 65 20 64 61 74 61 20 63 61 6e 20 62  f the data can b
35140 65 20 65 78 74 72 61 63 74 65 64 20 69 6e 20 70  e extracted in p
35150 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e  re-sorted order.
35160 0a 20 20 2a 2a 20 49 66 20 74 68 61 74 20 69 73  .  ** If that is
35170 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20   the case, then 
35180 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  the OP_OpenEphem
35190 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
351a0 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 63 68   will be.  ** ch
351b0 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e  anged to an OP_N
351c0 6f 6f 70 20 6f 6e 63 65 20 77 65 20 66 69 67 75  oop once we figu
351d0 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65 20  re out that the 
351e0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73  sorting index is
351f0 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65 65 64 65 64  .  ** not needed
35200 2e 20 20 54 68 65 20 73 53 6f 72 74 2e 61 64 64  .  The sSort.add
35210 72 53 6f 72 74 49 6e 64 65 78 20 76 61 72 69 61  rSortIndex varia
35220 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 66  ble is used to f
35230 61 63 69 6c 69 74 61 74 65 0a 20 20 2a 2a 20 74  acilitate.  ** t
35240 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f  hat change..  */
35250 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72  .  if( sSort.pOr
35260 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79  derBy ){.    Key
35270 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
35280 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
35290 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f  qlite3KeyInfoFro
352a0 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 20 20 20  mExprList(.     
352b0 20 20 20 70 50 61 72 73 65 2c 20 73 53 6f 72 74     pParse, sSort
352c0 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 70 45  .pOrderBy, 0, pE
352d0 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
352e0 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f 72    sSort.iECursor
352f0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
35300 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64  +;.    sSort.add
35310 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20  rSortIndex =.   
35320 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
35330 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
35340 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20  phemeral,.      
35350 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73      sSort.iECurs
35360 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  or, sSort.pOrder
35370 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70 45 4c 69  By->nExpr+1+pELi
35380 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a 20 20  st->nExpr, 0,.  
35390 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
353a0 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
353b0 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a 20 20 7d  NFO.      );.  }
353c0 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72 74 2e  else{.    sSort.
353d0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20  addrSortIndex = 
353e0 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  -1;.  }..  /* If
353f0 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64   the output is d
35400 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65  estined for a te
35410 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f  mporary table, o
35420 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a  pen that table..
35430 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74    */.  if( pDest
35440 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ->eDest==SRT_Eph
35450 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c  emTab ){.    sql
35460 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
35470 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
35480 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  al, pDest->iSDPa
35490 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rm, pEList->nExp
354a0 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  r);.  }..  /* Se
354b0 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20  t the limiter.. 
354c0 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c   */.  iEnd = sql
354d0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
354e0 6c 28 76 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  l(v);.  if( (p->
354f0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 46 69  selFlags & SF_Fi
35500 78 65 64 4c 69 6d 69 74 29 3d 3d 30 20 29 7b 0a  xedLimit)==0 ){.
35510 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
35520 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20 62  w = 320;  /* 4 b
35530 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a 20  illion rows */. 
35540 20 7d 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69   }.  computeLimi
35550 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
35560 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20 69  e, p, iEnd);.  i
35570 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20  f( p->iLimit==0 
35580 26 26 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  && sSort.addrSor
35590 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20 20  tIndex>=0 ){.   
355a0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
355b0 67 65 4f 70 63 6f 64 65 28 76 2c 20 73 53 6f 72  geOpcode(v, sSor
355c0 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 2c  t.addrSortIndex,
355d0 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 29 3b   OP_SorterOpen);
355e0 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f 72 74 46  .    sSort.sortF
355f0 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46 4c 41 47  lags |= SORTFLAG
35600 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d 0a  _UseSorter;.  }.
35610 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e 20 65 70  .  /* Open an ep
35620 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 6f  hemeral index to
35630 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73   use for the dis
35640 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a  tinct set..  */.
35650 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
35660 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
35670 29 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  ){.    sDistinct
35680 2e 74 61 62 54 6e 63 74 20 3d 20 70 50 61 72 73  .tabTnct = pPars
35690 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73  e->nTab++;.    s
356a0 44 69 73 74 69 6e 63 74 2e 61 64 64 72 54 6e 63  Distinct.addrTnc
356b0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
356c0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
356d0 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20  Ephemeral,.     
356e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
356f0 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54    sDistinct.tabT
35700 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  nct, 0, 0,.     
35710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35720 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33    (char*)sqlite3
35730 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  KeyInfoFromExprL
35740 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ist(pParse, p->p
35750 45 4c 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20  EList,0,0),.    
35760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35770 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a     P4_KEYINFO);.
35780 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
35790 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45  hangeP5(v, BTREE
357a0 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20  _UNORDERED);.   
357b0 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
357c0 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53  Type = WHERE_DIS
357d0 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b  TINCT_UNORDERED;
357e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44  .  }else{.    sD
357f0 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
35800 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  e = WHERE_DISTIN
35810 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20  CT_NOOP;.  }..  
35820 69 66 28 20 21 69 73 41 67 67 20 26 26 20 70 47  if( !isAgg && pG
35830 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20  roupBy==0 ){.   
35840 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61 74 65   /* No aggregate
35850 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e   functions and n
35860 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  o GROUP BY claus
35870 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74  e */.    u16 wct
35880 72 6c 46 6c 61 67 73 20 3d 20 28 73 44 69 73 74  rlFlags = (sDist
35890 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20 57 48  inct.isTnct ? WH
358a0 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
358b0 54 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20 20  T : 0).         
358c0 20 20 20 20 20 20 20 20 20 20 7c 20 28 70 2d 3e            | (p->
358d0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 46 69  selFlags & SF_Fi
358e0 78 65 64 4c 69 6d 69 74 29 3b 0a 23 69 66 6e 64  xedLimit);.#ifnd
358f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
35900 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 57 69  INDOWFUNC.    Wi
35910 6e 64 6f 77 20 2a 70 57 69 6e 20 3d 20 70 2d 3e  ndow *pWin = p->
35920 70 57 69 6e 3b 20 20 20 20 20 20 2f 2a 20 4d 61  pWin;      /* Ma
35930 73 74 65 72 20 77 69 6e 64 6f 77 20 6f 62 6a 65  ster window obje
35940 63 74 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  ct (or NULL) */.
35950 20 20 20 20 69 66 28 20 70 57 69 6e 20 29 7b 0a      if( pWin ){.
35960 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e        sqlite3Win
35970 64 6f 77 43 6f 64 65 49 6e 69 74 28 70 50 61 72  dowCodeInit(pPar
35980 73 65 2c 20 70 57 69 6e 29 3b 0a 20 20 20 20 7d  se, pWin);.    }
35990 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
359a0 72 74 28 20 57 48 45 52 45 5f 55 53 45 5f 4c 49  rt( WHERE_USE_LI
359b0 4d 49 54 3d 3d 53 46 5f 46 69 78 65 64 4c 69 6d  MIT==SF_FixedLim
359c0 69 74 20 29 3b 0a 0a 0a 20 20 20 20 2f 2a 20 42  it );...    /* B
359d0 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  egin the databas
359e0 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 53  e scan. */.    S
359f0 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61  ELECTTRACE(1,pPa
35a00 72 73 65 2c 70 2c 28 22 57 68 65 72 65 42 65 67  rse,p,("WhereBeg
35a10 69 6e 5c 6e 22 29 29 3b 0a 20 20 20 20 70 57 49  in\n"));.    pWI
35a20 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
35a30 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
35a40 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
35a50 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  , sSort.pOrderBy
35a60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
35a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a80 20 70 2d 3e 70 45 4c 69 73 74 2c 20 77 63 74 72   p->pEList, wctr
35a90 6c 46 6c 61 67 73 2c 20 70 2d 3e 6e 53 65 6c 65  lFlags, p->nSele
35aa0 63 74 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20  ctRow);.    if( 
35ab0 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
35ac0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
35ad0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
35ae0 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28  eOutputRowCount(
35af0 70 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65  pWInfo) < p->nSe
35b00 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20  lectRow ){.     
35b10 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
35b20 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74   sqlite3WhereOut
35b30 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e  putRowCount(pWIn
35b40 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  fo);.    }.    i
35b50 66 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54  f( sDistinct.isT
35b60 6e 63 74 20 26 26 20 73 71 6c 69 74 65 33 57 68  nct && sqlite3Wh
35b70 65 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57  ereIsDistinct(pW
35b80 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73  Info) ){.      s
35b90 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
35ba0 70 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  pe = sqlite3Wher
35bb0 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e  eIsDistinct(pWIn
35bc0 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  fo);.    }.    i
35bd0 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  f( sSort.pOrderB
35be0 79 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74  y ){.      sSort
35bf0 2e 6e 4f 42 53 61 74 20 3d 20 73 71 6c 69 74 65  .nOBSat = sqlite
35c00 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
35c10 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  pWInfo);.      s
35c20 53 6f 72 74 2e 6c 61 62 65 6c 4f 42 4c 6f 70 74  Sort.labelOBLopt
35c30 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f   = sqlite3WhereO
35c40 72 64 65 72 42 79 4c 69 6d 69 74 4f 70 74 4c 61  rderByLimitOptLa
35c50 62 65 6c 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  bel(pWInfo);.   
35c60 20 20 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42     if( sSort.nOB
35c70 53 61 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65  Sat==sSort.pOrde
35c80 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
35c90 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64        sSort.pOrd
35ca0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
35cb0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
35cc0 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  If sorting index
35cd0 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74 65   that was create
35ce0 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f  d by a prior OP_
35cf0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20  OpenEphemeral . 
35d00 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f     ** instructio
35d10 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62  n ended up not b
35d20 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65  eing needed, the
35d30 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f  n change the OP_
35d40 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20  OpenEphemeral.  
35d50 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f    ** into an OP_
35d60 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Noop..    */.   
35d70 20 69 66 28 20 73 53 6f 72 74 2e 61 64 64 72 53   if( sSort.addrS
35d80 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 73  ortIndex>=0 && s
35d90 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30  Sort.pOrderBy==0
35da0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
35db0 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
35dc0 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53  p(v, sSort.addrS
35dd0 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d  ortIndex);.    }
35de0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ..    assert( p-
35df0 3e 70 45 4c 69 73 74 3d 3d 70 45 4c 69 73 74 20  >pEList==pEList 
35e00 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
35e10 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
35e20 43 0a 20 20 20 20 69 66 28 20 70 57 69 6e 20 29  C.    if( pWin )
35e30 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
35e40 47 6f 73 75 62 20 3d 20 73 71 6c 69 74 65 33 56  Gosub = sqlite3V
35e50 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
35e60 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74  .      int iCont
35e70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
35e80 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
35e90 20 20 69 6e 74 20 69 42 72 65 61 6b 20 3d 20 73    int iBreak = s
35ea0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
35eb0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e  bel(v);.      in
35ec0 74 20 72 65 67 47 6f 73 75 62 20 3d 20 2b 2b 70  t regGosub = ++p
35ed0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20  Parse->nMem;..  
35ee0 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f      sqlite3Windo
35ef0 77 43 6f 64 65 53 74 65 70 28 70 50 61 72 73 65  wCodeStep(pParse
35f00 2c 20 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67  , p, pWInfo, reg
35f10 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62  Gosub, addrGosub
35f20 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
35f30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
35f40 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61  P_Goto, 0, iBrea
35f50 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
35f60 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
35f70 6c 28 76 2c 20 61 64 64 72 47 6f 73 75 62 29 3b  l(v, addrGosub);
35f80 0a 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  .      VdbeNoopC
35f90 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 6e 65  omment((v, "inne
35fa0 72 2d 6c 6f 6f 70 20 73 75 62 72 6f 75 74 69 6e  r-loop subroutin
35fb0 65 22 29 29 3b 0a 20 20 20 20 20 20 73 53 6f 72  e"));.      sSor
35fc0 74 2e 6c 61 62 65 6c 4f 42 4c 6f 70 74 20 3d 20  t.labelOBLopt = 
35fd0 30 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  0;.      selectI
35fe0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
35ff0 20 70 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20   p, -1, &sSort, 
36000 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73  &sDistinct, pDes
36010 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
36020 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
36030 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
36040 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
36050 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
36060 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
36070 2c 20 72 65 67 47 6f 73 75 62 29 3b 0a 20 20 20  , regGosub);.   
36080 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
36090 76 2c 20 22 65 6e 64 20 69 6e 6e 65 72 2d 6c 6f  v, "end inner-lo
360a0 6f 70 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  op subroutine"))
360b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
360c0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
360d0 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
360e0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
360f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
36100 4f 57 46 55 4e 43 20 2a 2f 0a 20 20 20 20 7b 0a  OWFUNC */.    {.
36110 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65        /* Use the
36120 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20   standard inner 
36130 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 20 20 73  loop. */.      s
36140 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
36150 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73  Parse, p, -1, &s
36160 53 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74  Sort, &sDistinct
36170 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , pDest,.       
36180 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43     sqlite3WhereC
36190 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 70 57 49  ontinueLabel(pWI
361a0 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20  nfo),.          
361b0 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
361c0 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b  kLabel(pWInfo));
361d0 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 74  ..      /* End t
361e0 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
361f0 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a   loop..      */.
36200 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
36210 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
36220 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
36230 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 77    /* This case w
36240 68 65 6e 20 74 68 65 72 65 20 65 78 69 73 74 20  hen there exist 
36250 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
36260 6f 6e 73 20 6f 72 20 61 20 47 52 4f 55 50 20 42  ons or a GROUP B
36270 59 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20  Y clause.    ** 
36280 6f 72 20 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e  or both */.    N
36290 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20  ameContext sNC; 
362a0 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65     /* Name conte
362b0 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  xt for processin
362c0 67 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f  g aggregate info
362d0 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  rmation */.    i
362e0 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20  nt iAMem;       
362f0 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
36300 61 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72  address for stor
36310 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55  ing current GROU
36320 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20  P BY */.    int 
36330 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  iBMem;          
36340 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64  /* First Mem add
36350 72 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75  ress for previou
36360 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20  s GROUP BY */.  
36370 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20    int iUseFlag; 
36380 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64        /* Mem add
36390 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61  ress holding fla
363a0 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  g indicating tha
363b0 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20  t at least.     
363c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
363d0 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66     ** one row of
363e0 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68   the input to th
363f0 65 20 61 67 67 72 65 67 61 74 6f 72 20 68 61 73  e aggregator has
36400 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20   been.          
36410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
36420 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
36430 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67    int iAbortFlag
36440 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64  ;     /* Mem add
36450 72 65 73 73 20 77 68 69 63 68 20 63 61 75 73 65  ress which cause
36460 73 20 71 75 65 72 79 20 61 62 6f 72 74 20 69 66  s query abort if
36470 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20   positive */.   
36480 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74   int groupBySort
36490 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d  ;    /* Rows com
364a0 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e  e from source in
364b0 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20   GROUP BY order 
364c0 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45  */.    int addrE
364d0 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e  nd;        /* En
364e0 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20  d of processing 
364f0 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20  for this SELECT 
36500 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 50  */.    int sortP
36510 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73  Tab = 0;   /* Ps
36520 65 75 64 6f 74 61 62 6c 65 20 75 73 65 64 20 74  eudotable used t
36530 6f 20 64 65 63 6f 64 65 20 73 6f 72 74 69 6e 67  o decode sorting
36540 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20   results */.    
36550 69 6e 74 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b  int sortOut = 0;
36560 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 72 65      /* Output re
36570 67 69 73 74 65 72 20 66 72 6f 6d 20 74 68 65 20  gister from the 
36580 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  sorter */.    in
36590 74 20 6f 72 64 65 72 42 79 47 72 70 20 3d 20 30  t orderByGrp = 0
365a0 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65  ; /* True if the
365b0 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 4f 52   GROUP BY and OR
365c0 44 45 52 20 42 59 20 61 72 65 20 74 68 65 20 73  DER BY are the s
365d0 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  ame */..    /* R
365e0 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c  emove any and al
365f0 6c 20 61 6c 69 61 73 65 73 20 62 65 74 77 65 65  l aliases betwee
36600 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
36610 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
36620 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
36630 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
36640 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
36650 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20    int k;        
36660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36670 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
36680 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
36690 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
366a0 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f  Item;  /* For lo
366b0 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65  oping over expre
366c0 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20  ssion in a list 
366d0 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  */..      for(k=
366e0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
366f0 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73  , pItem=p->pELis
36700 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20  t->a; k>0; k--, 
36710 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
36720 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c    pItem->u.x.iAl
36730 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ias = 0;.      }
36740 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72  .      for(k=pGr
36750 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49  oupBy->nExpr, pI
36760 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b  tem=pGroupBy->a;
36770 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d   k>0; k--, pItem
36780 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  ++){.        pIt
36790 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d  em->u.x.iAlias =
367a0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
367b0 20 20 61 73 73 65 72 74 28 20 36 36 3d 3d 73 71    assert( 66==sq
367c0 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29  lite3LogEst(100)
367d0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
367e0 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 36 36 20 29  >nSelectRow>66 )
367f0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
36800 20 36 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   66;.    }else{.
36810 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d        assert( 0=
36820 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
36830 29 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53  ) );.      p->nS
36840 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20  electRow = 0;.  
36850 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
36860 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 20 47  here is both a G
36870 52 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f  ROUP BY and an O
36880 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
36890 6e 64 20 74 68 65 79 20 61 72 65 0a 20 20 20 20  nd they are.    
368a0 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68  ** identical, th
368b0 65 6e 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73  en it may be pos
368c0 73 69 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65  sible to disable
368d0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
368e0 61 75 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20  ause .    ** on 
368f0 74 68 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74  the grounds that
36900 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 77 69   the GROUP BY wi
36910 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74  ll cause element
36920 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20  s to come out . 
36930 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72     ** in the cor
36940 72 65 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61  rect order. It a
36950 6c 73 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68  lso may not - th
36960 65 20 47 52 4f 55 50 20 42 59 20 6d 69 67 68 74  e GROUP BY might
36970 20 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 64 61   use a.    ** da
36980 74 61 62 61 73 65 20 69 6e 64 65 78 20 74 68 61  tabase index tha
36990 74 20 63 61 75 73 65 73 20 72 6f 77 73 20 74 6f  t causes rows to
369a0 20 62 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65   be grouped toge
369b0 74 68 65 72 20 61 73 20 72 65 71 75 69 72 65 64  ther as required
369c0 0a 20 20 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20  .    ** but not 
369d0 61 63 74 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e  actually sorted.
369e0 20 45 69 74 68 65 72 20 77 61 79 2c 20 72 65 63   Either way, rec
369f0 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
36a00 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44  t the.    ** ORD
36a10 45 52 20 42 59 20 61 6e 64 20 47 52 4f 55 50 20  ER BY and GROUP 
36a20 42 59 20 63 6c 61 75 73 65 73 20 61 72 65 20 74  BY clauses are t
36a30 68 65 20 73 61 6d 65 20 62 79 20 73 65 74 74 69  he same by setti
36a40 6e 67 20 74 68 65 20 6f 72 64 65 72 42 79 47 72  ng the orderByGr
36a50 70 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  p.    ** variabl
36a60 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  e.  */.    if( s
36a70 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
36a80 6d 70 61 72 65 28 70 47 72 6f 75 70 42 79 2c 20  mpare(pGroupBy, 
36a90 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20  sSort.pOrderBy, 
36aa0 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1)==0 ){.      
36ab0 6f 72 64 65 72 42 79 47 72 70 20 3d 20 31 3b 0a  orderByGrp = 1;.
36ac0 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43      }. .    /* C
36ad0 72 65 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f  reate a label to
36ae0 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65   jump to when we
36af0 20 77 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74   want to abort t
36b00 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  he query */.    
36b10 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65  addrEnd = sqlite
36b20 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
36b30 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65  );..    /* Conve
36b40 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64  rt TK_COLUMN nod
36b50 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43  es into TK_AGG_C
36b60 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65  OLUMN and make e
36b70 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a  ntries in.    **
36b80 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c   sAggInfo for al
36b90 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  l TK_AGG_FUNCTIO
36ba0 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65  N nodes in expre
36bb0 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20  ssions of the.  
36bc0 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
36bd0 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ement..    */.  
36be0 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
36bf0 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
36c00 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
36c10 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43   pParse;.    sNC
36c20 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62  .pSrcList = pTab
36c30 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 75 4e  List;.    sNC.uN
36c40 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41  C.pAggInfo = &sA
36c50 67 67 49 6e 66 6f 3b 0a 20 20 20 20 56 56 41 5f  ggInfo;.    VVA_
36c60 4f 4e 4c 59 28 20 73 4e 43 2e 6e 63 46 6c 61 67  ONLY( sNC.ncFlag
36c70 73 20 3d 20 4e 43 5f 55 41 67 67 49 6e 66 6f 3b  s = NC_UAggInfo;
36c80 20 29 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e   ).    sAggInfo.
36c90 6d 6e 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e  mnReg = pParse->
36ca0 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67  nMem+1;.    sAgg
36cb0 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
36cc0 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f  umn = pGroupBy ?
36cd0 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
36ce0 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e   : 0;.    sAggIn
36cf0 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  fo.pGroupBy = pG
36d00 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69  roupBy;.    sqli
36d10 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
36d20 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69  gList(&sNC, pELi
36d30 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
36d40 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
36d50 73 74 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70  st(&sNC, sSort.p
36d60 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66  OrderBy);.    if
36d70 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ( pHaving ){.   
36d80 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
36d90 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
36da0 74 28 20 70 57 68 65 72 65 3d 3d 70 2d 3e 70 57  t( pWhere==p->pW
36db0 68 65 72 65 20 29 3b 0a 20 20 20 20 20 20 20 20  here );.        
36dc0 61 73 73 65 72 74 28 20 70 48 61 76 69 6e 67 3d  assert( pHaving=
36dd0 3d 70 2d 3e 70 48 61 76 69 6e 67 20 29 3b 0a 20  =p->pHaving );. 
36de0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
36df0 47 72 6f 75 70 42 79 3d 3d 70 2d 3e 70 47 72 6f  GroupBy==p->pGro
36e00 75 70 42 79 20 29 3b 0a 20 20 20 20 20 20 20 20  upBy );.        
36e10 68 61 76 69 6e 67 54 6f 57 68 65 72 65 28 70 50  havingToWhere(pP
36e20 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
36e30 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57    pWhere = p->pW
36e40 68 65 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  here;.      }.  
36e50 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
36e60 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
36e70 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b  (&sNC, pHaving);
36e80 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49  .    }.    sAggI
36e90 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  nfo.nAccumulator
36ea0 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   = sAggInfo.nCol
36eb0 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  umn;.    if( p->
36ec0 70 47 72 6f 75 70 42 79 3d 3d 30 20 26 26 20 70  pGroupBy==0 && p
36ed0 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 26 26 20  ->pHaving==0 && 
36ee0 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3d 3d  sAggInfo.nFunc==
36ef0 31 20 29 7b 0a 20 20 20 20 20 20 6d 69 6e 4d 61  1 ){.      minMa
36f00 78 46 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75  xFlag = minMaxQu
36f10 65 72 79 28 64 62 2c 20 73 41 67 67 49 6e 66 6f  ery(db, sAggInfo
36f20 2e 61 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 2c  .aFunc[0].pExpr,
36f30 20 26 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79   &pMinMaxOrderBy
36f40 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
36f50 20 20 20 20 6d 69 6e 4d 61 78 46 6c 61 67 20 3d      minMaxFlag =
36f60 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
36f70 4f 52 4d 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20  ORMAL;.    }.   
36f80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
36f90 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29  Info.nFunc; i++)
36fa0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
36fb0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
36fc0 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b  (sAggInfo.aFunc[
36fd0 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73  i].pExpr, EP_xIs
36fe0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
36ff0 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20   sNC.ncFlags |= 
37000 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20  NC_InAggFunc;.  
37010 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
37020 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
37030 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  NC, sAggInfo.aFu
37040 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70  nc[i].pExpr->x.p
37050 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 4e 43  List);.      sNC
37060 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f  .ncFlags &= ~NC_
37070 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d  InAggFunc;.    }
37080 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 78  .    sAggInfo.mx
37090 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Reg = pParse->nM
370a0 65 6d 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  em;.    if( db->
370b0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
370c0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
370d0 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
370e0 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20  ENABLED.    if( 
370f0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
37100 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20  ce & 0x400 ){.  
37110 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
37120 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
37130 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41  400,pParse,p,("A
37140 66 74 65 72 20 61 67 67 72 65 67 61 74 65 20 61  fter aggregate a
37150 6e 61 6c 79 73 69 73 3a 5c 6e 22 29 29 3b 0a 20  nalysis:\n"));. 
37160 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
37170 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
37180 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   0);.      for(i
37190 69 3d 30 3b 20 69 69 3c 73 41 67 67 49 6e 66 6f  i=0; ii<sAggInfo
371a0 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b  .nColumn; ii++){
371b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
371c0 44 65 62 75 67 50 72 69 6e 74 66 28 22 61 67 67  DebugPrintf("agg
371d0 2d 63 6f 6c 75 6d 6e 5b 25 64 5d 20 69 4d 65 6d  -column[%d] iMem
371e0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
371f0 20 20 20 20 69 69 2c 20 73 41 67 67 49 6e 66 6f      ii, sAggInfo
37200 2e 61 43 6f 6c 5b 69 69 5d 2e 69 4d 65 6d 29 3b  .aCol[ii].iMem);
37210 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
37220 54 72 65 65 56 69 65 77 45 78 70 72 28 30 2c 20  TreeViewExpr(0, 
37230 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 69  sAggInfo.aCol[ii
37240 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ].pExpr, 0);.   
37250 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
37260 69 3d 30 3b 20 69 69 3c 73 41 67 67 49 6e 66 6f  i=0; ii<sAggInfo
37270 2e 6e 46 75 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20  .nFunc; ii++){. 
37280 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
37290 62 75 67 50 72 69 6e 74 66 28 22 61 67 67 2d 66  bugPrintf("agg-f
372a0 75 6e 63 5b 25 64 5d 3a 20 69 4d 65 6d 3d 25 64  unc[%d]: iMem=%d
372b0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
372c0 20 69 69 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46   ii, sAggInfo.aF
372d0 75 6e 63 5b 69 69 5d 2e 69 4d 65 6d 29 3b 0a 20  unc[ii].iMem);. 
372e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72         sqlite3Tr
372f0 65 65 56 69 65 77 45 78 70 72 28 30 2c 20 73 41  eeViewExpr(0, sA
37300 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 69 5d  ggInfo.aFunc[ii]
37310 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  .pExpr, 0);.    
37320 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
37330 0a 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73  ...    /* Proces
37340 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61  sing for aggrega
37350 74 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42  tes with GROUP B
37360 59 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72  Y is very differ
37370 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d  ent and.    ** m
37380 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78  uch more complex
37390 20 74 68 61 6e 20 61 67 67 72 65 67 61 74 65 73   than aggregates
373a0 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50   without a GROUP
373b0 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   BY..    */.    
373c0 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
373d0 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
373e0 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79  KeyInfo;  /* Key
373f0 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
37400 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62 79  for the group by
37410 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
37420 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20   int addr1;     
37430 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63       /* A-vs-B c
37440 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20  omparision jump 
37450 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
37460 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20  rOutputRow;  /* 
37470 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74  Start of subrout
37480 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
37490 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f   a result row */
374a0 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75  .      int regOu
374b0 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65  tputRow;   /* Re
374c0 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
374d0 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74  ister for output
374e0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
374f0 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 65 74       int addrSet
37500 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20  Abort;   /* Set 
37510 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61  the abort flag a
37520 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20  nd return */.   
37530 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66     int addrTopOf
37540 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66  Loop;  /* Top of
37550 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20   the input loop 
37560 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
37570 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20  rSortingIdx; /* 
37580 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  The OP_OpenEphem
37590 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72  eral for the sor
375a0 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ting index */.  
375b0 20 20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65      int addrRese
375c0 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f  t;      /* Subro
375d0 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74  utine for resett
375e0 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ing the accumula
375f0 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tor */.      int
37600 20 72 65 67 52 65 73 65 74 3b 20 20 20 20 20 20   regReset;      
37610 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65   /* Return addre
37620 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
37630 72 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65  reset subroutine
37640 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   */..      /* If
37650 20 74 68 65 72 65 20 69 73 20 61 20 47 52 4f 55   there is a GROU
37660 50 20 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d  P BY clause we m
37670 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74  ight need a sort
37680 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20  ing index to.   
37690 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20     ** implement 
376a0 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68  it.  Allocate th
376b0 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  at sorting index
376c0 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72   now.  If it tur
376d0 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20  ns out.      ** 
376e0 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e  that we do not n
376f0 65 65 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c  eed it after all
37700 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f  , the OP_SorterO
37710 70 65 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  pen instruction.
37720 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65        ** will be
37730 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
37740 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20  a Noop.  .      
37750 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66  */.      sAggInf
37760 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70  o.sortingIdx = p
37770 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
37780 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
37790 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72  sqlite3KeyInfoFr
377a0 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
377b0 65 2c 70 47 72 6f 75 70 42 79 2c 30 2c 73 41 67  e,pGroupBy,0,sAg
377c0 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a  gInfo.nColumn);.
377d0 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e        addrSortin
377e0 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64  gIdx = sqlite3Vd
377f0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
37800 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20  orterOpen, .    
37810 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
37820 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49  ortingIdx, sAggI
37830 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
37840 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30  mn, .          0
37850 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66  , (char*)pKeyInf
37860 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
37870 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  .      /* Initia
37880 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  lize memory loca
37890 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52  tions used by GR
378a0 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65  OUP BY aggregate
378b0 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20   processing.    
378c0 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46    */.      iUseF
378d0 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lag = ++pParse->
378e0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f  nMem;.      iAbo
378f0 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73  rtFlag = ++pPars
37900 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72  e->nMem;.      r
37910 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b  egOutputRow = ++
37920 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
37930 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
37940 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  w = sqlite3VdbeM
37950 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
37960 20 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b     regReset = ++
37970 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
37980 20 20 20 20 61 64 64 72 52 65 73 65 74 20 3d 20      addrReset = 
37990 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
379a0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
379b0 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  AMem = pParse->n
379c0 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  Mem + 1;.      p
379d0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
379e0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
379f0 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50        iBMem = pP
37a00 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
37a10 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
37a20 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
37a30 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  nExpr;.      sql
37a40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
37a50 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
37a60 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20   iAbortFlag);.  
37a70 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
37a80 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74  (v, "clear abort
37a90 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
37aa0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
37ab0 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  3(v, OP_Null, 0,
37ac0 20 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47   iAMem, iAMem+pG
37ad0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29  roupBy->nExpr-1)
37ae0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;..      /* Begi
37af0 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69  n a loop that wi
37b00 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73  ll extract all s
37b10 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52  ource rows in GR
37b20 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20  OUP BY order..  
37b30 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
37b40 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65  t involve two se
37b50 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74  parate loops wit
37b60 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20  h an OP_Sort in 
37b70 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20  between, or.    
37b80 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65    ** it might be
37b90 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74   a single loop t
37ba0 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65  hat uses an inde
37bb0 78 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66  x to extract inf
37bc0 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  ormation.      *
37bd0 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f  * in the right o
37be0 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69  rder to begin wi
37bf0 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  th..      */.   
37c00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
37c10 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
37c20 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72  , regReset, addr
37c30 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 53 45  Reset);.      SE
37c40 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72  LECTTRACE(1,pPar
37c50 73 65 2c 70 2c 28 22 57 68 65 72 65 42 65 67 69  se,p,("WhereBegi
37c60 6e 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 70 57  n\n"));.      pW
37c70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
37c80 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
37c90 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
37ca0 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 0a  e, pGroupBy, 0,.
37cb0 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
37cc0 47 52 4f 55 50 42 59 20 7c 20 28 6f 72 64 65 72  GROUPBY | (order
37cd0 42 79 47 72 70 20 3f 20 57 48 45 52 45 5f 53 4f  ByGrp ? WHERE_SO
37ce0 52 54 42 59 47 52 4f 55 50 20 3a 20 30 29 2c 20  RTBYGROUP : 0), 
37cf0 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  0.      );.     
37d00 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
37d10 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
37d20 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
37d30 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65  te3WhereIsOrdere
37d40 64 28 70 57 49 6e 66 6f 29 3d 3d 70 47 72 6f 75  d(pWInfo)==pGrou
37d50 70 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  pBy->nExpr ){.  
37d60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74        /* The opt
37d70 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74  imizer is able t
37d80 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69  o deliver rows i
37d90 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72  n group by order
37da0 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   so.        ** w
37db0 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  e do not have to
37dc0 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f   sort.  The OP_O
37dd0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62  penEphemeral tab
37de0 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  le will be.     
37df0 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20     ** cancelled 
37e00 6c 61 74 65 72 20 62 65 63 61 75 73 65 20 77 65  later because we
37e10 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75   still need to u
37e20 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a  se the pKeyInfo.
37e30 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
37e40 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d     groupBySort =
37e50 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
37e60 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73  .        /* Rows
37e70 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20   are coming out 
37e80 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20  in undetermined 
37e90 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76 65 20  order.  We have 
37ea0 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20 20  to push.        
37eb0 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f  ** each row into
37ec0 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
37ed0 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  , terminate the 
37ee0 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20  first loop,.    
37ef0 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70      ** then loop
37f00 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e   over the sortin
37f10 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72  g index in order
37f20 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70   to get the outp
37f30 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  ut.        ** in
37f40 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20   sorted order.  
37f50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
37f60 20 69 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20   int regBase;.  
37f70 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63        int regRec
37f80 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ord;.        int
37f90 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69   nCol;.        i
37fa0 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20  nt nGroupBy;..  
37fb0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d        explainTem
37fc0 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 0a  pTable(pParse, .
37fd0 20 20 20 20 20 20 20 20 20 20 20 20 28 73 44 69              (sDi
37fe0 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26  stinct.isTnct &&
37ff0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46   (p->selFlags&SF
38000 5f 44 69 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f  _Distinct)==0) ?
38010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
38020 20 20 20 20 20 22 44 49 53 54 49 4e 43 54 22 20       "DISTINCT" 
38030 3a 20 22 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a  : "GROUP BY");..
38040 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53          groupByS
38050 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ort = 1;.       
38060 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f   nGroupBy = pGro
38070 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
38080 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f       nCol = nGro
38090 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 6a 20  upBy;.        j 
380a0 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  = nGroupBy;.    
380b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
380c0 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
380d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
380e0 20 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43   if( sAggInfo.aC
380f0 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c  ol[i].iSorterCol
38100 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20  umn>=j ){.      
38110 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20        nCol++;.  
38120 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
38130 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
38140 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67     }.        reg
38150 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65  Base = sqlite3Ge
38160 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
38170 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, nCol);.      
38180 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
38190 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
381a0 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42  , pGroupBy, regB
381b0 61 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ase, 0, 0);.    
381c0 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79      j = nGroupBy
381d0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
381e0 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
381f0 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
38200 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
38210 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20  gInfo_col *pCol 
38220 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  = &sAggInfo.aCol
38230 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [i];.          i
38240 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72  f( pCol->iSorter
38250 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20  Column>=j ){.   
38260 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20           int r1 
38270 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20  = j + regBase;. 
38280 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
38290 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
382a0 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 0a 20 20  umnOfTable(v,.  
382b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
382c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
382d0 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69  l->pTab, pCol->i
382e0 54 61 62 6c 65 2c 20 70 43 6f 6c 2d 3e 69 43 6f  Table, pCol->iCo
382f0 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20  lumn, r1);.     
38300 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
38310 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
38320 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52 65 63  }.        regRec
38330 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ord = sqlite3Get
38340 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
38350 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
38360 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
38370 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _M