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

Artifact e1cad752987c476a9d1d053682558caec048ea799ef7ba1b6e38e2266451010d:


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 46 61  nt>3 ) sqlite3Fa
119e0 73 74 52 61 6e 64 6f 6d 6e 65 73 73 28 26 64 62  stRandomness(&db
119f0 2d 3e 73 50 72 6e 67 2c 20 73 69 7a 65 6f 66 28  ->sPrng, sizeof(
11a00 63 6e 74 29 2c 20 26 63 6e 74 29 3b 0a 20 20 20  cnt), &cnt);.   
11a10 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61   }.    pCol->zNa
11a20 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20  me = zName;.    
11a30 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f  sqlite3ColumnPro
11a40 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28  pertiesFromName(
11a50 30 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 69 66  0, pCol);.    if
11a60 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69 74  ( zName && sqlit
11a70 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 68 74  e3HashInsert(&ht
11a80 2c 20 7a 4e 61 6d 65 2c 20 70 43 6f 6c 29 3d 3d  , zName, pCol)==
11a90 70 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  pCol ){.      sq
11aa0 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
11ab0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
11ac0 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28  qlite3HashClear(
11ad0 26 68 74 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  &ht);.  if( db->
11ae0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
11af0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69      for(j=0; j<i
11b00 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; j++){.      sq
11b10 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
11b20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a  aCol[j].zName);.
11b30 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
11b40 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c  3DbFree(db, aCol
11b50 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d 20  );.    *paCol = 
11b60 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20  0;.    *pnCol = 
11b70 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
11b80 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
11b90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
11ba0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
11bb0 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64 20 63  * Add type and c
11bc0 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61  ollation informa
11bd0 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d 6e  tion to a column
11be0 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a 2a   list based on.*
11bf0 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  * a SELECT state
11c00 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65  ment..** .** The
11c10 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72 65   column list pre
11c20 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72 6f  sumably came fro
11c30 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61  m selectColumnNa
11c40 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mesFromExprList(
11c50 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e  )..** The column
11c60 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20 6e   list has only n
11c70 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73 20  ames, not types 
11c80 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20  or collations.  
11c90 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
11ca0 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e 64  goes through and
11cb0 20 61 64 64 73 20 74 68 65 20 74 79 70 65 73 20   adds the types 
11cc0 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a  and collations..
11cd0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
11ce0 6e 65 20 72 65 71 75 69 72 65 73 20 74 68 61 74  ne requires that
11cf0 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72 73   all identifiers
11d00 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a 2a   in the SELECT.*
11d10 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20 72  * statement be r
11d20 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64  esolved..*/.void
11d30 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
11d40 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
11d50 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73 65  llation(.  Parse
11d60 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
11d70 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
11d80 65 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65 20  exts */.  Table 
11d90 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
11da0 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74 79  /* Add column ty
11db0 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  pe information t
11dc0 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  o this table */.
11dd0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
11de0 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43  t       /* SELEC
11df0 54 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  T used to determ
11e00 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f  ine types and co
11e10 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  llations */.){. 
11e20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
11e30 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d  Parse->db;.  Nam
11e40 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
11e50 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
11e60 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
11e70 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20    int i;.  Expr 
11e80 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  *p;.  struct Exp
11e90 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 0a  rList_item *a;..
11ea0 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65 63    assert( pSelec
11eb0 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
11ec0 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46  ( (pSelect->selF
11ed0 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76  lags & SF_Resolv
11ee0 65 64 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ed)!=0 );.  asse
11ef0 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d  rt( pTab->nCol==
11f00 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
11f10 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61  >nExpr || db->ma
11f20 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
11f30 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
11f40 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
11f50 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
11f60 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
11f70 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
11f80 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20  pSelect->pSrc;. 
11f90 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45   a = pSelect->pE
11fa0 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28 69  List->a;.  for(i
11fb0 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61  =0, pCol=pTab->a
11fc0 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  Col; i<pTab->nCo
11fd0 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
11fe0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
11ff0 2a 7a 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20  *zType;.    int 
12000 6e 2c 20 6d 3b 0a 20 20 20 20 70 20 3d 20 61 5b  n, m;.    p = a[
12010 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7a 54  i].pExpr;.    zT
12020 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
12030 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20  (&sNC, p, 0, 0, 
12040 30 29 3b 0a 20 20 20 20 2f 2a 20 70 43 6f 6c 2d  0);.    /* pCol-
12050 3e 73 7a 45 73 74 20 3d 20 2e 2e 2e 20 2f 2f 20  >szEst = ... // 
12060 43 6f 6c 75 6d 6e 20 73 69 7a 65 20 65 73 74 20  Column size est 
12070 66 6f 72 20 53 45 4c 45 43 54 20 74 61 62 6c 65  for SELECT table
12080 73 20 6e 65 76 65 72 20 75 73 65 64 20 2a 2f 0a  s never used */.
12090 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69      pCol->affini
120a0 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
120b0 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20  Affinity(p);.   
120c0 20 69 66 28 20 7a 54 79 70 65 20 29 7b 0a 20 20   if( zType ){.  
120d0 20 20 20 20 6d 20 3d 20 73 71 6c 69 74 65 33 53      m = sqlite3S
120e0 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a  trlen30(zType);.
120f0 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65        n = sqlite
12100 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 2d 3e  3Strlen30(pCol->
12110 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 43  zName);.      pC
12120 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ol->zName = sqli
12130 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
12140 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  ee(db, pCol->zNa
12150 6d 65 2c 20 6e 2b 6d 2b 32 29 3b 0a 20 20 20 20  me, n+m+2);.    
12160 20 20 69 66 28 20 70 43 6f 6c 2d 3e 7a 4e 61 6d    if( pCol->zNam
12170 65 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  e ){.        mem
12180 63 70 79 28 26 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  cpy(&pCol->zName
12190 5b 6e 2b 31 5d 2c 20 7a 54 79 70 65 2c 20 6d 2b  [n+1], zType, m+
121a0 31 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  1);.        pCol
121b0 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f  ->colFlags |= CO
121c0 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a 20  LFLAG_HASTYPE;. 
121d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
121e0 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e   if( pCol->affin
121f0 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e 61  ity==0 ) pCol->a
12200 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
12210 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 70  _AFF_BLOB;.    p
12220 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
12230 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
12240 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , p);.    if( pC
12250 6f 6c 6c 20 26 26 20 70 43 6f 6c 2d 3e 7a 43 6f  oll && pCol->zCo
12260 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ll==0 ){.      p
12270 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c  Col->zColl = sql
12280 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
12290 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
122a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62      }.  }.  pTab
122b0 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 31 3b 20  ->szTabRow = 1; 
122c0 2f 2a 20 41 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20  /* Any non-zero 
122d0 76 61 6c 75 65 20 77 6f 72 6b 73 20 2a 2f 0a 7d  value works */.}
122e0 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
122f0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
12300 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54 61 62  , generate a Tab
12310 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
12320 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74  t describes.** t
12330 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
12340 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f   that SELECT..*/
12350 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52  .Table *sqlite3R
12360 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
12370 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
12380 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
12390 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
123a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
123b0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
123c0 6e 74 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a  nt savedFlags;..
123d0 20 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20 64    savedFlags = d
123e0 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e  b->flags;.  db->
123f0 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
12400 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20  _FullColNames;. 
12410 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
12420 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
12430 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  es;.  sqlite3Sel
12440 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20  ectPrep(pParse, 
12450 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69  pSelect, 0);.  i
12460 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
12470 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68  ) return 0;.  wh
12480 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50  ile( pSelect->pP
12490 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d  rior ) pSelect =
124a0 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
124b0 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20  ;.  db->flags = 
124c0 73 61 76 65 64 46 6c 61 67 73 3b 0a 20 20 70 54  savedFlags;.  pT
124d0 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ab = sqlite3DbMa
124e0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
124f0 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20  eof(Table) );.  
12500 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
12510 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
12520 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74 65  .  /* The sqlite
12530 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
12540 63 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73 65  ct() is only use
12550 64 20 6e 20 63 6f 6e 74 65 78 74 73 20 77 68 65  d n contexts whe
12560 72 65 20 6c 6f 6f 6b 61 73 69 64 65 0a 20 20 2a  re lookaside.  *
12570 2a 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  * is disabled */
12580 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c  .  assert( db->l
12590 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c  ookaside.bDisabl
125a0 65 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 54 61  e );.  pTab->nTa
125b0 62 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62  bRef = 1;.  pTab
125c0 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70  ->zName = 0;.  p
125d0 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
125e0 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32  = 200; assert( 2
125f0 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  00==sqlite3LogEs
12600 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20  t(1048576) );.  
12610 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72  sqlite3ColumnsFr
12620 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
12630 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  e, pSelect->pELi
12640 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c  st, &pTab->nCol,
12650 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20   &pTab->aCol);. 
12660 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
12670 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
12680 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
12690 70 54 61 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  pTab, pSelect);.
126a0 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
126b0 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  -1;.  if( db->ma
126c0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
126d0 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
126e0 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a  able(db, pTab);.
126f0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
12700 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  }.  return pTab;
12710 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
12720 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76  VDBE for the giv
12730 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  en parser contex
12740 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
12750 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
12760 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  y..** If an erro
12770 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
12780 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20   NULL and leave 
12790 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  a message in pPa
127a0 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71  rse..*/.Vdbe *sq
127b0 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72  lite3GetVdbe(Par
127c0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
127d0 66 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  f( pParse->pVdbe
127e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
127f0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
12800 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
12810 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20 20 20  pToplevel==0.   
12820 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
12830 6e 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64  nabled(pParse->d
12840 62 2c 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f  b,SQLITE_FactorO
12850 75 74 43 6f 6e 73 74 29 0a 20 20 29 7b 0a 20 20  utConst).  ){.  
12860 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73    pParse->okCons
12870 74 46 61 63 74 6f 72 20 3d 20 31 3b 0a 20 20 7d  tFactor = 1;.  }
12880 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
12890 33 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72  3VdbeCreate(pPar
128a0 73 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  se);.}.../*.** C
128b0 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69  ompute the iLimi
128c0 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69  t and iOffset fi
128d0 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45  elds of the SELE
128e0 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a  CT based on the.
128f0 2a 2a 20 70 4c 69 6d 69 74 20 65 78 70 72 65 73  ** pLimit expres
12900 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 2d 3e  sions.  pLimit->
12910 70 4c 65 66 74 20 61 6e 64 20 70 4c 69 6d 69 74  pLeft and pLimit
12920 2d 3e 70 52 69 67 68 74 20 68 6f 6c 64 20 74 68  ->pRight hold th
12930 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  e expressions.**
12940 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20   that appear in 
12950 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
12960 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72   statement after
12970 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
12980 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64  FFSET.** keyword
12990 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74  s.  Or NULL if t
129a0 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72  hose keywords ar
129b0 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69  e omitted. iLimi
129c0 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a  t and iOffset .*
129d0 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65  * are the intege
129e0 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  r memory registe
129f0 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f  r numbers for co
12a00 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63  unters used to c
12a10 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c  ompute .** the l
12a20 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e  imit and offset.
12a30 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
12a40 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66   limit and/or of
12a50 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69  fset, then .** i
12a60 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
12a70 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a  t are negative..
12a80 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
12a90 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76  ne changes the v
12aa0 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20  alues of iLimit 
12ab0 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79  and iOffset only
12ac0 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f   if.** a limit o
12ad0 72 20 6f 66 66 73 65 74 20 69 73 20 64 65 66 69  r offset is defi
12ae0 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 2d 3e 70  ned by pLimit->p
12af0 4c 65 66 74 20 61 6e 64 20 70 4c 69 6d 69 74 2d  Left and pLimit-
12b00 3e 70 52 69 67 68 74 2e 20 20 69 4c 69 6d 69 74  >pRight.  iLimit
12b10 0a 2a 2a 20 61 6e 64 20 69 4f 66 66 73 65 74 20  .** and iOffset 
12b20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
12b30 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f   preset to appro
12b40 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20 76  priate default v
12b50 61 6c 75 65 73 20 28 7a 65 72 6f 29 0a 2a 2a 20  alues (zero).** 
12b60 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
12b70 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
12b80 2a 0a 2a 2a 20 54 68 65 20 69 4f 66 66 73 65 74  *.** The iOffset
12b90 20 72 65 67 69 73 74 65 72 20 28 69 66 20 69 74   register (if it
12ba0 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 69 74   exists) is init
12bb0 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76  ialized to the v
12bc0 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 4f  alue.** of the O
12bd0 46 46 53 45 54 2e 20 20 54 68 65 20 69 4c 69 6d  FFSET.  The iLim
12be0 69 74 20 72 65 67 69 73 74 65 72 20 69 73 20 69  it register is i
12bf0 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49  nitialized to LI
12c00 4d 49 54 2e 20 20 52 65 67 69 73 74 65 72 0a 2a  MIT.  Register.*
12c10 2a 20 69 4f 66 66 73 65 74 2b 31 20 69 73 20 69  * iOffset+1 is i
12c20 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49  nitialized to LI
12c30 4d 49 54 2b 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a  MIT+OFFSET..**.*
12c40 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74  * Only if pLimit
12c50 2d 3e 70 4c 65 66 74 21 3d 30 20 64 6f 20 74 68  ->pLeft!=0 do th
12c60 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72  e limit register
12c70 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e  s get.** redefin
12c80 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41  ed.  The UNION A
12c90 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73  LL operator uses
12ca0 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 20 74   this property t
12cb0 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72  o force.** the r
12cc0 65 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65  euse of the same
12cd0 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65   limit and offse
12ce0 74 20 72 65 67 69 73 74 65 72 73 20 61 63 72 6f  t registers acro
12cf0 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53  ss multiple.** S
12d00 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
12d10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12d20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
12d30 69 73 74 65 72 73 28 50 61 72 73 65 20 2a 70 50  isters(Parse *pP
12d40 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
12d50 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20   int iBreak){.  
12d60 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69  Vdbe *v = 0;.  i
12d70 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  nt iLimit = 0;. 
12d80 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20   int iOffset;.  
12d90 69 6e 74 20 6e 3b 0a 20 20 45 78 70 72 20 2a 70  int n;.  Expr *p
12da0 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
12db0 74 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69  t;..  if( p->iLi
12dc0 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  mit ) return;.. 
12dd0 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54   /* .  ** "LIMIT
12de0 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77   -1" always show
12df0 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65  s all rows.  The
12e00 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20  re is some.  ** 
12e10 63 6f 6e 74 72 6f 76 65 72 73 79 20 61 62 6f 75  controversy abou
12e20 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65  t what the corre
12e30 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75  ct behavior shou
12e40 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20  ld be..  ** The 
12e50 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
12e60 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74  tation interpret
12e70 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d  s "LIMIT 0" to m
12e80 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73  ean.  ** no rows
12e90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69  ..  */.  if( pLi
12ea0 6d 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  mit ){.    asser
12eb0 74 28 20 70 4c 69 6d 69 74 2d 3e 6f 70 3d 3d 54  t( pLimit->op==T
12ec0 4b 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 61  K_LIMIT );.    a
12ed0 73 73 65 72 74 28 20 70 4c 69 6d 69 74 2d 3e 70  ssert( pLimit->p
12ee0 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 70  Left!=0 );.    p
12ef0 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69  ->iLimit = iLimi
12f00 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
12f10 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  em;.    v = sqli
12f20 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
12f30 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
12f40 76 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  v!=0 );.    if( 
12f50 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
12f60 65 67 65 72 28 70 4c 69 6d 69 74 2d 3e 70 4c 65  eger(pLimit->pLe
12f70 66 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20  ft, &n) ){.     
12f80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12f90 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
12fa0 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  , n, iLimit);.  
12fb0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
12fc0 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74  (v, "LIMIT count
12fd0 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28  er"));.      if(
12fe0 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   n==0 ){.       
12ff0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
13000 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
13010 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e 3d     }else if( n>=
13020 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52  0 && p->nSelectR
13030 6f 77 3e 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  ow>sqlite3LogEst
13040 28 28 75 36 34 29 6e 29 20 29 7b 0a 20 20 20 20  ((u64)n) ){.    
13050 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
13060 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
13070 74 28 28 75 36 34 29 6e 29 3b 0a 20 20 20 20 20  t((u64)n);.     
13080 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c     p->selFlags |
13090 3d 20 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 3b  = SF_FixedLimit;
130a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
130b0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
130c0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
130d0 2c 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c  , pLimit->pLeft,
130e0 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
130f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13100 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  1(v, OP_MustBeIn
13110 74 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64 62 65  t, iLimit); Vdbe
13120 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
13130 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
13140 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65  v, "LIMIT counte
13150 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r"));.      sqli
13160 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13170 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69   OP_IfNot, iLimi
13180 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65  t, iBreak); Vdbe
13190 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
131a0 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 6d 69   }.    if( pLimi
131b0 74 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20  t->pRight ){.   
131c0 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
131d0 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72  iOffset = ++pPar
131e0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
131f0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20  pParse->nMem++; 
13200 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
13210 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72 20   extra register 
13220 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74  for limit+offset
13230 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
13240 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
13250 2c 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74  , pLimit->pRight
13260 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
13270 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13280 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op1(v, OP_MustBe
13290 49 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b 20 56  Int, iOffset); V
132a0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
132b0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
132c0 74 28 28 76 2c 20 22 4f 46 46 53 45 54 20 63 6f  t((v, "OFFSET co
132d0 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20  unter"));.      
132e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
132f0 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69  3(v, OP_OffsetLi
13300 6d 69 74 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66  mit, iLimit, iOf
13310 66 73 65 74 2b 31 2c 20 69 4f 66 66 73 65 74 29  fset+1, iOffset)
13320 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
13330 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f  ent((v, "LIMIT+O
13340 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20 7d 0a  FFSET"));.    }.
13350 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
13360 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
13370 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a  UND_SELECT./*.**
13380 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72   Return the appr
13390 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e  opriate collatin
133a0 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
133b0 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d  he iCol-th colum
133c0 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75  n of.** the resu
133d0 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65 20 63  lt set for the c
133e0 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73  ompound-select s
133f0 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52  tatement "p".  R
13400 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a  eturn NULL if.**
13410 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20   the column has 
13420 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  no default colla
13430 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
13440 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69  *.** The collati
13450 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
13460 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
13470 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f  ect is taken fro
13480 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f  m the.** left-mo
13490 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73  st term of the s
134a0 65 6c 65 63 74 20 74 68 61 74 20 68 61 73 20 61  elect that has a
134b0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
134c0 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43  nce..*/.static C
134d0 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c  ollSeq *multiSel
134e0 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  ectCollSeq(Parse
134f0 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
13500 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a   *p, int iCol){.
13510 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b    CollSeq *pRet;
13520 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
13530 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d   ){.    pRet = m
13540 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
13550 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72  q(pParse, p->pPr
13560 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65  ior, iCol);.  }e
13570 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  lse{.    pRet = 
13580 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
13590 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 2f 2a   iCol>=0 );.  /*
135a0 20 69 43 6f 6c 20 6d 75 73 74 20 62 65 20 6c 65   iCol must be le
135b0 73 73 20 74 68 61 6e 20 70 2d 3e 70 45 4c 69 73  ss than p->pELis
135c0 74 2d 3e 6e 45 78 70 72 2e 20 20 4f 74 68 65 72  t->nExpr.  Other
135d0 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 77 6f  wise an error wo
135e0 75 6c 64 0a 20 20 2a 2a 20 68 61 76 65 20 62 65  uld.  ** have be
135f0 65 6e 20 74 68 72 6f 77 6e 20 64 75 72 69 6e 67  en thrown during
13600 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
13610 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 6e 6f   and we would no
13620 74 20 68 61 76 65 20 67 6f 74 74 65 6e 0a 20 20  t have gotten.  
13630 2a 2a 20 74 68 69 73 20 66 61 72 20 2a 2f 0a 20  ** this far */. 
13640 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26 26 20   if( pRet==0 && 
13650 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 2d 3e 70  ALWAYS(iCol<p->p
13660 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  EList->nExpr) ){
13670 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69  .    pRet = sqli
13680 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
13690 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
136a0 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29  ->a[iCol].pExpr)
136b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
136c0 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Ret;.}../*.** Th
136d0 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
136e0 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  nt passed as the
136f0 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
13700 72 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  r is a compound 
13710 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 61  SELECT.** with a
13720 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
13730 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
13740 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 72   allocates and r
13750 65 74 75 72 6e 73 20 61 20 4b 65 79 49 6e 66 6f  eturns a KeyInfo
13760 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 73 75  .** structure su
13770 69 74 61 62 6c 65 20 66 6f 72 20 69 6d 70 6c 65  itable for imple
13780 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44 45  menting the ORDE
13790 52 20 42 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  R BY..**.** Spac
137a0 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65  e to hold the Ke
137b0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
137c0 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
137d0 20 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 63 61 6c   malloc. The cal
137e0 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
137f0 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
13800 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68 61  for ensuring tha
13810 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  t this structure
13820 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a   is eventually.*
13830 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74  * freed..*/.stat
13840 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c 74  ic KeyInfo *mult
13850 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65  iSelectOrderByKe
13860 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61  yInfo(Parse *pPa
13870 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
13880 69 6e 74 20 6e 45 78 74 72 61 29 7b 0a 20 20 45  int nExtra){.  E
13890 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
138a0 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
138b0 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 20  .  int nOrderBy 
138c0 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  = p->pOrderBy->n
138d0 45 78 70 72 3b 0a 20 20 73 71 6c 69 74 65 33 20  Expr;.  sqlite3 
138e0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
138f0 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 52 65  ;.  KeyInfo *pRe
13900 74 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  t = sqlite3KeyIn
13910 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72 64  foAlloc(db, nOrd
13920 65 72 42 79 2b 6e 45 78 74 72 61 2c 20 31 29 3b  erBy+nExtra, 1);
13930 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20  .  if( pRet ){. 
13940 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
13950 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
13960 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  y; i++){.      s
13970 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
13980 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4f  tem *pItem = &pO
13990 72 64 65 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20  rderBy->a[i];.  
139a0 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d 20      Expr *pTerm 
139b0 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  = pItem->pExpr;.
139c0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
139d0 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 69 66 28  Coll;..      if(
139e0 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20   pTerm->flags & 
139f0 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
13a00 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
13a10 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
13a20 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 29 3b  (pParse, pTerm);
13a30 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13a40 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75        pColl = mu
13a50 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
13a60 28 70 50 61 72 73 65 2c 20 70 2c 20 70 49 74 65  (pParse, p, pIte
13a70 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
13a80 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 69  ol-1);.        i
13a90 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43  f( pColl==0 ) pC
13aa0 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
13ab0 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  oll;.        pOr
13ac0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
13ad0 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71  r =.          sq
13ae0 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c  lite3ExprAddColl
13af0 61 74 65 53 74 72 69 6e 67 28 70 50 61 72 73 65  ateString(pParse
13b00 2c 20 70 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e  , pTerm, pColl->
13b10 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
13b20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
13b30 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
13b40 69 74 65 61 62 6c 65 28 70 52 65 74 29 20 29 3b  iteable(pRet) );
13b50 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 61 43 6f  .      pRet->aCo
13b60 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20  ll[i] = pColl;. 
13b70 20 20 20 20 20 70 52 65 74 2d 3e 61 53 6f 72 74       pRet->aSort
13b80 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65  Order[i] = pOrde
13b90 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
13ba0 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  der;.    }.  }..
13bb0 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
13bc0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
13bd0 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20  _OMIT_CTE./*.** 
13be0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
13bf0 65 72 61 74 65 73 20 56 44 42 45 20 63 6f 64 65  erates VDBE code
13c00 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
13c10 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 49 54  content of a WIT
13c20 48 20 52 45 43 55 52 53 49 56 45 0a 2a 2a 20 71  H RECURSIVE.** q
13c30 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d  uery of the form
13c40 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c 72 65 63 75 72  :.**.**   <recur
13c50 73 69 76 65 2d 74 61 62 6c 65 3e 20 41 53 20 28  sive-table> AS (
13c60 3c 73 65 74 75 70 2d 71 75 65 72 79 3e 20 55 4e  <setup-query> UN
13c70 49 4f 4e 20 5b 41 4c 4c 5d 20 3c 72 65 63 75 72  ION [ALL] <recur
13c80 73 69 76 65 2d 71 75 65 72 79 3e 29 0a 2a 2a 20  sive-query>).** 
13c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ca0 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
13cb0 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 20  ____/           
13cc0 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
13cd0 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __/.**          
13ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cf0 20 70 2d 3e 70 50 72 69 6f 72 20 20 20 20 20 20   p->pPrior      
13d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d10 70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  p.**.**.** There
13d20 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20   is exactly one 
13d30 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
13d40 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65   recursive-table
13d50 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
13d60 75 73 65 0a 2a 2a 20 6f 66 20 72 65 63 75 72 73  use.** of recurs
13d70 69 76 65 2d 71 75 65 72 79 2c 20 6d 61 72 6b 65  ive-query, marke
13d80 64 20 77 69 74 68 20 74 68 65 20 53 72 63 4c 69  d with the SrcLi
13d90 73 74 2d 3e 61 5b 5d 2e 66 67 2e 69 73 52 65 63  st->a[].fg.isRec
13da0 75 72 73 69 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a  ursive flag..**.
13db0 2a 2a 20 54 68 65 20 73 65 74 75 70 2d 71 75 65  ** The setup-que
13dc0 72 79 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20  ry runs once to 
13dd0 67 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 69 74  generate an init
13de0 69 61 6c 20 73 65 74 20 6f 66 20 72 6f 77 73 20  ial set of rows 
13df0 74 68 61 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20  that go.** into 
13e00 61 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20  a Queue table.  
13e10 52 6f 77 73 20 61 72 65 20 65 78 74 72 61 63 74  Rows are extract
13e20 65 64 20 66 72 6f 6d 20 74 68 65 20 51 75 65 75  ed from the Queu
13e30 65 20 74 61 62 6c 65 20 6f 6e 65 20 62 79 0a 2a  e table one by.*
13e40 2a 20 6f 6e 65 2e 20 20 45 61 63 68 20 72 6f 77  * one.  Each row
13e50 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
13e60 51 75 65 75 65 20 69 73 20 6f 75 74 70 75 74 20  Queue is output 
13e70 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65 6e 20  to pDest.  Then 
13e80 74 68 65 20 73 69 6e 67 6c 65 0a 2a 2a 20 65 78  the single.** ex
13e90 74 72 61 63 74 65 64 20 72 6f 77 20 28 6e 6f 77  tracted row (now
13ea0 20 69 6e 20 74 68 65 20 69 43 75 72 72 65 6e 74   in the iCurrent
13eb0 20 74 61 62 6c 65 29 20 62 65 63 6f 6d 65 73 20   table) becomes 
13ec0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
13ed0 68 65 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 2d  he.** recursive-
13ee0 74 61 62 6c 65 20 66 6f 72 20 61 20 72 65 63 75  table for a recu
13ef0 72 73 69 76 65 2d 71 75 65 72 79 20 72 75 6e 2e  rsive-query run.
13f00 20 20 54 68 65 20 6f 75 74 70 75 74 20 6f 66 20    The output of 
13f10 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 71 75  the recursive-qu
13f20 65 72 79 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  ery.** is added 
13f30 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 51 75  back into the Qu
13f40 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 6e  eue table.  Then
13f50 20 61 6e 6f 74 68 65 72 20 72 6f 77 20 69 73 20   another row is 
13f60 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51  extracted from Q
13f70 75 65 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ueue.** and the 
13f80 69 74 65 72 61 74 69 6f 6e 20 63 6f 6e 74 69 6e  iteration contin
13f90 75 65 73 20 75 6e 74 69 6c 20 74 68 65 20 51 75  ues until the Qu
13fa0 65 75 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  eue table is emp
13fb0 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ty..**.** If the
13fc0 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
13fd0 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f  operator is UNIO
13fe0 4e 20 74 68 65 6e 20 6e 6f 20 64 75 70 6c 69 63  N then no duplic
13ff0 61 74 65 20 72 6f 77 73 20 61 72 65 20 65 76 65  ate rows are eve
14000 72 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e  r.** inserted in
14010 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61 62  to the Queue tab
14020 6c 65 2e 20 20 54 68 65 20 69 44 69 73 74 69 6e  le.  The iDistin
14030 63 74 20 74 61 62 6c 65 20 6b 65 65 70 73 20 61  ct table keeps a
14040 20 63 6f 70 79 20 6f 66 20 61 6c 6c 20 72 6f 77   copy of all row
14050 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 65  s.** that have e
14060 76 65 72 20 62 65 65 6e 20 69 6e 73 65 72 74 65  ver been inserte
14070 64 20 69 6e 74 6f 20 51 75 65 75 65 20 61 6e 64  d into Queue and
14080 20 63 61 75 73 65 73 20 64 75 70 6c 69 63 61 74   causes duplicat
14090 65 73 20 74 6f 20 62 65 0a 2a 2a 20 64 69 73 63  es to be.** disc
140a0 61 72 64 65 64 2e 20 20 49 66 20 74 68 65 20 6f  arded.  If the o
140b0 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e  perator is UNION
140c0 20 41 4c 4c 2c 20 74 68 65 6e 20 64 75 70 6c 69   ALL, then dupli
140d0 63 61 74 65 73 20 61 72 65 20 61 6c 6c 6f 77 65  cates are allowe
140e0 64 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65  d..** .** If the
140f0 20 71 75 65 72 79 20 68 61 73 20 61 6e 20 4f 52   query has an OR
14100 44 45 52 20 42 59 2c 20 74 68 65 6e 20 65 6e 74  DER BY, then ent
14110 72 69 65 73 20 69 6e 20 74 68 65 20 51 75 65 75  ries in the Queu
14120 65 20 74 61 62 6c 65 20 61 72 65 20 6b 65 70 74  e table are kept
14130 20 69 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20   in.** ORDER BY 
14140 6f 72 64 65 72 20 61 6e 64 20 74 68 65 20 66 69  order and the fi
14150 72 73 74 20 65 6e 74 72 79 20 69 73 20 65 78 74  rst entry is ext
14160 72 61 63 74 65 64 20 66 6f 72 20 65 61 63 68 20  racted for each 
14170 63 79 63 6c 65 2e 20 20 57 69 74 68 6f 75 74 0a  cycle.  Without.
14180 2a 2a 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20  ** an ORDER BY, 
14190 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
141a0 69 73 20 6a 75 73 74 20 61 20 46 49 46 4f 2e 0a  is just a FIFO..
141b0 2a 2a 0a 2a 2a 20 49 66 20 61 20 4c 49 4d 49 54  **.** If a LIMIT
141c0 20 63 6c 61 75 73 65 20 69 73 20 70 72 6f 76 69   clause is provi
141d0 64 65 64 2c 20 74 68 65 6e 20 74 68 65 20 69 74  ded, then the it
141e0 65 72 61 74 69 6f 6e 20 73 74 6f 70 73 20 61 66  eration stops af
141f0 74 65 72 20 4c 49 4d 49 54 20 72 6f 77 73 0a 2a  ter LIMIT rows.*
14200 2a 20 68 61 76 65 20 62 65 65 6e 20 6f 75 74 70  * have been outp
14210 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20 41 20  ut to pDest.  A 
14220 4c 49 4d 49 54 20 6f 66 20 7a 65 72 6f 20 6d 65  LIMIT of zero me
14230 61 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 6e 6f  ans to output no
14240 20 72 6f 77 73 20 61 6e 64 20 61 0a 2a 2a 20 6e   rows and a.** n
14250 65 67 61 74 69 76 65 20 4c 49 4d 49 54 20 6d 65  egative LIMIT me
14260 61 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 61 6c  ans to output al
14270 6c 20 72 6f 77 73 2e 20 20 49 66 20 74 68 65 72  l rows.  If ther
14280 65 20 69 73 20 61 6c 73 6f 20 61 6e 20 4f 46 46  e is also an OFF
14290 53 45 54 20 63 6c 61 75 73 65 0a 2a 2a 20 77 69  SET clause.** wi
142a0 74 68 20 61 20 70 6f 73 69 74 69 76 65 20 76 61  th a positive va
142b0 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69  lue, then the fi
142c0 72 73 74 20 4f 46 46 53 45 54 20 6f 75 74 70 75  rst OFFSET outpu
142d0 74 73 20 61 72 65 20 64 69 73 63 61 72 64 65 64  ts are discarded
142e0 20 72 61 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20   rather.** than 
142f0 62 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 70 44  being sent to pD
14300 65 73 74 2e 20 20 54 68 65 20 4c 49 4d 49 54 20  est.  The LIMIT 
14310 63 6f 75 6e 74 20 64 6f 65 73 20 6e 6f 74 20 62  count does not b
14320 65 67 69 6e 20 75 6e 74 69 6c 20 61 66 74 65 72  egin until after
14330 20 4f 46 46 53 45 54 0a 2a 2a 20 72 6f 77 73 20   OFFSET.** rows 
14340 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65  have been skippe
14350 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
14360 64 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65  d generateWithRe
14370 63 75 72 73 69 76 65 51 75 65 72 79 28 0a 20 20  cursiveQuery(.  
14380 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
14390 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
143a0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
143b0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
143c0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 75 72      /* The recur
143d0 73 69 76 65 20 53 45 4c 45 43 54 20 74 6f 20 62  sive SELECT to b
143e0 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
143f0 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
14400 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
14410 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
14420 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c  lts */.){.  SrcL
14430 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70  ist *pSrc = p->p
14440 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Src;      /* The
14450 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
14460 74 68 65 20 72 65 63 75 72 73 69 76 65 20 71 75  the recursive qu
14470 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  ery */.  int nCo
14480 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  l = p->pEList->n
14490 45 78 70 72 3b 20 20 2f 2a 20 4e 75 6d 62 65 72  Expr;  /* Number
144a0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
144b0 68 65 20 72 65 63 75 72 73 69 76 65 20 74 61 62  he recursive tab
144c0 6c 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  le */.  Vdbe *v 
144d0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
144e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65        /* The pre
144f0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
14500 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
14510 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
14520 70 53 65 74 75 70 20 3d 20 70 2d 3e 70 50 72 69  pSetup = p->pPri
14530 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 73 65 74  or;   /* The set
14540 75 70 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  up query */.  in
14550 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20  t addrTop;      
14560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
14570 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a  op of the loop *
14580 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74  /.  int addrCont
14590 2c 20 61 64 64 72 42 72 65 61 6b 3b 20 20 20 20  , addrBreak;    
145a0 20 20 2f 2a 20 43 4f 4e 54 49 4e 55 45 20 61 6e    /* CONTINUE an
145b0 64 20 42 52 45 41 4b 20 61 64 64 72 65 73 73 65  d BREAK addresse
145c0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 72  s */.  int iCurr
145d0 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ent = 0;        
145e0 20 20 20 20 20 2f 2a 20 54 68 65 20 43 75 72 72       /* The Curr
145f0 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ent table */.  i
14600 6e 74 20 72 65 67 43 75 72 72 65 6e 74 3b 20 20  nt regCurrent;  
14610 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14620 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
14630 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a   Current table *
14640 2f 0a 20 20 69 6e 74 20 69 51 75 65 75 65 3b 20  /.  int iQueue; 
14650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14660 20 20 2f 2a 20 54 68 65 20 51 75 65 75 65 20 74    /* The Queue t
14670 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44  able */.  int iD
14680 69 73 74 69 6e 63 74 20 3d 20 30 3b 20 20 20 20  istinct = 0;    
14690 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 65 6e          /* To en
146a0 73 75 72 65 20 75 6e 69 71 75 65 20 72 65 73 75  sure unique resu
146b0 6c 74 73 20 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a  lts if UNION */.
146c0 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 53 52    int eDest = SR
146d0 54 5f 46 69 66 6f 3b 20 20 20 20 20 20 20 20 20  T_Fifo;         
146e0 2f 2a 20 48 6f 77 20 74 6f 20 77 72 69 74 65 20  /* How to write 
146f0 74 6f 20 51 75 65 75 65 20 2a 2f 0a 20 20 53 65  to Queue */.  Se
14700 6c 65 63 74 44 65 73 74 20 64 65 73 74 51 75 65  lectDest destQue
14710 75 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ue;         /* S
14720 65 6c 65 63 74 44 65 73 74 20 74 61 72 67 65 74  electDest target
14730 74 69 6e 67 20 74 68 65 20 51 75 65 75 65 20 74  ting the Queue t
14740 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  able */.  int i;
14750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14760 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
14770 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
14780 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
14790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
147a0 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 45  sult code */.  E
147b0 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
147c0 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y;           /* 
147d0 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
147e0 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  use */.  Expr *p
147f0 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20  Limit;          
14800 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20         /* Saved 
14810 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
14820 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d   */.  int regLim
14830 69 74 2c 20 72 65 67 4f 66 66 73 65 74 3b 20 20  it, regOffset;  
14840 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73      /* Registers
14850 20 75 73 65 64 20 62 79 20 4c 49 4d 49 54 20 61   used by LIMIT a
14860 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 0a 23 69  nd OFFSET */..#i
14870 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14880 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 69  T_WINDOWFUNC.  i
14890 66 28 20 70 2d 3e 70 57 69 6e 20 29 7b 0a 20 20  f( p->pWin ){.  
148a0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
148b0 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
148c0 74 20 75 73 65 20 77 69 6e 64 6f 77 20 66 75 6e  t use window fun
148d0 63 74 69 6f 6e 73 20 69 6e 20 72 65 63 75 72 73  ctions in recurs
148e0 69 76 65 20 71 75 65 72 69 65 73 22 29 3b 0a 20  ive queries");. 
148f0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
14900 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 62 74 61  endif..  /* Obta
14910 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  in authorization
14920 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72 73 69   to do a recursi
14930 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 66  ve query */.  if
14940 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
14950 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
14960 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30 2c 20  E_RECURSIVE, 0, 
14970 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
14980 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68  .  /* Process th
14990 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  e LIMIT and OFFS
149a0 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66 20 74  ET clauses, if t
149b0 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 61  hey exist */.  a
149c0 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ddrBreak = sqlit
149d0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
149e0 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74  v);.  p->nSelect
149f0 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34  Row = 320;  /* 4
14a00 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f   billion rows */
14a10 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
14a20 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
14a30 20 70 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a   p, addrBreak);.
14a40 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
14a50 69 6d 69 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74  imit;.  regLimit
14a60 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20   = p->iLimit;.  
14a70 72 65 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69  regOffset = p->i
14a80 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69  Offset;.  p->pLi
14a90 6d 69 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c  mit = 0;.  p->iL
14aa0 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  imit = p->iOffse
14ab0 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72 42  t = 0;.  pOrderB
14ac0 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
14ad0 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
14ae0 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
14af0 6f 66 20 74 68 65 20 43 75 72 72 65 6e 74 20 74  of the Current t
14b00 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  able */.  for(i=
14b10 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 53 72 63  0; ALWAYS(i<pSrc
14b20 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a 20  ->nSrc); i++){. 
14b30 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69     if( pSrc->a[i
14b40 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65  ].fg.isRecursive
14b50 20 29 7b 0a 20 20 20 20 20 20 69 43 75 72 72 65   ){.      iCurre
14b60 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e  nt = pSrc->a[i].
14b70 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 62  iCursor;.      b
14b80 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
14b90 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63  .  /* Allocate c
14ba0 75 72 73 6f 72 73 20 6e 75 6d 62 65 72 73 20 66  ursors numbers f
14bb0 6f 72 20 51 75 65 75 65 20 61 6e 64 20 44 69 73  or Queue and Dis
14bc0 74 69 6e 63 74 2e 20 20 54 68 65 20 63 75 72 73  tinct.  The curs
14bd0 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20  or number for.  
14be0 2a 2a 20 74 68 65 20 44 69 73 74 69 6e 63 74 20  ** the Distinct 
14bf0 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 65 78  table must be ex
14c00 61 63 74 6c 79 20 6f 6e 65 20 67 72 65 61 74 65  actly one greate
14c10 72 20 74 68 61 6e 20 51 75 65 75 65 20 69 6e 20  r than Queue in 
14c20 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  order.  ** for t
14c30 68 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 20  he SRT_DistFifo 
14c40 61 6e 64 20 53 52 54 5f 44 69 73 74 51 75 65 75  and SRT_DistQueu
14c50 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 20 74  e destinations t
14c60 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51 75  o work. */.  iQu
14c70 65 75 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  eue = pParse->nT
14c80 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6f  ab++;.  if( p->o
14c90 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
14ca0 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65     eDest = pOrde
14cb0 72 42 79 20 3f 20 53 52 54 5f 44 69 73 74 51 75  rBy ? SRT_DistQu
14cc0 65 75 65 20 3a 20 53 52 54 5f 44 69 73 74 46 69  eue : SRT_DistFi
14cd0 66 6f 3b 0a 20 20 20 20 69 44 69 73 74 69 6e 63  fo;.    iDistinc
14ce0 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
14cf0 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
14d00 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42   eDest = pOrderB
14d10 79 20 3f 20 53 52 54 5f 51 75 65 75 65 20 3a 20  y ? SRT_Queue : 
14d20 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20 20  SRT_Fifo;.  }.  
14d30 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
14d40 74 49 6e 69 74 28 26 64 65 73 74 51 75 65 75 65  tInit(&destQueue
14d50 2c 20 65 44 65 73 74 2c 20 69 51 75 65 75 65 29  , eDest, iQueue)
14d60 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
14d70 20 63 75 72 73 6f 72 73 20 66 6f 72 20 43 75 72   cursors for Cur
14d80 72 65 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e 64  rent, Queue, and
14d90 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20 20   Distinct. */.  
14da0 72 65 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b 70  regCurrent = ++p
14db0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73  Parse->nMem;.  s
14dc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
14dd0 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
14de0 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20 72 65 67  o, iCurrent, reg
14df0 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a  Current, nCol);.
14e00 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
14e10 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  {.    KeyInfo *p
14e20 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69 53  KeyInfo = multiS
14e30 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49  electOrderByKeyI
14e40 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31  nfo(pParse, p, 1
14e50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14e60 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
14e70 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51  penEphemeral, iQ
14e80 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  ueue, pOrderBy->
14e90 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20  nExpr+2, 0,.    
14ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14eb0 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
14ec0 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
14ed0 20 20 20 20 64 65 73 74 51 75 65 75 65 2e 70 4f      destQueue.pO
14ee0 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
14ef0 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
14f00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14f10 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
14f20 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 6e  meral, iQueue, n
14f30 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62 65  Col);.  }.  Vdbe
14f40 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75 65  Comment((v, "Que
14f50 75 65 20 74 61 62 6c 65 22 29 29 3b 0a 20 20 69  ue table"));.  i
14f60 66 28 20 69 44 69 73 74 69 6e 63 74 20 29 7b 0a  f( iDistinct ){.
14f70 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
14f80 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  phm[0] = sqlite3
14f90 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14fa0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
14fb0 69 44 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20  iDistinct, 0);. 
14fc0 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c     p->selFlags |
14fd0 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72  = SF_UsesEphemer
14fe0 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65  al;.  }..  /* De
14ff0 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42  tach the ORDER B
15000 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68  Y clause from th
15010 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  e compound SELEC
15020 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72  T */.  p->pOrder
15030 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 74  By = 0;..  /* St
15040 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
15050 6f 66 20 74 68 65 20 73 65 74 75 70 2d 71 75 65  of the setup-que
15060 72 79 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f 0a  ry in Queue. */.
15070 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20    pSetup->pNext 
15080 3d 20 30 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75  = 0;.  ExplainQu
15090 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
150a0 20 31 2c 20 22 53 45 54 55 50 22 29 29 3b 0a 20   1, "SETUP"));. 
150b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
150c0 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 74  ect(pParse, pSet
150d0 75 70 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b  up, &destQueue);
150e0 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74  .  pSetup->pNext
150f0 20 3d 20 70 3b 0a 20 20 69 66 28 20 72 63 20 29   = p;.  if( rc )
15100 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72 65 63   goto end_of_rec
15110 75 72 73 69 76 65 5f 71 75 65 72 79 3b 0a 0a 20  ursive_query;.. 
15120 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78   /* Find the nex
15130 74 20 72 6f 77 20 69 6e 20 74 68 65 20 51 75 65  t row in the Que
15140 75 65 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68  ue and output th
15150 61 74 20 72 6f 77 20 2a 2f 0a 20 20 61 64 64 72  at row */.  addr
15160 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
15170 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
15180 77 69 6e 64 2c 20 69 51 75 65 75 65 2c 20 61 64  wind, iQueue, ad
15190 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f  drBreak); VdbeCo
151a0 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a  verage(v);..  /*
151b0 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 6e 65   Transfer the ne
151c0 78 74 20 72 6f 77 20 69 6e 20 51 75 65 75 65 20  xt row in Queue 
151d0 6f 76 65 72 20 74 6f 20 43 75 72 72 65 6e 74 20  over to Current 
151e0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
151f0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
15200 6c 52 6f 77 2c 20 69 43 75 72 72 65 6e 74 29 3b  lRow, iCurrent);
15210 20 2f 2a 20 54 6f 20 72 65 73 65 74 20 63 6f 6c   /* To reset col
15220 75 6d 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 69  umn cache */.  i
15230 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
15240 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15250 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
15260 6e 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65  n, iQueue, pOrde
15270 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65  rBy->nExpr+1, re
15280 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 65 6c  gCurrent);.  }el
15290 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
152a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
152b0 52 6f 77 44 61 74 61 2c 20 69 51 75 65 75 65 2c  RowData, iQueue,
152c0 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20   regCurrent);.  
152d0 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
152e0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65  ddOp1(v, OP_Dele
152f0 74 65 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20  te, iQueue);..  
15300 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 73 69  /* Output the si
15310 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72  ngle row in Curr
15320 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 43 6f 6e  ent */.  addrCon
15330 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
15340 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63  akeLabel(v);.  c
15350 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 72 65 67  odeOffset(v, reg
15360 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74  Offset, addrCont
15370 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72  );.  selectInner
15380 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
15390 69 43 75 72 72 65 6e 74 2c 0a 20 20 20 20 20 20  iCurrent,.      
153a0 30 2c 20 30 2c 20 70 44 65 73 74 2c 20 61 64 64  0, 0, pDest, add
153b0 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b  rCont, addrBreak
153c0 29 3b 0a 20 20 69 66 28 20 72 65 67 4c 69 6d 69  );.  if( regLimi
153d0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
153e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
153f0 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 72  _DecrJumpZero, r
15400 65 67 4c 69 6d 69 74 2c 20 61 64 64 72 42 72 65  egLimit, addrBre
15410 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ak);.    VdbeCov
15420 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20  erage(v);.  }.  
15430 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
15440 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43  veLabel(v, addrC
15450 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45 78 65 63  ont);..  /* Exec
15460 75 74 65 20 74 68 65 20 72 65 63 75 72 73 69 76  ute the recursiv
15470 65 20 53 45 4c 45 43 54 20 74 61 6b 69 6e 67 20  e SELECT taking 
15480 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69  the single row i
15490 6e 20 43 75 72 72 65 6e 74 20 61 73 0a 20 20 2a  n Current as.  *
154a0 2a 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  * the value for 
154b0 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 74 61  the recursive-ta
154c0 62 6c 65 2e 20 53 74 6f 72 65 20 74 68 65 20 72  ble. Store the r
154d0 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 51 75  esults in the Qu
154e0 65 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eue..  */.  if( 
154f0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
15500 5f 41 67 67 72 65 67 61 74 65 20 29 7b 0a 20 20  _Aggregate ){.  
15510 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
15520 67 28 70 50 61 72 73 65 2c 20 22 72 65 63 75 72  g(pParse, "recur
15530 73 69 76 65 20 61 67 67 72 65 67 61 74 65 20 71  sive aggregate q
15540 75 65 72 69 65 73 20 6e 6f 74 20 73 75 70 70 6f  ueries not suppo
15550 72 74 65 64 22 29 3b 0a 20 20 7d 65 6c 73 65 7b  rted");.  }else{
15560 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
15570 20 30 3b 0a 20 20 20 20 45 78 70 6c 61 69 6e 51   0;.    ExplainQ
15580 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
15590 2c 20 31 2c 20 22 52 45 43 55 52 53 49 56 45 20  , 1, "RECURSIVE 
155a0 53 54 45 50 22 29 29 3b 0a 20 20 20 20 73 71 6c  STEP"));.    sql
155b0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
155c0 65 2c 20 70 2c 20 26 64 65 73 74 51 75 65 75 65  e, p, &destQueue
155d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
155e0 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20  ->pPrior==0 );. 
155f0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
15600 53 65 74 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Setup;.  }..  /*
15610 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20 74 68   Keep running th
15620 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68 65  e loop until the
15630 20 51 75 65 75 65 20 69 73 20 65 6d 70 74 79 20   Queue is empty 
15640 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
15650 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70 29  Goto(v, addrTop)
15660 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
15670 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
15680 64 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64 5f  ddrBreak);..end_
15690 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65  of_recursive_que
156a0 72 79 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70  ry:.  sqlite3Exp
156b0 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  rListDelete(pPar
156c0 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65  se->db, p->pOrde
156d0 72 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72 64 65  rBy);.  p->pOrde
156e0 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
156f0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
15700 69 6d 69 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  imit;.  return;.
15710 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
15720 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a  TE_OMIT_CTE */..
15730 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
15740 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20  ences */.static 
15750 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
15760 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
15770 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
15780 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
15790 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
157a0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
157b0 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
157c0 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
157d0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
157e0 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
157f0 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
15800 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
15810 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ts */.);../*.** 
15820 48 61 6e 64 6c 65 20 74 68 65 20 73 70 65 63 69  Handle the speci
15830 61 6c 20 63 61 73 65 20 6f 66 20 61 20 63 6f 6d  al case of a com
15840 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61  pound-select tha
15850 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f  t originates fro
15860 6d 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c  m a.** VALUES cl
15870 61 75 73 65 2e 20 20 42 79 20 68 61 6e 64 6c 69  ause.  By handli
15880 6e 67 20 74 68 69 73 20 61 73 20 61 20 73 70 65  ng this as a spe
15890 63 69 61 6c 20 63 61 73 65 2c 20 77 65 20 61 76  cial case, we av
158a0 6f 69 64 20 64 65 65 70 0a 2a 2a 20 72 65 63 75  oid deep.** recu
158b0 72 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20  rsion, and thus 
158c0 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65  do not need to e
158d0 6e 66 6f 72 63 65 20 74 68 65 20 53 51 4c 49 54  nforce the SQLIT
158e0 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
158f0 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20  _SELECT.** on a 
15900 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a  VALUES clause..*
15910 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65  *.** Because the
15920 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f   Select object o
15930 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61  riginates from a
15940 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a   VALUES clause:.
15950 2a 2a 20 20 20 28 31 29 20 54 68 65 72 65 20 69  **   (1) There i
15960 73 20 6e 6f 20 4c 49 4d 49 54 20 6f 72 20 4f 46  s no LIMIT or OF
15970 46 53 45 54 20 6f 72 20 65 6c 73 65 20 74 68 65  FSET or else the
15980 72 65 20 69 73 20 61 20 4c 49 4d 49 54 20 6f 66  re is a LIMIT of
15990 20 65 78 61 63 74 6c 79 20 31 0a 2a 2a 20 20 20   exactly 1.**   
159a0 28 32 29 20 41 6c 6c 20 74 65 72 6d 73 20 61 72  (2) All terms ar
159b0 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a 20 20  e UNION ALL.**  
159c0 20 28 33 29 20 54 68 65 72 65 20 69 73 20 6e 6f   (3) There is no
159d0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
159e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 4c 49 4d 49  .**.** The "LIMI
159f0 54 20 6f 66 20 65 78 61 63 74 6c 79 20 31 22 20  T of exactly 1" 
15a00 63 61 73 65 20 6f 66 20 63 6f 6e 64 69 74 69 6f  case of conditio
15a10 6e 20 28 31 29 20 63 6f 6d 65 73 20 61 62 6f 75  n (1) comes abou
15a20 74 20 77 68 65 6e 20 61 20 56 41 4c 55 45 53 0a  t when a VALUES.
15a30 2a 2a 20 63 6c 61 75 73 65 20 6f 63 63 75 72 73  ** clause occurs
15a40 20 77 69 74 68 69 6e 20 73 63 61 6c 61 72 20 65   within scalar e
15a50 78 70 72 65 73 73 69 6f 6e 20 28 65 78 3a 20 22  xpression (ex: "
15a60 53 45 4c 45 43 54 20 28 56 41 4c 55 45 53 28 31  SELECT (VALUES(1
15a70 29 2c 28 32 29 2c 28 33 29 29 22 29 2e 0a 2a 2a  ),(2),(3))")..**
15a80 20 54 68 65 20 73 71 6c 69 74 65 33 43 6f 64 65   The sqlite3Code
15a90 53 75 62 73 65 6c 65 63 74 20 77 69 6c 6c 20 68  Subselect will h
15aa0 61 76 65 20 61 64 64 65 64 20 74 68 65 20 4c 49  ave added the LI
15ab0 4d 49 54 20 31 20 63 6c 61 75 73 65 20 69 6e 20  MIT 1 clause in 
15ac0 74 68 74 20 63 61 73 65 2e 0a 2a 2a 20 53 69 6e  tht case..** Sin
15ad0 63 65 20 74 68 65 20 6c 69 6d 69 74 20 69 73 20  ce the limit is 
15ae0 65 78 61 63 74 6c 79 20 31 2c 20 77 65 20 6f 6e  exactly 1, we on
15af0 6c 79 20 6e 65 65 64 20 74 6f 20 65 76 61 6c 75  ly need to evalu
15b00 74 65 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  tes the left-mos
15b10 74 20 56 41 4c 55 45 53 2e 0a 2a 2f 0a 73 74 61  t VALUES..*/.sta
15b20 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
15b30 65 63 74 56 61 6c 75 65 73 28 0a 20 20 50 61 72  ectValues(.  Par
15b40 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
15b50 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
15b60 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
15b70 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
15b80 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
15b90 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
15ba0 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
15bb0 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
15bc0 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
15bd0 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
15be0 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
15bf0 74 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e  t nRow = 1;.  in
15c00 74 20 72 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t rc = 0;.  int 
15c10 62 53 68 6f 77 41 6c 6c 20 3d 20 70 2d 3e 70 4c  bShowAll = p->pL
15c20 69 6d 69 74 3d 3d 30 3b 0a 20 20 61 73 73 65 72  imit==0;.  asser
15c30 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  t( p->selFlags &
15c40 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29   SF_MultiValue )
15c50 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65  ;.  do{.    asse
15c60 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
15c70 26 20 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a 20  & SF_Values );. 
15c80 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
15c90 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e  ==TK_ALL || (p->
15ca0 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26  op==TK_SELECT &&
15cb0 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20 29   p->pPrior==0) )
15cc0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
15cd0 3e 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 2d 3e  >pNext==0 || p->
15ce0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70  pEList->nExpr==p
15cf0 2d 3e 70 4e 65 78 74 2d 3e 70 45 4c 69 73 74 2d  ->pNext->pEList-
15d00 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 69 66  >nExpr );.    if
15d10 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
15d20 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65   break;.    asse
15d30 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 2d 3e 70  rt( p->pPrior->p
15d40 4e 65 78 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70  Next==p );.    p
15d50 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
15d60 20 20 6e 52 6f 77 20 2b 3d 20 62 53 68 6f 77 41    nRow += bShowA
15d70 6c 6c 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29 3b  ll;.  }while(1);
15d80 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50  .  ExplainQueryP
15d90 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c 20  lan((pParse, 0, 
15da0 22 53 43 41 4e 20 25 64 20 43 4f 4e 53 54 41 4e  "SCAN %d CONSTAN
15db0 54 20 52 4f 57 25 73 22 2c 20 6e 52 6f 77 2c 0a  T ROW%s", nRow,.
15dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15dd0 20 20 20 20 6e 52 6f 77 3d 3d 31 20 3f 20 22 22      nRow==1 ? ""
15de0 20 3a 20 22 53 22 29 29 3b 0a 20 20 77 68 69 6c   : "S"));.  whil
15df0 65 28 20 70 20 29 7b 0a 20 20 20 20 73 65 6c 65  e( p ){.    sele
15e00 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
15e10 73 65 2c 20 70 2c 20 2d 31 2c 20 30 2c 20 30 2c  se, p, -1, 0, 0,
15e20 20 70 44 65 73 74 2c 20 31 2c 20 31 29 3b 0a 20   pDest, 1, 1);. 
15e30 20 20 20 69 66 28 20 21 62 53 68 6f 77 41 6c 6c     if( !bShowAll
15e40 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 2d   ) break;.    p-
15e50 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 52  >nSelectRow = nR
15e60 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  ow;.    p = p->p
15e70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Next;.  }.  retu
15e80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15e90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
15ea0 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73  called to proces
15eb0 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  s a compound que
15ec0 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20  ry form from.** 
15ed0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  two or more sepa
15ee0 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73 69  rate queries usi
15ef0 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20  ng UNION, UNION 
15f00 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a  ALL, EXCEPT, or.
15f10 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a  ** INTERSECT.**.
15f20 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f  ** "p" points to
15f30 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
15f40 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69  of the two queri
15f50 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f  es.  the query o
15f60 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73  n the.** left is
15f70 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65   p->pPrior.  The
15f80 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c   left query coul
15f90 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70  d also be a comp
15fa0 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e  ound query.** in
15fb0 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73   which case this
15fc0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
15fd0 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
15fe0 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ely. .**.** The 
15ff0 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74  results of the t
16000 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74  otal query are t
16010 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
16020 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  o a destination.
16030 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74  ** of type eDest
16040 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20   with parameter 
16050 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  iParm..**.** Exa
16060 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65  mple 1:  Conside
16070 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f  r a three-way co
16080 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65  mpound SQL state
16090 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment..**.**     
160a0 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
160b0 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20   UNION SELECT b 
160c0 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45  FROM t2 UNION SE
160d0 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
160e0 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d  *.** This statem
160f0 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70  ent is parsed up
16100 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
16110 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20  **     SELECT c 
16120 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20  FROM t3.**      
16130 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d  |.**      `-----
16140 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  >  SELECT b FROM
16150 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   t2.**          
16160 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16170 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d            `-----
16180 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f  ->  SELECT a FRO
16190 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  M t1.**.** The a
161a0 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61  rrows in the dia
161b0 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65  gram above repre
161c0 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e  sent the Select.
161d0 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a  pPrior pointer..
161e0 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  ** So if this ro
161f0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
16200 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20  with p equal to 
16210 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68  the t3 query, th
16220 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c  en.** pPrior wil
16230 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72  l be the t2 quer
16240 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62  y.  p->op will b
16250 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68  e TK_UNION in th
16260 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e  is case..**.** N
16270 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75  otice that becau
16280 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51  se of the way SQ
16290 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70  Lite parses comp
162a0 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68  ound SELECTs, th
162b0 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
162c0 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67  selects always g
162d0 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74  roup from left t
162e0 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  o right..*/.stat
162f0 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
16300 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
16310 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
16320 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
16330 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
16340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16350 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
16360 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
16370 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
16380 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
16390 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
163a0 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
163b0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
163c0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20  SQLITE_OK;   /* 
163d0 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f  Success code fro
163e0 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  m a subroutine *
163f0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
16400 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
16410 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
16420 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
16430 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
16440 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
16450 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
16460 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
16470 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
16480 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72  t;      /* Alter
16490 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73 74  native data dest
164a0 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  ination */.  Sel
164b0 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30  ect *pDelete = 0
164c0 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73  ;  /* Chain of s
164d0 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f  imple selects to
164e0 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c   delete */.  sql
164f0 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
16500 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
16510 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  onnection */..  
16520 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
16530 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
16540 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73  Y or LIMIT claus
16550 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43  e on prior SELEC
16560 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74  Ts.  Only.  ** t
16570 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d  he last (right-m
16580 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74  ost) SELECT in t
16590 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61  he series may ha
165a0 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  ve an ORDER BY o
165b0 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20  r LIMIT..  */.  
165c0 61 73 73 65 72 74 28 20 70 20 26 26 20 70 2d 3e  assert( p && p->
165d0 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61  pPrior );  /* Ca
165e0 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67  lling function g
165f0 75 61 72 61 6e 74 65 65 73 20 74 68 69 73 20 6d  uarantees this m
16600 75 63 68 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  uch */.  assert(
16610 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
16620 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d 3d 30  SF_Recursive)==0
16630 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c   || p->op==TK_AL
16640 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  L || p->op==TK_U
16650 4e 49 4f 4e 20 29 3b 0a 20 20 64 62 20 3d 20 70  NION );.  db = p
16660 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72  Parse->db;.  pPr
16670 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
16680 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74  .  dest = *pDest
16690 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  ;.  if( pPrior->
166a0 70 4f 72 64 65 72 42 79 20 7c 7c 20 70 50 72 69  pOrderBy || pPri
166b0 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  or->pLimit ){.  
166c0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
166d0 67 28 70 50 61 72 73 65 2c 22 25 73 20 63 6c 61  g(pParse,"%s cla
166e0 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20  use should come 
166f0 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66  after %s not bef
16700 6f 72 65 22 2c 0a 20 20 20 20 20 20 70 50 72 69  ore",.      pPri
16710 6f 72 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20  or->pOrderBy!=0 
16720 3f 20 22 4f 52 44 45 52 20 42 59 22 20 3a 20 22  ? "ORDER BY" : "
16730 4c 49 4d 49 54 22 2c 20 73 65 6c 65 63 74 4f 70  LIMIT", selectOp
16740 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
16750 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
16760 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
16770 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20  end;.  }..  v = 
16780 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
16790 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
167a0 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68  ( v!=0 );  /* Th
167b0 65 20 56 44 42 45 20 61 6c 72 65 61 64 79 20 63  e VDBE already c
167c0 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69 6e  reated by callin
167d0 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20  g function */.. 
167e0 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 64   /* Create the d
167f0 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f  estination tempo
16800 72 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65  rary table if ne
16810 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69  cessary.  */.  i
16820 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
16830 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20  RT_EphemTab ){. 
16840 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
16850 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69  List );.    sqli
16860 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16870 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
16880 6c 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c  l, dest.iSDParm,
16890 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
168a0 72 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65  r);.    dest.eDe
168b0 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a  st = SRT_Table;.
168c0 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61    }..  /* Specia
168d0 6c 20 68 61 6e 64 6c 69 6e 67 20 66 6f 72 20 61  l handling for a
168e0 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74   compound-select
168f0 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73   that originates
16900 20 61 73 20 61 20 56 41 4c 55 45 53 20 63 6c 61   as a VALUES cla
16910 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  use..  */.  if( 
16920 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
16930 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 7b 0a 20  _MultiValue ){. 
16940 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c     rc = multiSel
16950 65 63 74 56 61 6c 75 65 73 28 70 50 61 72 73 65  ectValues(pParse
16960 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  , p, &dest);.   
16970 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
16980 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
16990 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
169a0 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73  SELECTs in the s
169b0 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68  tatement have th
169c0 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
169d0 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69   elements.  ** i
169e0 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73  n their result s
169f0 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ets..  */.  asse
16a00 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26  rt( p->pEList &&
16a10 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20   pPrior->pEList 
16a20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
16a30 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70  pEList->nExpr==p
16a40 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e  Prior->pEList->n
16a50 45 78 70 72 20 29 3b 0a 0a 23 69 66 6e 64 65 66  Expr );..#ifndef
16a60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
16a70 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
16a80 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
16a90 65 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  e ){.    generat
16aa0 65 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75  eWithRecursiveQu
16ab0 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ery(pParse, p, &
16ac0 64 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  dest);.  }else.#
16ad0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70  endif..  /* Comp
16ae0 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68 61  ound SELECTs tha
16af0 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  t have an ORDER 
16b00 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 68 61  BY clause are ha
16b10 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79  ndled separately
16b20 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
16b30 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
16b40 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65  return multiSele
16b50 63 74 4f 72 64 65 72 42 79 28 70 50 61 72 73 65  ctOrderBy(pParse
16b60 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d  , p, pDest);.  }
16b70 65 6c 73 65 7b 0a 0a 23 69 66 6e 64 65 66 20 53  else{..#ifndef S
16b80 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
16b90 49 4e 0a 20 20 20 20 69 66 28 20 70 50 72 69 6f  IN.    if( pPrio
16ba0 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a  r->pPrior==0 ){.
16bb0 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65        ExplainQue
16bc0 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
16bd0 31 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 51 55 45  1, "COMPOUND QUE
16be0 52 59 22 29 29 3b 0a 20 20 20 20 20 20 45 78 70  RY"));.      Exp
16bf0 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
16c00 50 61 72 73 65 2c 20 31 2c 20 22 4c 45 46 54 2d  Parse, 1, "LEFT-
16c10 4d 4f 53 54 20 53 55 42 51 55 45 52 59 22 29 29  MOST SUBQUERY"))
16c20 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
16c30 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
16c40 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66  code for the lef
16c50 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45  t and right SELE
16c60 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  CT statements.. 
16c70 20 20 20 2a 2f 0a 20 20 20 20 73 77 69 74 63 68     */.    switch
16c80 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20  ( p->op ){.     
16c90 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a   case TK_ALL: {.
16ca0 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
16cb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
16cc0 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  t nLimit;.      
16cd0 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
16ce0 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20  r->pLimit );.   
16cf0 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69       pPrior->iLi
16d00 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b  mit = p->iLimit;
16d10 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d  .        pPrior-
16d20 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f  >iOffset = p->iO
16d30 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 70  ffset;.        p
16d40 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20  Prior->pLimit = 
16d50 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
16d60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
16d70 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
16d80 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20 20  rior, &dest);.  
16d90 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
16da0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
16db0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
16dc0 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
16dd0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
16de0 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72  }.        p->pPr
16df0 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ior = 0;.       
16e00 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72   p->iLimit = pPr
16e10 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  ior->iLimit;.   
16e20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
16e30 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65  = pPrior->iOffse
16e40 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
16e50 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
16e60 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
16e70 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
16e80 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 70 2d 3e 69  , OP_IfNot, p->i
16e90 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65  Limit); VdbeCove
16ea0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
16eb0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
16ec0 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20 69  v, "Jump ahead i
16ed0 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22  f LIMIT reached"
16ee0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ));.          if
16ef0 28 20 70 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a  ( p->iOffset ){.
16f00 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
16f10 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
16f20 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c   OP_OffsetLimit,
16f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
16f50 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f 66  ->iLimit, p->iOf
16f60 66 73 65 74 2b 31 2c 20 70 2d 3e 69 4f 66 66 73  fset+1, p->iOffs
16f70 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  et);.          }
16f80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16f90 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50     ExplainQueryP
16fa0 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20  lan((pParse, 1, 
16fb0 22 55 4e 49 4f 4e 20 41 4c 4c 22 29 29 3b 0a 20  "UNION ALL"));. 
16fc0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
16fd0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
16fe0 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  , p, &dest);.   
16ff0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
17000 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
17010 20 20 20 20 20 20 20 20 70 44 65 6c 65 74 65 20          pDelete 
17020 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
17030 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
17040 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20   pPrior;.       
17050 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
17060 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
17070 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c  d(p->nSelectRow,
17080 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
17090 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Row);.        if
170a0 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  ( pPrior->pLimit
170b0 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c  .         && sql
170c0 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
170d0 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  r(pPrior->pLimit
170e0 2d 3e 70 4c 65 66 74 2c 20 26 6e 4c 69 6d 69 74  ->pLeft, &nLimit
170f0 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 6e 4c  ).         && nL
17100 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53 65  imit>0 && p->nSe
17110 6c 65 63 74 52 6f 77 20 3e 20 73 71 6c 69 74 65  lectRow > sqlite
17120 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c 69  3LogEst((u64)nLi
17130 6d 69 74 29 20 0a 20 20 20 20 20 20 20 20 29 7b  mit) .        ){
17140 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 53  .          p->nS
17150 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
17160 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c  e3LogEst((u64)nL
17170 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  imit);.        }
17180 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
17190 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  r ){.          s
171a0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
171b0 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
171c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
171d0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
171e0 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
171f0 50 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 54  PT:.      case T
17200 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  K_UNION: {.     
17210 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b     int unionTab;
17220 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
17230 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70  mber of the temp
17240 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72   table holding r
17250 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 20  esult */.       
17260 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20   u8 op = 0;     
17270 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
17280 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20  SRT_ operations 
17290 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66  to apply to self
172a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
172b0 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20  priorOp;     /* 
172c0 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  The SRT_ operati
172d0 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  on to apply to p
172e0 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a  rior selects */.
172f0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
17300 69 6d 69 74 3b 20 20 20 20 2f 2a 20 53 61 76 65  imit;    /* Save
17310 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e  d values of p->n
17320 4c 69 6d 69 74 20 20 2a 2f 0a 20 20 20 20 20 20  Limit  */.      
17330 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
17340 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 75      SelectDest u
17350 6e 69 6f 6e 64 65 73 74 3b 0a 20 20 0a 20 20 20  niondest;.  .   
17360 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
17370 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ->op==TK_EXCEPT 
17380 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
17390 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ase( p->op==TK_U
173a0 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  NION );.        
173b0 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e  priorOp = SRT_Un
173c0 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ion;.        if(
173d0 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69   dest.eDest==pri
173e0 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  orOp ){.        
173f0 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73    /* We can reus
17400 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  e a temporary ta
17410 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ble generated by
17420 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72   a SELECT to our
17430 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 69  .          ** ri
17440 67 68 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ght..          *
17450 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
17460 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30  rt( p->pLimit==0
17470 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20   );      /* Not 
17480 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77  allowed on leftw
17490 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ard elements */.
174a0 20 20 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54            unionT
174b0 61 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72  ab = dest.iSDPar
174c0 6d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  m;.        }else
174d0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
174e0 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  e will need to c
174f0 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65  reate our own te
17500 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f  mporary table to
17510 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20   hold the.      
17520 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69      ** intermedi
17530 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20  ate results..   
17540 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
17550 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70      unionTab = p
17560 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
17570 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
17580 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
17590 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  );.          add
175a0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
175b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
175c0 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e  Ephemeral, union
175d0 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
175e0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
175f0 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
17600 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20   -1 );.         
17610 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
17620 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [0] = addr;.    
17630 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d        findRightm
17640 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73  ost(p)->selFlags
17650 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
17660 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  eral;.          
17670 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
17680 74 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t );.        }. 
17690 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64   .        /* Cod
176a0 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
176b0 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c  tements to our l
176c0 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  eft.        */. 
176d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
176e0 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
176f0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
17700 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
17710 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72  t(&uniondest, pr
17720 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29  iorOp, unionTab)
17730 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
17740 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
17750 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e  rse, pPrior, &un
17760 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20  iondest);.      
17770 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
17780 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
17790 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
177a0 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
177b0 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
177c0 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61  rrent SELECT sta
177d0 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  tement.        *
177e0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  /.        if( p-
177f0 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29  >op==TK_EXCEPT )
17800 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 20 3d  {.          op =
17810 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20   SRT_Except;.   
17820 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17830 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
17840 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
17850 0a 20 20 20 20 20 20 20 20 20 20 6f 70 20 3d 20  .          op = 
17860 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20  SRT_Union;.     
17870 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e     }.        p->
17880 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
17890 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e      pLimit = p->
178a0 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  pLimit;.        
178b0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
178c0 20 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74         uniondest
178d0 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20  .eDest = op;.   
178e0 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72       ExplainQuer
178f0 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31  yPlan((pParse, 1
17900 2c 20 22 25 73 20 55 53 49 4e 47 20 54 45 4d 50  , "%s USING TEMP
17910 20 42 2d 54 52 45 45 22 2c 0a 20 20 20 20 20 20   B-TREE",.      
17920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17930 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
17940 28 70 2d 3e 6f 70 29 29 29 3b 0a 20 20 20 20 20  (p->op)));.     
17950 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
17960 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
17970 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20   &uniondest);.  
17980 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17990 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
179a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72  .        /* Quer
179b0 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20  y flattening in 
179c0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20  sqlite3Select() 
179d0 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e  might refill p->
179e0 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20 20  pOrderBy..      
179f0 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20    ** Be sure to 
17a00 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72  delete p->pOrder
17a10 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74  By, therefore, t
17a20 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79  o avoid a memory
17a30 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20   leak. */.      
17a40 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
17a50 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
17a60 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
17a70 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
17a80 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 70  Prior;.        p
17a90 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
17aa0 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4f  r;.        p->pO
17ab0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
17ac0 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
17ad0 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 20  K_UNION ){.     
17ae0 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
17af0 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
17b00 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74  stAdd(p->nSelect
17b10 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65  Row, pPrior->nSe
17b20 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  lectRow);.      
17b30 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
17b40 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
17b50 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
17b60 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
17b70 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = pLimit;.      
17b80 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b    p->iLimit = 0;
17b90 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  .        p->iOff
17ba0 73 65 74 20 3d 20 30 3b 0a 20 20 0a 20 20 20 20  set = 0;.  .    
17bb0 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74      /* Convert t
17bc0 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  he data in the t
17bd0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
17be0 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72  nto whatever for
17bf0 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  m.        ** it 
17c00 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65  is that we curre
17c10 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20  ntly need..     
17c20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
17c30 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d  sert( unionTab==
17c40 64 65 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20  dest.iSDParm || 
17c50 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f  dest.eDest!=prio
17c60 72 4f 70 20 29 3b 0a 20 20 20 20 20 20 20 20 69  rOp );.        i
17c70 66 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70  f( dest.eDest!=p
17c80 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20  riorOp ){.      
17c90 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
17ca0 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
17cb0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
17cc0 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
17cd0 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d          iBreak =
17ce0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
17cf0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
17d00 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
17d10 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
17d20 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  (v);.          c
17d30 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
17d40 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
17d50 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
17d60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17d70 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
17d80 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72  d, unionTab, iBr
17d90 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
17da0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
17db0 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
17dc0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
17dd0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  (v);.          s
17de0 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
17df0 50 61 72 73 65 2c 20 70 2c 20 75 6e 69 6f 6e 54  Parse, p, unionT
17e00 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab,.            
17e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
17e20 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74   0, &dest, iCont
17e30 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
17e40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17e50 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
17e60 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  iCont);.        
17e70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17e80 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
17e90 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74  unionTab, iStart
17ea0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
17eb0 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  v);.          sq
17ec0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
17ed0 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29  Label(v, iBreak)
17ee0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
17ef0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17f00 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e   OP_Close, union
17f10 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
17f20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
17f30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17f40 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28  default: assert(
17f50 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52   p->op==TK_INTER
17f60 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20  SECT ); {.      
17f70 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32    int tab1, tab2
17f80 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  ;.        int iC
17f90 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
17fa0 61 72 74 3b 0a 20 20 20 20 20 20 20 20 45 78 70  art;.        Exp
17fb0 72 20 2a 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  r *pLimit;.     
17fc0 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
17fd0 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
17fe0 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20  intersectdest;. 
17ff0 20 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20         int r1;. 
18000 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 54   .        /* INT
18010 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65 72  ERSECT is differ
18020 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68  ent from the oth
18030 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65 71  ers since it req
18040 75 69 72 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  uires.        **
18050 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74   two temporary t
18060 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74  ables.  Hence it
18070 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73   has its own cas
18080 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20  e.  Begin.      
18090 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69    ** by allocati
180a0 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65  ng the tables we
180b0 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20   will need..    
180c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 74      */.        t
180d0 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab1 = pParse->nT
180e0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 74 61  ab++;.        ta
180f0 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b2 = pParse->nTa
18100 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  b++;.        ass
18110 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
18120 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20 20 20  ==0 );.  .      
18130 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
18140 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18150 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
18160 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
18170 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
18180 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
18190 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  -1 );.        p-
181a0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
181b0 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20   = addr;.       
181c0 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70   findRightmost(p
181d0 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  )->selFlags |= S
181e0 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
181f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
18200 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
18210 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  .        /* Code
18220 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20   the SELECTs to 
18230 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65  our left into te
18240 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
18250 61 62 31 22 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ab1"..        */
18260 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18270 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
18280 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 53  intersectdest, S
18290 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b  RT_Union, tab1);
182a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
182b0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
182c0 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74  se, pPrior, &int
182d0 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
182e0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
182f0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75           goto mu
18300 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
18310 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20          }.  .   
18320 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
18330 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
18340 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
18350 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20  able "tab2".    
18360 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
18370 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
18380 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
18390 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62  enEphemeral, tab
183a0 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  2, 0);.        a
183b0 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
183c0 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20  enEphm[1] == -1 
183d0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64  );.        p->ad
183e0 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
183f0 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 70 2d  addr;.        p-
18400 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
18410 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
18420 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20  >pLimit;.       
18430 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
18440 20 20 20 20 20 20 20 20 69 6e 74 65 72 73 65 63          intersec
18450 74 64 65 73 74 2e 69 53 44 50 61 72 6d 20 3d 20  tdest.iSDParm = 
18460 74 61 62 32 3b 0a 20 20 20 20 20 20 20 20 45 78  tab2;.        Ex
18470 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
18480 70 50 61 72 73 65 2c 20 31 2c 20 22 25 73 20 55  pParse, 1, "%s U
18490 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45  SING TEMP B-TREE
184a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
184b0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 6c               sel
184c0 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
184d0 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
184e0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
184f0 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72  Parse, p, &inter
18500 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20  sectdest);.     
18510 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
18520 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
18530 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20        pDelete = 
18540 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  p->pPrior;.     
18550 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
18560 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69  Prior;.        i
18570 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
18580 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74  >pPrior->nSelect
18590 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Row ){.         
185a0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
185b0 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
185c0 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Row;.        }. 
185d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
185e0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
185f0 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20  pLimit);.       
18600 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
18610 6d 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  mit;.  .        
18620 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
18630 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74   to take the int
18640 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  ersection of the
18650 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20   two temporary. 
18660 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73         ** tables
18670 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
18680 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
18690 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
186a0 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
186b0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
186c0 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e  v);.        iCon
186d0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
186e0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
186f0 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
18700 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
18710 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20  e, p, iBreak);. 
18720 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18730 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
18740 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72  ewind, tab1, iBr
18750 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
18760 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 72  ge(v);.        r
18770 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
18780 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
18790 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
187a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
187b0 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c  2(v, OP_RowData,
187c0 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20   tab1, r1);.    
187d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
187e0 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e  ddOp4Int(v, OP_N
187f0 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69  otFound, tab2, i
18800 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 0a 20 20  Cont, r1, 0);.  
18810 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
18820 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
18830 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
18840 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
18850 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74  ;.        select
18860 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
18870 2c 20 70 2c 20 74 61 62 31 2c 0a 20 20 20 20 20  , p, tab1,.     
18880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18890 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20     0, 0, &dest, 
188a0 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a  iCont, iBreak);.
188b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
188c0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
188d0 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
188e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
188f0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
18900 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 20   tab1, iStart); 
18910 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
18920 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18930 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
18940 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
18950 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18960 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
18970 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  se, tab2, 0);.  
18980 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18990 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
189a0 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  ose, tab1, 0);. 
189b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
189c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
189d0 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
189e0 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20  OMIT_EXPLAIN.   
189f0 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30   if( p->pNext==0
18a00 20 29 7b 0a 20 20 20 20 20 20 45 78 70 6c 61 69   ){.      Explai
18a10 6e 51 75 65 72 79 50 6c 61 6e 50 6f 70 28 70 50  nQueryPlanPop(pP
18a20 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 23  arse);.    }.  #
18a30 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20 2f  endif.  }.  .  /
18a40 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74  * Compute collat
18a50 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73  ing sequences us
18a60 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70  ed by .  ** temp
18a70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65  orary tables nee
18a80 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ded to implement
18a90 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
18aa0 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63  lect..  ** Attac
18ab0 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  h the KeyInfo st
18ac0 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74  ructure to all t
18ad0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
18ae0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
18af0 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62  section is run b
18b00 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  y the right-most
18b10 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
18b20 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c  t only..  ** SEL
18b30 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
18b40 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79  o the left alway
18b50 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  s skip this part
18b60 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  .  The right-mos
18b70 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69  t.  ** SELECT mi
18b80 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68  ght also skip th
18b90 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68 61  is part if it ha
18ba0 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
18bb0 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f  ause and.  ** no
18bc0 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65   temp tables are
18bd0 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a   required..  */.
18be0 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
18bf0 73 20 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d  s & SF_UsesEphem
18c00 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  eral ){.    int 
18c10 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
18c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
18c30 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
18c40 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
18c50 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fo;            /
18c60 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
18c70 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73  ence for the res
18c80 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53  ult set */.    S
18c90 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20  elect *pLoop;   
18ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18cb0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  For looping thro
18cc0 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65  ugh SELECT state
18cd0 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c  ments */.    Col
18ce0 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20  lSeq **apColl;  
18cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
18d00 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
18d10 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  h pKeyInfo->aCol
18d20 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  l[] */.    int n
18d30 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
18d40 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
18d50 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
18d60 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a   result set */..
18d70 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
18d80 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e  Next==0 );.    n
18d90 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  Col = p->pEList-
18da0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79  >nExpr;.    pKey
18db0 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
18dc0 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
18dd0 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  Col, 1);.    if(
18de0 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20   !pKeyInfo ){.  
18df0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18e00 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
18e10 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
18e20 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
18e30 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f     for(i=0, apCo
18e40 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  ll=pKeyInfo->aCo
18e50 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c  ll; i<nCol; i++,
18e60 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20   apColl++){.    
18e70 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74    *apColl = mult
18e80 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
18e90 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20  Parse, p, i);.  
18ea0 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f      if( 0==*apCo
18eb0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61  ll ){.        *a
18ec0 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
18ed0 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  tColl;.      }. 
18ee0 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c     }..    for(pL
18ef0 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c  oop=p; pLoop; pL
18f00 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f  oop=pLoop->pPrio
18f10 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  r){.      for(i=
18f20 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<2; i++){.  
18f30 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
18f40 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e   pLoop->addrOpen
18f50 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Ephm[i];.       
18f60 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20   if( addr<0 ){. 
18f70 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b           /* If [
18f80 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68 65  0] is unused the
18f90 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e  n [1] is also un
18fa0 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e  used.  So we can
18fb0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  .          ** al
18fc0 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72  ways safely abor
18fd0 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65  t as soon as the
18fe0 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c   first unused sl
18ff0 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20  ot is found */. 
19000 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
19010 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e   pLoop->addrOpen
19020 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20  Ephm[1]<0 );.   
19030 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
19040 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
19050 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
19060 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f  eP2(v, addr, nCo
19070 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
19080 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
19090 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29  v, addr, (char*)
190a0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
190b0 66 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20 20  f(pKeyInfo),.   
190c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190d0 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49           P4_KEYI
190e0 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  NFO);.        pL
190f0 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
19100 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20  m[i] = -1;.     
19110 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
19120 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
19130 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a  (pKeyInfo);.  }.
19140 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e  .multi_select_en
19150 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73  d:.  pDest->iSds
19160 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a  t = dest.iSdst;.
19170 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d    pDest->nSdst =
19180 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73   dest.nSdst;.  s
19190 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
191a0 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b  te(db, pDelete);
191b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
191c0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
191d0 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
191e0 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ELECT */../*.** 
191f0 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f  Error message fo
19200 72 20 77 68 65 6e 20 74 77 6f 20 6f 72 20 6d 6f  r when two or mo
19210 72 65 20 74 65 72 6d 73 20 6f 66 20 61 20 63 6f  re terms of a co
19220 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 68 61  mpound select ha
19230 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ve different.** 
19240 73 69 7a 65 20 72 65 73 75 6c 74 20 73 65 74 73  size result sets
19250 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
19260 33 53 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54  3SelectWrongNumT
19270 65 72 6d 73 45 72 72 6f 72 28 50 61 72 73 65 20  ermsError(Parse 
19280 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
19290 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73 65  *p){.  if( p->se
192a0 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75  lFlags & SF_Valu
192b0 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  es ){.    sqlite
192c0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
192d0 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75  , "all VALUES mu
192e0 73 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  st have the same
192f0 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   number of terms
19300 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ");.  }else{.   
19310 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
19320 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54  (pParse, "SELECT
19330 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e  s to the left an
19340 64 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20  d right of %s". 
19350 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61       " do not ha
19360 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
19370 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
19380 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e  umns", selectOpN
19390 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d  ame(p->op));.  }
193a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  .}../*.** Code a
193b0 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  n output subrout
193c0 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74  ine for a corout
193d0 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ine implementati
193e0 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43  on of a.** SELEC
193f0 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a  T statment..**.*
19400 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65  * The data to be
19410 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61   output is conta
19420 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64  ined in pIn->iSd
19430 73 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a  st.  There are.*
19440 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c  * pIn->nSdst col
19450 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75  umns to be outpu
19460 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68 65  t.  pDest is whe
19470 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73 68  re the output sh
19480 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e  ould.** be sent.
19490 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e  .**.** regReturn
194a0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
194b0 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20 68  f the register h
194c0 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f  olding the subro
194d0 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20  utine.** return 
194e0 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49  address..**.** I
194f0 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e  f regPrev>0 then
19500 20 69 74 20 69 73 20 74 68 65 20 66 69 72 73 74   it is the first
19510 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 76   register in a v
19520 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65  ector that.** re
19530 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69 6f  cords the previo
19540 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b  us output.  mem[
19550 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c  regPrev] is a fl
19560 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73 65  ag that is false
19570 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 73  .** if there has
19580 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75   been no previou
19590 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65  s output.  If re
195a0 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64  gPrev>0 then cod
195b0 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65  e is.** generate
195c0 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64 75  d to suppress du
195d0 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49  plicates.  pKeyI
195e0 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20  nfo is used for 
195f0 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79  comparing.** key
19600 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
19610 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70  LIMIT found in p
19620 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63  ->iLimit is reac
19630 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69  hed, jump immedi
19640 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65  ately to.** iBre
19650 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ak..*/.static in
19660 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  t generateOutput
19670 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61  Subroutine(.  Pa
19680 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
19690 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
196a0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
196b0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
196c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
196d0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
196e0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
196f0 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  In,        /* Co
19700 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e  routine supplyin
19710 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65  g data */.  Sele
19720 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
19730 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
19740 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f  send the data */
19750 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e  .  int regReturn
19760 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
19770 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  e return address
19780 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
19790 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20 20  nt regPrev,     
197a0 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
197b0 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73 74  us result regist
197c0 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65  er.  No uniquene
197d0 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79  ss if 0 */.  Key
197e0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
197f0 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70       /* For comp
19800 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76 69  aring with previ
19810 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69  ous entry */.  i
19820 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20  nt iBreak       
19830 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
19840 65 72 65 20 69 66 20 77 65 20 68 69 74 20 74 68  ere if we hit th
19850 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20  e LIMIT */.){.  
19860 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
19870 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
19880 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20  Continue;.  int 
19890 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20  addr;..  addr = 
198a0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
198b0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f  ntAddr(v);.  iCo
198c0 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
198d0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
198e0 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73  ;..  /* Suppress
198f0 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20   duplicates for 
19900 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61  UNION, EXCEPT, a
19910 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20  nd INTERSECT .  
19920 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76  */.  if( regPrev
19930 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
19940 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 61 64  1, addr2;.    ad
19950 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
19960 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
19970 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 20 56  Not, regPrev); V
19980 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19990 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69      addr2 = sqli
199a0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
199b0 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e   OP_Compare, pIn
199c0 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76  ->iSdst, regPrev
199d0 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a  +1, pIn->nSdst,.
199e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
19a00 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49  har*)sqlite3KeyI
19a10 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29  nfoRef(pKeyInfo)
19a20 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
19a30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19a40 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
19a50 20 61 64 64 72 32 2b 32 2c 20 69 43 6f 6e 74 69   addr2+2, iConti
19a60 6e 75 65 2c 20 61 64 64 72 32 2b 32 29 3b 20 56  nue, addr2+2); V
19a70 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19a80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
19a90 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
19aa0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
19ab0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
19ac0 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  opy, pIn->iSdst,
19ad0 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d   regPrev+1, pIn-
19ae0 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20 73  >nSdst-1);.    s
19af0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19b00 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
19b10 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d  1, regPrev);.  }
19b20 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
19b30 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
19b40 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
19b50 2a 20 53 75 70 70 72 65 73 73 20 74 68 65 20 66  * Suppress the f
19b60 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72  irst OFFSET entr
19b70 69 65 73 20 69 66 20 74 68 65 72 65 20 69 73 20  ies if there is 
19b80 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  an OFFSET clause
19b90 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73  .  */.  codeOffs
19ba0 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
19bb0 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20  , iContinue);.. 
19bc0 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e   assert( pDest->
19bd0 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74  eDest!=SRT_Exist
19be0 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  s );.  assert( p
19bf0 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
19c00 5f 54 61 62 6c 65 20 29 3b 0a 20 20 73 77 69 74  _Table );.  swit
19c10 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  ch( pDest->eDest
19c20 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65   ){.    /* Store
19c30 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64   the result as d
19c40 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71  ata using a uniq
19c50 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20  ue key..    */. 
19c60 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
19c70 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e  mTab: {.      in
19c80 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
19c90 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
19ca0 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d  ;.      int r2 =
19cb0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
19cc0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
19cd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19ce0 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
19cf0 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74  cord, pIn->iSdst
19d00 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31  , pIn->nSdst, r1
19d10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19d20 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19d30 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74  _NewRowid, pDest
19d40 2d 3e 69 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a  ->iSDParm, r2);.
19d50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19d60 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
19d70 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44  sert, pDest->iSD
19d80 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20  Parm, r1, r2);. 
19d90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19da0 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
19db0 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
19dc0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
19dd0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
19de0 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r2);.      sqlit
19df0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
19e00 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
19e10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19e20 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
19e30 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
19e40 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
19e50 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66  creating a set f
19e60 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28  or an "expr IN (
19e70 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a 20 20  SELECT ...)"..  
19e80 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
19e90 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69  T_Set: {.      i
19ea0 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 74 65 73  nt r1;.      tes
19eb0 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73  tcase( pIn->nSds
19ec0 74 3e 31 20 29 3b 0a 20 20 20 20 20 20 72 31 20  t>1 );.      r1 
19ed0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
19ee0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
19ef0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19f00 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
19f10 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73  ecord, pIn->iSds
19f20 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 0a  t, pIn->nSdst, .
19f30 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 70 44            r1, pD
19f40 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20 70  est->zAffSdst, p
19f50 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
19f60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19f70 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78  Op4Int(v, OP_Idx
19f80 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69  Insert, pDest->i
19f90 53 44 50 61 72 6d 2c 20 72 31 2c 0a 20 20 20 20  SDParm, r1,.    
19fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fb0 20 20 20 20 20 20 20 70 49 6e 2d 3e 69 53 64 73         pIn->iSds
19fc0 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  t, pIn->nSdst);.
19fd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
19fe0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
19ff0 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
1a000 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1a010 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
1a020 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
1a030 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
1a040 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
1a050 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
1a060 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
1a070 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
1a080 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62  emory cell and b
1a090 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20  reak out.    ** 
1a0a0 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70  of the scan loop
1a0b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1a0c0 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
1a0d0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e     assert( pIn->
1a0e0 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61 72  nSdst==1 || pPar
1a0f0 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 20 20 74  se->nErr>0 );  t
1a100 65 73 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53  estcase( pIn->nS
1a110 64 73 74 21 3d 31 20 29 3b 0a 20 20 20 20 20 20  dst!=1 );.      
1a120 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
1a130 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  ove(pParse, pIn-
1a140 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69  >iSdst, pDest->i
1a150 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20  SDParm, 1);.    
1a160 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
1a170 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20  lause will jump 
1a180 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
1a190 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
1a1a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
1a1b0 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
1a1c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1a1d0 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54  ERY */..    /* T
1a1e0 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  he results are s
1a1f0 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65  tored in a seque
1a200 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nce of registers
1a210 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67  .    ** starting
1a220 20 61 74 20 70 44 65 73 74 2d 3e 69 53 64 73 74   at pDest->iSdst
1a230 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d 72  .  Then the co-r
1a240 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20  outine yields.. 
1a250 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1a260 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a  RT_Coroutine: {.
1a270 20 20 20 20 20 20 69 66 28 20 70 44 65 73 74 2d        if( pDest-
1a280 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20  >iSdst==0 ){.   
1a290 20 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73       pDest->iSds
1a2a0 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  t = sqlite3GetTe
1a2b0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
1a2c0 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
1a2d0 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64 73       pDest->nSds
1a2e0 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a  t = pIn->nSdst;.
1a2f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1a300 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
1a310 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
1a320 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 64  Sdst, pDest->iSd
1a330 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
1a340 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1a350 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
1a360 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44  ield, pDest->iSD
1a370 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65  Parm);.      bre
1a380 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1a390 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65  * If none of the
1a3a0 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65   above, then the
1a3b0 20 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61 74   result destinat
1a3c0 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20 20  ion must be.    
1a3d0 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20 20  ** SRT_Output.  
1a3e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1a3f0 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74  never called wit
1a400 68 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20 20  h any other.    
1a410 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f  ** destination o
1a420 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e  ther than the on
1a430 65 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76 65  es handled above
1a440 20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a   or SRT_Output..
1a450 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
1a460 72 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72 65  r SRT_Output, re
1a470 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64  sults are stored
1a480 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f   in a sequence o
1a490 66 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a 20  f registers.  . 
1a4a0 20 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f     ** Then the O
1a4b0 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f  P_ResultRow opco
1a4c0 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 61  de is used to ca
1a4d0 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  use sqlite3_step
1a4e0 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74  () to.    ** ret
1a4f0 75 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f 77  urn the next row
1a500 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20 20   of result..    
1a510 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  */.    default: 
1a520 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1a530 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
1a540 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
1a550 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a560 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
1a570 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  Row, pIn->iSdst,
1a580 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
1a590 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1a5a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
1a5b0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1a5c0 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49  e loop if the LI
1a5d0 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a  MIT is reached..
1a5e0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c    */.  if( p->iL
1a5f0 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
1a600 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a610 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f   OP_DecrJumpZero
1a620 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72  , p->iLimit, iBr
1a630 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
1a640 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ge(v);.  }..  /*
1a650 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 75   Generate the su
1a660 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a  broutine return.
1a670 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1a680 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1a690 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
1a6a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a6b0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
1a6c0 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72  regReturn);..  r
1a6d0 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
1a6e0 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65  *.** Alternative
1a6f0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1a700 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
1a710 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20 74  for cases when t
1a720 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52  here.** is an OR
1a730 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a  DER BY clause..*
1a740 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61  *.** We assume a
1a750 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f   query of the fo
1a760 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a  llowing form:.**
1a770 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74  .**      <select
1a780 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20  A>  <operator>  
1a790 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52  <selectB>  ORDER
1a7a0 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74   BY <orderbylist
1a7b0 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f  >.**.** <operato
1a7c0 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49  r> is one of UNI
1a7d0 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45  ON ALL, UNION, E
1a7e0 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53  XCEPT, or INTERS
1a7f0 45 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a  ECT.  The idea.*
1a800 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74  * is to code bot
1a810 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20  h <selectA> and 
1a820 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74  <selectB> with t
1a830 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1a840 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74  se as.** co-rout
1a850 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20  ines.  Then run 
1a860 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20  the co-routines 
1a870 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20  in parallel and 
1a880 6d 65 72 67 65 20 74 68 65 20 72 65 73 75 6c 74  merge the result
1a890 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75  s.** into the ou
1a8a0 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69  tput.  In additi
1a8b0 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f  on to the two co
1a8c0 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64  routines (called
1a8d0 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20   selectA and.** 
1a8e0 73 65 6c 65 63 74 42 29 20 74 68 65 72 65 20 61  selectB) there a
1a8f0 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73  re 7 subroutines
1a900 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a  :.**.**    outA:
1a910 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74      Move the out
1a920 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63  put of the selec
1a930 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74  tA coroutine int
1a940 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  o the output.** 
1a950 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
1a960 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
1a970 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42  y..**.**    outB
1a980 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75  :    Move the ou
1a990 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65  tput of the sele
1a9a0 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e  ctB coroutine in
1a9b0 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  to the output.**
1a9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
1a9d0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
1a9e0 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72  ry.  (Only gener
1a9f0 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61  ated for UNION a
1aa00 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nd.**           
1aa10 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58    UNION ALL.  EX
1aa20 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53  CEPT and INSERTS
1aa30 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74  ECT never output
1aa40 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20   a row that.**  
1aa50 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 61             appea
1aa60 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a  rs only in B.).*
1aa70 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20  *.**    AltB:   
1aa80 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
1aa90 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
1aaa0 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
1aab0 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20  and A<B..**.**  
1aac0 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65    AeqB:    Calle
1aad0 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
1aae0 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
1aaf0 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d  oroutines and A=
1ab00 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74  =B..**.**    Agt
1ab10 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
1ab20 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
1ab30 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
1ab40 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a  ines and A>B..**
1ab50 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20  .**    EofA:    
1ab60 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61  Called when data
1ab70 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72   is exhausted fr
1ab80 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a  om selectA..**.*
1ab90 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61  *    EofB:    Ca
1aba0 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69  lled when data i
1abb0 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d  s exhausted from
1abc0 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20   selectB..**.** 
1abd0 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
1abe0 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72  on of the latter
1abf0 20 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65   five subroutine
1ac00 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63  s depend on whic
1ac10 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e  h .** <operator>
1ac20 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a   is used:.**.**.
1ac30 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
1ac40 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20  NION ALL        
1ac50 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20   UNION          
1ac60 20 20 45 58 43 45 50 54 20 20 20 20 20 20 20 20    EXCEPT        
1ac70 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20    INTERSECT.**  
1ac80 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d          --------
1ac90 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
1aca0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
1acb0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
1acc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
1acd0 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e   AltB:   outA, n
1ace0 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20  extA      outA, 
1acf0 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41  nextA       outA
1ad00 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
1ad10 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65  nextA.**.**   Ae
1ad20 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  qB:   outA, next
1ad30 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20  A         nextA 
1ad40 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
1ad50 41 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20  A         outA, 
1ad60 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67  nextA.**.**   Ag
1ad70 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74  tB:   outB, next
1ad80 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78  B      outB, nex
1ad90 74 42 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  tB          next
1ada0 42 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78  B            nex
1adb0 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a  tB.**.**   EofA:
1adc0 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
1add0 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
1ade0 20 20 20 20 20 20 20 20 20 68 61 6c 74 20 20 20           halt   
1adf0 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a            halt.*
1ae00 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f  *.**   EofB:   o
1ae10 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
1ae20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
1ae30 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
1ae40 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a        halt.**.**
1ae50 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65   In the AltB, Ae
1ae60 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62  qB, and AgtB sub
1ae70 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46  routines, an EOF
1ae80 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20   on A following 
1ae90 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20  nextA.** causes 
1aea0 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d  an immediate jum
1aeb0 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e  p to EofA and an
1aec0 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77   EOF on B follow
1aed0 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65 73  ing nextB causes
1aee0 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  .** an immediate
1aef0 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20   jump to EofB.  
1af00 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20  Within EofA and 
1af10 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e  EofB, and EOF on
1af20 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c   entry or.** fol
1af30 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75  lowing nextX cau
1af40 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68  ses a jump to th
1af50 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c  e end of the sel
1af60 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  ect processing..
1af70 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20  **.** Duplicate 
1af80 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55  removal in the U
1af90 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
1afa0 64 20 49 4e 54 45 52 53 45 43 54 20 63 61 73 65  d INTERSECT case
1afb0 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20  s is handled.** 
1afc0 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75  within the outpu
1afd0 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54  t subroutine.  T
1afe0 68 65 20 72 65 67 50 72 65 76 20 72 65 67 69 73  he regPrev regis
1aff0 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68  ter set holds th
1b000 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  e previously.** 
1b010 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41  output value.  A
1b020 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d   comparison is m
1b030 61 64 65 20 61 67 61 69 6e 73 74 20 74 68 69 73  ade against this
1b040 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f   value and the o
1b050 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70  utput.** is skip
1b060 70 65 64 20 69 66 20 74 68 65 20 6e 65 78 74 20  ped if the next 
1b070 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65  results would be
1b080 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
1b090 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a   previous..**.**
1b0a0 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
1b0b0 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69  ion plan is to i
1b0c0 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f  mplement the two
1b0d0 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
1b0e0 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74  seven.** subrout
1b0f0 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e  ines first, then
1b100 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c   put the control
1b110 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f   logic at the bo
1b120 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73  ttom.  Like this
1b130 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1b140 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20   goto Init.**   
1b150 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65    coA: coroutine
1b160 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20   for left query 
1b170 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20  (A).**     coB: 
1b180 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69  coroutine for ri
1b190 67 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a  ght query (B).**
1b1a0 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74      outA: output
1b1b0 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a   one row of A.**
1b1c0 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74      outB: output
1b1d0 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55   one row of B (U
1b1e0 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41  NION and UNION A
1b1f0 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45  LL only).**    E
1b200 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45  ofA: ....**    E
1b210 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ofB: ....**    A
1b220 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ltB: ....**    A
1b230 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  eqB: ....**    A
1b240 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49  gtB: ....**    I
1b250 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20  nit: initialize 
1b260 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74  coroutine regist
1b270 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ers.**          
1b280 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20  yield coA.**    
1b290 20 20 20 20 20 20 69 66 20 65 6f 66 28 41 29 20        if eof(A) 
1b2a0 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20  goto EofA.**    
1b2b0 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a        yield coB.
1b2c0 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65  **          if e
1b2d0 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a  of(B) goto EofB.
1b2e0 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70  **    Cmpr: Comp
1b2f0 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20  are A, B.**     
1b300 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20       Jump AltB, 
1b310 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20  AeqB, AgtB.**   
1b320 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a    End: ....**.**
1b330 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41   We call AltB, A
1b340 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c  eqB, AgtB, EofA,
1b350 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f   and EofB "subro
1b360 75 74 69 6e 65 73 22 20 62 75 74 20 74 68 65 79  utines" but they
1b370 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75   are not.** actu
1b380 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e  ally called usin
1b390 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79  g Gosub and they
1b3a0 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20   do not Return. 
1b3b0 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c   EofA and EofB l
1b3c0 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c  oop.** until all
1b3d0 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
1b3e0 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  ed then jump to 
1b3f0 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20  the "end" labe. 
1b400 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20   AltB, AeqB,.** 
1b410 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f  and AgtB jump to
1b420 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f   either L2 or to
1b430 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20   one of EofA or 
1b440 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  EofB..*/.#ifndef
1b450 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
1b460 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61  POUND_SELECT.sta
1b470 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
1b480 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61  ectOrderBy(.  Pa
1b490 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1b4a0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1b4b0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
1b4c0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
1b4d0 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
1b4e0 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
1b4f0 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
1b500 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
1b510 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
1b520 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
1b530 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
1b540 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
1b550 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1b560 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63  nters */.  Selec
1b570 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20  t *pPrior;      
1b580 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
1b590 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
1b5a0 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
1b5b0 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
1b5c0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
1b5d0 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
1b5e0 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  DBE */.  SelectD
1b5f0 65 73 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f  est destA;     /
1b600 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f  * Destination fo
1b610 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f  r coroutine A */
1b620 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
1b630 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74  stB;     /* Dest
1b640 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f  ination for coro
1b650 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74  utine B */.  int
1b660 20 72 65 67 41 64 64 72 41 3b 20 20 20 20 20 20   regAddrA;      
1b670 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
1b680 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
1b690 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-A coroutine */
1b6a0 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b  .  int regAddrB;
1b6b0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1b6c0 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
1b6d0 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
1b6e0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
1b6f0 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20 2f  rSelectA;      /
1b700 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
1b710 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74   select-A corout
1b720 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
1b730 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20 2f  rSelectB;      /
1b740 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
1b750 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
1b760 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
1b770 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 20 2f  OutA;          /
1b780 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
1b790 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75  er for the outpu
1b7a0 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-A subroutine *
1b7b0 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42 3b  /.  int regOutB;
1b7c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1b7d0 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
1b7e0 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73  r the output-B s
1b7f0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
1b800 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20 20  nt addrOutA;    
1b810 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1b820 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20  of the output-A 
1b830 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
1b840 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20 30  int addrOutB = 0
1b850 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
1b860 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 42   of the output-B
1b870 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
1b880 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20 20   int addrEofA;  
1b890 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
1b8a0 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
1b8b0 41 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72  A-exhausted subr
1b8c0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1b8d0 61 64 64 72 45 6f 66 41 5f 6e 6f 42 3b 20 20 20  addrEofA_noB;   
1b8e0 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 65 20 61    /* Alternate a
1b8f0 64 64 72 45 6f 66 41 20 69 66 20 42 20 69 73 20  ddrEofA if B is 
1b900 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  uninitialized */
1b910 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42 3b  .  int addrEofB;
1b920 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1b930 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
1b940 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73 75  t-B-exhausted su
1b950 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
1b960 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20 20  t addrAltB;     
1b970 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
1b980 66 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f 75  f the A<B subrou
1b990 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
1b9a0 64 72 41 65 71 42 3b 20 20 20 20 20 20 20 20 20  drAeqB;         
1b9b0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
1b9c0 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e  e A==B subroutin
1b9d0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
1b9e0 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  gtB;         /* 
1b9f0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
1ba00 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  >B subroutine */
1ba10 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 41  .  int regLimitA
1ba20 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69  ;        /* Limi
1ba30 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  t register for s
1ba40 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74  elect-A */.  int
1ba50 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20 20   regLimitB;     
1ba60 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
1ba70 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
1ba80 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  A */.  int regPr
1ba90 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ev;          /* 
1baa0 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73  A range of regis
1bab0 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72 65  ters to hold pre
1bac0 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a  vious output */.
1bad0 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69 74    int savedLimit
1bae0 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  ;       /* Saved
1baf0 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69   value of p->iLi
1bb00 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  mit */.  int sav
1bb10 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  edOffset;      /
1bb20 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
1bb30 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20   p->iOffset */. 
1bb40 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20   int labelCmpr; 
1bb50 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
1bb60 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66  for the start of
1bb70 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f 72   the merge algor
1bb80 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  ithm */.  int la
1bb90 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20 20  belEnd;         
1bba0 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65  /* Label for the
1bbb0 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72   end of the over
1bbc0 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74 20  all SELECT stmt 
1bbd0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20  */.  int addr1; 
1bbe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
1bbf0 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  mp instructions 
1bc00 74 68 61 74 20 67 65 74 20 72 65 74 61 72 67 65  that get retarge
1bc10 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tted */.  int op
1bc20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bc30 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c  /* One of TK_ALL
1bc40 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  , TK_UNION, TK_E
1bc50 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53  XCEPT, TK_INTERS
1bc60 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  ECT */.  KeyInfo
1bc70 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f   *pKeyDup = 0; /
1bc80 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
1bc90 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75 70  ormation for dup
1bca0 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a  licate removal *
1bcb0 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
1bcc0 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d  yMerge;   /* Com
1bcd0 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74  parison informat
1bce0 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67 20  ion for merging 
1bcf0 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rows */.  sqlite
1bd00 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
1bd10 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
1bd20 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
1bd30 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
1bd40 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
1bd50 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
1bd60 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20  t nOrderBy;     
1bd70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1bd80 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52   terms in the OR
1bd90 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
1bda0 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65  .  int *aPermute
1bdb0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70  ;        /* Mapp
1bdc0 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20 42  ing from ORDER B
1bdd0 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75 6c  Y terms to resul
1bde0 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  t set columns */
1bdf0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ..  assert( p->p
1be00 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20  OrderBy!=0 );.  
1be10 61 73 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d  assert( pKeyDup=
1be20 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65  =0 ); /* "Manage
1be30 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68  d" code needs th
1be40 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38  is.  Ticket #338
1be50 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  2. */.  db = pPa
1be60 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70  rse->db;.  v = p
1be70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1be80 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20  assert( v!=0 ); 
1be90 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79        /* Already
1bea0 20 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f   thrown the erro
1beb0 72 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20  r if VDBE alloc 
1bec0 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65  failed */.  labe
1bed0 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  lEnd = sqlite3Vd
1bee0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1bef0 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71    labelCmpr = sq
1bf00 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1bf10 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61  el(v);...  /* Pa
1bf20 74 63 68 20 75 70 20 74 68 65 20 4f 52 44 45 52  tch up the ORDER
1bf30 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a   BY clause.  */.
1bf40 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a    op = p->op;  .
1bf50 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
1bf60 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20  rior;.  assert( 
1bf70 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
1bf80 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42  ==0 );.  pOrderB
1bf90 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
1bfa0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
1bfb0 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42  rBy );.  nOrderB
1bfc0 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  y = pOrderBy->nE
1bfd0 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f  xpr;..  /* For o
1bfe0 70 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74  perators other t
1bff0 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65  han UNION ALL we
1c000 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75   have to make su
1c010 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  re that.  ** the
1c020 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1c030 20 63 6f 76 65 72 73 20 65 76 65 72 79 20 74 65   covers every te
1c040 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rm of the result
1c050 20 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20   set.  Add.  ** 
1c060 74 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44  terms to the ORD
1c070 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 20  ER BY clause as 
1c080 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
1c090 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c    if( op!=TK_ALL
1c0a0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   ){.    for(i=1;
1c0b0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1c0c0 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45  d==0 && i<=p->pE
1c0d0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1c0e0 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
1c0f0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1c100 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28  Item;.      for(
1c110 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65  j=0, pItem=pOrde
1c120 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72  rBy->a; j<nOrder
1c130 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b  By; j++, pItem++
1c140 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1c150 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  t( pItem->u.x.iO
1c160 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20  rderByCol>0 );. 
1c170 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
1c180 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
1c190 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20  l==i ) break;.  
1c1a0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1c1b0 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20  j==nOrderBy ){. 
1c1c0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65         Expr *pNe
1c1d0 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  w = sqlite3Expr(
1c1e0 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20  db, TK_INTEGER, 
1c1f0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
1c200 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
1c210 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
1c220 50 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  PT;.        pNew
1c230 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e  ->flags |= EP_In
1c240 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20  tValue;.        
1c250 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d  pNew->u.iValue =
1c260 20 69 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70   i;.        p->p
1c270 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
1c280 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
1c290 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
1c2a0 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65  e, pOrderBy, pNe
1c2b0 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  w);.        if( 
1c2c0 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64 65  pOrderBy ) pOrde
1c2d0 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b  rBy->a[nOrderBy+
1c2e0 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  +].u.x.iOrderByC
1c2f0 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20  ol = (u16)i;.   
1c300 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1c310 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
1c320 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d   comparison perm
1c330 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69  utation and keyi
1c340 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73 65 64  nfo that is used
1c350 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70   with.  ** the p
1c360 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20  ermutation used 
1c370 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
1c380 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f  the next.  ** ro
1c390 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d  w of results com
1c3a0 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20  es from selectA 
1c3b0 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73  or selectB.  Als
1c3c0 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20  o add explicit. 
1c3d0 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74   ** collations t
1c3e0 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
1c3f0 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74  lause terms so t
1c400 68 61 74 20 77 68 65 6e 20 74 68 65 20 73 75 62  hat when the sub
1c410 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20  queries.  ** to 
1c420 74 68 65 20 72 69 67 68 74 20 61 6e 64 20 74 68  the right and th
1c430 65 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75  e left are evalu
1c440 61 74 65 64 2c 20 74 68 65 79 20 75 73 65 20 74  ated, they use t
1c450 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20  he correct.  ** 
1c460 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  collation..  */.
1c470 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c    aPermute = sql
1c480 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
1c490 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74  N(db, sizeof(int
1c4a0 29 2a 28 6e 4f 72 64 65 72 42 79 20 2b 20 31 29  )*(nOrderBy + 1)
1c4b0 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74  );.  if( aPermut
1c4c0 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  e ){.    struct 
1c4d0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1c4e0 49 74 65 6d 3b 0a 20 20 20 20 61 50 65 72 6d 75  Item;.    aPermu
1c4f0 74 65 5b 30 5d 20 3d 20 6e 4f 72 64 65 72 42 79  te[0] = nOrderBy
1c500 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70  ;.    for(i=1, p
1c510 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61  Item=pOrderBy->a
1c520 3b 20 69 3c 3d 6e 4f 72 64 65 72 42 79 3b 20 69  ; i<=nOrderBy; i
1c530 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1c540 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
1c550 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
1c560 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73  ol>0 );.      as
1c570 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78  sert( pItem->u.x
1c580 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d  .iOrderByCol<=p-
1c590 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
1c5a0 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74 65  ;.      aPermute
1c5b0 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78  [i] = pItem->u.x
1c5c0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31  .iOrderByCol - 1
1c5d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79  ;.    }.    pKey
1c5e0 4d 65 72 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c  Merge = multiSel
1c5f0 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66  ectOrderByKeyInf
1c600 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b  o(pParse, p, 1);
1c610 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b  .  }else{.    pK
1c620 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d  eyMerge = 0;.  }
1c630 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20  ..  /* Reattach 
1c640 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1c650 75 73 65 20 74 6f 20 74 68 65 20 71 75 65 72 79  use to the query
1c660 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64  ..  */.  p->pOrd
1c670 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
1c680 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  .  pPrior->pOrde
1c690 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
1c6a0 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65 2d  rListDup(pParse-
1c6b0 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20 30  >db, pOrderBy, 0
1c6c0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
1c6d0 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65 6d  e a range of tem
1c6e0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
1c6f0 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66 6f   and the KeyInfo
1c700 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72   needed.  ** for
1c710 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20   the logic that 
1c720 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61 74  removes duplicat
1c730 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77 68  e result rows wh
1c740 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72  en the.  ** oper
1c750 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45  ator is UNION, E
1c760 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53  XCEPT, or INTERS
1c770 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e 49  ECT (but not UNI
1c780 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20  ON ALL)..  */.  
1c790 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  if( op==TK_ALL )
1c7a0 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20  {.    regPrev = 
1c7b0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1c7c0 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70  int nExpr = p->p
1c7d0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
1c7e0 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72    assert( nOrder
1c7f0 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d  By>=nExpr || db-
1c800 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1c810 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70  .    regPrev = p
1c820 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
1c830 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
1c840 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20  += nExpr+1;.    
1c850 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1c860 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1c870 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20   0, regPrev);.  
1c880 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69    pKeyDup = sqli
1c890 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
1c8a0 64 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20  db, nExpr, 1);. 
1c8b0 20 20 20 69 66 28 20 70 4b 65 79 44 75 70 20 29     if( pKeyDup )
1c8c0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1c8d0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
1c8e0 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 44 75  Writeable(pKeyDu
1c8f0 70 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  p) );.      for(
1c900 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b  i=0; i<nExpr; i+
1c910 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79  +){.        pKey
1c920 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Dup->aColl[i] = 
1c930 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
1c940 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29  eq(pParse, p, i)
1c950 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75  ;.        pKeyDu
1c960 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  p->aSortOrder[i]
1c970 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1c980 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53    }.  }. .  /* S
1c990 65 70 61 72 61 74 65 20 74 68 65 20 6c 65 66 74  eparate the left
1c9a0 20 61 6e 64 20 74 68 65 20 72 69 67 68 74 20 71   and the right q
1c9b0 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e  uery from one an
1c9c0 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e  other.  */.  p->
1c9d0 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50  pPrior = 0;.  pP
1c9e0 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  rior->pNext = 0;
1c9f0 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  .  sqlite3Resolv
1ca00 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50  eOrderGroupBy(pP
1ca10 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64  arse, p, p->pOrd
1ca20 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a  erBy, "ORDER");.
1ca30 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50    if( pPrior->pP
1ca40 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73  rior==0 ){.    s
1ca50 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64  qlite3ResolveOrd
1ca60 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65  erGroupBy(pParse
1ca70 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72  , pPrior, pPrior
1ca80 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44  ->pOrderBy, "ORD
1ca90 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ER");.  }..  /* 
1caa0 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69  Compute the limi
1cab0 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20  t registers */. 
1cac0 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
1cad0 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
1cae0 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69  , labelEnd);.  i
1caf0 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20  f( p->iLimit && 
1cb00 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op==TK_ALL ){.  
1cb10 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b    regLimitA = ++
1cb20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1cb30 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b    regLimitB = ++
1cb40 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1cb50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cb60 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
1cb70 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e  p->iOffset ? p->
1cb80 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69  iOffset+1 : p->i
1cb90 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20  Limit,.         
1cba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbb0 20 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69           regLimi
1cbc0 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tA);.    sqlite3
1cbd0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1cbe0 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41  _Copy, regLimitA
1cbf0 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20  , regLimitB);.  
1cc00 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69  }else{.    regLi
1cc10 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42  mitA = regLimitB
1cc20 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
1cc30 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1cc40 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
1cc50 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a  p->pLimit = 0;..
1cc60 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70    regAddrA = ++p
1cc70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
1cc80 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72  egAddrB = ++pPar
1cc90 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f  se->nMem;.  regO
1cca0 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  utA = ++pParse->
1ccb0 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20  nMem;.  regOutB 
1ccc0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1ccd0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
1cce0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 41  tDestInit(&destA
1ccf0 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
1cd00 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71   regAddrA);.  sq
1cd10 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
1cd20 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f  nit(&destB, SRT_
1cd30 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
1cd40 64 72 42 29 3b 0a 0a 20 20 45 78 70 6c 61 69 6e  drB);..  Explain
1cd50 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
1cd60 65 2c 20 31 2c 20 22 4d 45 52 47 45 20 28 25 73  e, 1, "MERGE (%s
1cd70 29 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65  )", selectOpName
1cd80 28 70 2d 3e 6f 70 29 29 29 3b 0a 0a 20 20 2f 2a  (p->op)));..  /*
1cd90 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f   Generate a coro
1cda0 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74  utine to evaluat
1cdb0 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
1cdc0 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20  tement to the.  
1cdd0 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63  ** left of the c
1cde0 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72  ompound operator
1cdf0 20 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65 63   - the "A" selec
1ce00 74 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65  t..  */.  addrSe
1ce10 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33 56  lectA = sqlite3V
1ce20 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1ce30 29 20 2b 20 31 3b 0a 20 20 61 64 64 72 31 20 3d  ) + 1;.  addr1 =
1ce40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ce50 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
1ce60 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41  outine, regAddrA
1ce70 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74 41  , 0, addrSelectA
1ce80 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
1ce90 28 28 76 2c 20 22 6c 65 66 74 20 53 45 4c 45 43  ((v, "left SELEC
1cea0 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  T"));.  pPrior->
1ceb0 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69  iLimit = regLimi
1cec0 74 41 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75 65  tA;.  ExplainQue
1ced0 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
1cee0 31 2c 20 22 4c 45 46 54 22 29 29 3b 0a 20 20 73  1, "LEFT"));.  s
1cef0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
1cf00 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65  rse, pPrior, &de
1cf10 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  stA);.  sqlite3V
1cf20 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28  dbeEndCoroutine(
1cf30 76 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20  v, regAddrA);.  
1cf40 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
1cf50 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a  ere(v, addr1);..
1cf60 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1cf70 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61  coroutine to eva
1cf80 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54  luate the SELECT
1cf90 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20   statement on . 
1cfa0 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20   ** the right - 
1cfb0 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20  the "B" select. 
1cfc0 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74   */.  addrSelect
1cfd0 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  B = sqlite3VdbeC
1cfe0 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
1cff0 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  1;.  addr1 = sql
1d000 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1d010 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
1d020 6e 65 2c 20 72 65 67 41 64 64 72 42 2c 20 30 2c  ne, regAddrB, 0,
1d030 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20   addrSelectB);. 
1d040 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1d050 20 22 72 69 67 68 74 20 53 45 4c 45 43 54 22 29   "right SELECT")
1d060 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20  );.  savedLimit 
1d070 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73  = p->iLimit;.  s
1d080 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e  avedOffset = p->
1d090 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c  iOffset;.  p->iL
1d0a0 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42  imit = regLimitB
1d0b0 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  ;.  p->iOffset =
1d0c0 20 30 3b 20 20 0a 20 20 45 78 70 6c 61 69 6e 51   0;  .  ExplainQ
1d0d0 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
1d0e0 2c 20 31 2c 20 22 52 49 47 48 54 22 29 29 3b 0a  , 1, "RIGHT"));.
1d0f0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
1d100 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
1d110 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20  B);.  p->iLimit 
1d120 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20  = savedLimit;.  
1d130 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76  p->iOffset = sav
1d140 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69  edOffset;.  sqli
1d150 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74  te3VdbeEndCorout
1d160 69 6e 65 28 76 2c 20 72 65 67 41 64 64 72 42 29  ine(v, regAddrB)
1d170 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1d180 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
1d190 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63  at outputs the c
1d1a0 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
1d1b0 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  e A.  ** select 
1d1c0 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70  as the next outp
1d1d0 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f  ut row of the co
1d1e0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
1d1f0 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
1d200 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75  mment((v, "Outpu
1d210 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22  t routine for A"
1d220 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d  ));.  addrOutA =
1d230 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
1d240 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65  ubroutine(pParse
1d250 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d260 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44     p, &destA, pD
1d270 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20  est, regOutA,.  
1d280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1d290 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c  egPrev, pKeyDup,
1d2a0 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20   labelEnd);.  . 
1d2b0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
1d2c0 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
1d2d0 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65  utputs the curre
1d2e0 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a  nt row of the B.
1d2f0 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74    ** select as t
1d300 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72  he next output r
1d310 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ow of the compou
1d320 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  nd select..  */.
1d330 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
1d340 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   || op==TK_UNION
1d350 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70   ){.    VdbeNoop
1d360 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74  Comment((v, "Out
1d370 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  put routine for 
1d380 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75  B"));.    addrOu
1d390 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74  tB = generateOut
1d3a0 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50  putSubroutine(pP
1d3b0 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
1d3c0 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 42         p, &destB
1d3d0 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42  , pDest, regOutB
1d3e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d3f0 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79     regPrev, pKey
1d400 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  Dup, labelEnd);.
1d410 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65 79    }.  sqlite3Key
1d420 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 44 75  InfoUnref(pKeyDu
1d430 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  p);..  /* Genera
1d440 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
1d450 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20  to run when the 
1d460 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c  results from sel
1d470 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65  ect A.  ** are e
1d480 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c  xhausted and onl
1d490 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74  y data in select
1d4a0 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f   B remains..  */
1d4b0 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58  .  if( op==TK_EX
1d4c0 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49  CEPT || op==TK_I
1d4d0 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
1d4e0 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 61  addrEofA_noB = a
1d4f0 64 64 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c 45  ddrEofA = labelE
1d500 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20  nd;.  }else{  . 
1d510 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
1d520 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75  nt((v, "eof-A su
1d530 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
1d540 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69   addrEofA = sqli
1d550 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1d560 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
1d570 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20  tB, addrOutB);. 
1d580 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20     addrEofA_noB 
1d590 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1d5a0 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1d5b0 20 72 65 67 41 64 64 72 42 2c 20 6c 61 62 65 6c   regAddrB, label
1d5c0 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  End);.          
1d5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5e0 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
1d5f0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1d600 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1d610 76 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20  v, addrEofA);.  
1d620 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
1d630 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
1d640 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  dd(p->nSelectRow
1d650 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  , pPrior->nSelec
1d660 74 52 6f 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  tRow);.  }..  /*
1d670 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
1d680 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68  outine to run wh
1d690 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66  en the results f
1d6a0 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a  rom select B.  *
1d6b0 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20  * are exhausted 
1d6c0 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e  and only data in
1d6d0 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e   select A remain
1d6e0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  s..  */.  if( op
1d6f0 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
1d700 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d  {.    addrEofB =
1d710 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20 69   addrEofA;.    i
1d720 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
1d730 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65   > pPrior->nSele
1d740 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65  ctRow ) p->nSele
1d750 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e  ctRow = pPrior->
1d760 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65  nSelectRow;.  }e
1d770 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e  lse{  .    VdbeN
1d780 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1d790 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  eof-B subroutine
1d7a0 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66  "));.    addrEof
1d7b0 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
1d7c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
1d7d0 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72  b, regOutA, addr
1d7e0 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  OutA);.    sqlit
1d7f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d800 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1d810 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56  rA, labelEnd); V
1d820 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1d830 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
1d840 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f 66 42 29  oto(v, addrEofB)
1d850 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
1d860 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e  rate code to han
1d870 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20  dle the case of 
1d880 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  A<B.  */.  VdbeN
1d890 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1d8a0 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-lt-B subroutin
1d8b0 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42  e"));.  addrAltB
1d8c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1d8d0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1d8e0 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f  , regOutA, addrO
1d8f0 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  utA);.  sqlite3V
1d900 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1d910 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
1d920 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65   addrEofA); Vdbe
1d930 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
1d940 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1d950 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20  , labelCmpr);.. 
1d960 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1d970 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  e to handle the 
1d980 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a  case of A==B.  *
1d990 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
1d9a0 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65  LL ){.    addrAe
1d9b0 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20  qB = addrAltB;. 
1d9c0 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54   }else if( op==T
1d9d0 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
1d9e0 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64     addrAeqB = ad
1d9f0 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72  drAltB;.    addr
1da00 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  AltB++;.  }else{
1da10 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
1da20 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42  ment((v, "A-eq-B
1da30 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
1da40 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20      addrAeqB =. 
1da50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1da60 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1da70 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72  , regAddrA, addr
1da80 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72  EofA); VdbeCover
1da90 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
1daa0 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c  te3VdbeGoto(v, l
1dab0 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a  abelCmpr);.  }..
1dac0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1dad0 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
1dae0 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a   case of A>B.  *
1daf0 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
1db00 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20  ent((v, "A-gt-B 
1db10 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
1db20 20 61 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69   addrAgtB = sqli
1db30 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
1db40 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d  dr(v);.  if( op=
1db50 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54  =TK_ALL || op==T
1db60 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73  K_UNION ){.    s
1db70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1db80 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
1db90 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29  gOutB, addrOutB)
1dba0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
1dbb0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1dbc0 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c  Yield, regAddrB,
1dbd0 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65   addrEofB); Vdbe
1dbe0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
1dbf0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1dc00 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20  , labelCmpr);.. 
1dc10 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75   /* This code ru
1dc20 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69  ns once to initi
1dc30 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67  alize everything
1dc40 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1dc50 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
1dc60 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  addr1);.  sqlite
1dc70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1dc80 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1dc90 41 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29  A, addrEofA_noB)
1dca0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1dcb0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1dcc0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1dcd0 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64  ld, regAddrB, ad
1dce0 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76  drEofB); VdbeCov
1dcf0 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20  erage(v);..  /* 
1dd00 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61  Implement the ma
1dd10 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20  in merge loop.  
1dd20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1dd30 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1dd40 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71  labelCmpr);.  sq
1dd50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1dd60 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f  v, OP_Permutatio
1dd70 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61  n, 0, 0, 0, (cha
1dd80 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f  r*)aPermute, P4_
1dd90 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c  INTARRAY);.  sql
1dda0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1ddb0 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65  , OP_Compare, de
1ddc0 73 74 41 2e 69 53 64 73 74 2c 20 64 65 73 74 42  stA.iSdst, destB
1ddd0 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65 72 42 79  .iSdst, nOrderBy
1dde0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ddf0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
1de00 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f  *)pKeyMerge, P4_
1de10 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69  KEYINFO);.  sqli
1de20 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
1de30 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54  v, OPFLAG_PERMUT
1de40 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  E);.  sqlite3Vdb
1de50 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
1de60 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64  mp, addrAltB, ad
1de70 64 72 41 65 71 42 2c 20 61 64 64 72 41 67 74 42  drAeqB, addrAgtB
1de80 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1de90 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74  v);..  /* Jump t
1dea0 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74  o the this point
1deb0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72   in order to ter
1dec0 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65 72 79  minate the query
1ded0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1dee0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1def0 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a  (v, labelEnd);..
1df00 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20    /* Reassembly 
1df10 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
1df20 72 79 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  ry so that it wi
1df30 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f 72 72  ll be freed corr
1df40 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68  ectly.  ** by th
1df50 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
1df60 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  on */.  if( p->p
1df70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c  Prior ){.    sql
1df80 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
1df90 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b  (db, p->pPrior);
1dfa0 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72  .  }.  p->pPrior
1dfb0 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 70 50 72   = pPrior;.  pPr
1dfc0 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a  ior->pNext = p;.
1dfd0 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e  .  /*** TBD:  In
1dfe0 73 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20  sert subroutine 
1dff0 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63  calls to close c
1e000 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70  ursors on incomp
1e010 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71  lete.  **** subq
1e020 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 45  ueries ****/.  E
1e030 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 50  xplainQueryPlanP
1e040 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65  op(pParse);.  re
1e050 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72  turn pParse->nEr
1e060 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  r!=0;.}.#endif..
1e070 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1e080 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1e090 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
1e0a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1e0b0 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  ../* An instance
1e0c0 20 6f 66 20 74 68 65 20 53 75 62 73 74 43 6f 6e   of the SubstCon
1e0d0 74 65 78 74 20 6f 62 6a 65 63 74 20 64 65 73 63  text object desc
1e0e0 72 69 62 65 73 20 61 6e 20 73 75 62 73 74 69 74  ribes an substit
1e0f0 75 74 69 6f 6e 20 65 64 69 74 0a 2a 2a 20 74 6f  ution edit.** to
1e100 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e   be performed on
1e110 20 61 20 70 61 72 73 65 20 74 72 65 65 2e 0a 2a   a parse tree..*
1e120 2a 0a 2a 2a 20 41 6c 6c 20 72 65 66 65 72 65 6e  *.** All referen
1e130 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ces to columns i
1e140 6e 20 74 61 62 6c 65 20 69 54 61 62 6c 65 20 61  n table iTable a
1e150 72 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65  re to be replace
1e160 64 20 62 79 20 63 6f 72 72 65 73 70 6f 6e 64 69  d by correspondi
1e170 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  ng.** expression
1e180 73 20 69 6e 20 70 45 4c 69 73 74 2e 0a 2a 2f 0a  s in pEList..*/.
1e190 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
1e1a0 75 62 73 74 43 6f 6e 74 65 78 74 20 7b 0a 20 20  ubstContext {.  
1e1b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
1e1c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1e1d0 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
1e1e0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
1e1f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e200 2f 2a 20 52 65 70 6c 61 63 65 20 72 65 66 65 72  /* Replace refer
1e210 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74 61  ences to this ta
1e220 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65  ble */.  int iNe
1e230 77 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  wTable;         
1e240 20 20 20 2f 2a 20 4e 65 77 20 74 61 62 6c 65 20     /* New table 
1e250 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
1e260 69 73 4c 65 66 74 4a 6f 69 6e 3b 20 20 20 20 20  isLeftJoin;     
1e270 20 20 20 20 20 20 2f 2a 20 41 64 64 20 54 4b 5f        /* Add TK_
1e280 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 6f 70 63 6f  IF_NULL_ROW opco
1e290 64 65 73 20 6f 6e 20 65 61 63 68 20 72 65 70 6c  des on each repl
1e2a0 61 63 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70  acement */.  Exp
1e2b0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20  rList *pEList;  
1e2c0 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61 63         /* Replac
1e2d0 65 6d 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  ement expression
1e2e0 73 20 2a 2f 0a 7d 20 53 75 62 73 74 43 6f 6e 74  s */.} SubstCont
1e2f0 65 78 74 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  ext;../* Forward
1e300 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   Declarations */
1e310 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
1e320 73 74 45 78 70 72 4c 69 73 74 28 53 75 62 73 74  stExprList(Subst
1e330 43 6f 6e 74 65 78 74 2a 2c 20 45 78 70 72 4c 69  Context*, ExprLi
1e340 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  st*);.static voi
1e350 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 53 75  d substSelect(Su
1e360 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20 53 65 6c  bstContext*, Sel
1e370 65 63 74 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a  ect*, int);../*.
1e380 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20  ** Scan through 
1e390 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
1e3a0 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65  Expr.  Replace e
1e3b0 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74  very reference t
1e3c0 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  o.** a column in
1e3d0 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54   table number iT
1e3e0 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79  able with a copy
1e3f0 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d   of the iColumn-
1e400 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70  th.** entry in p
1e410 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61  EList.  (But lea
1e420 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ve references to
1e430 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d   the ROWID colum
1e440 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e  n .** unchanged.
1e450 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ).**.** This rou
1e460 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20  tine is part of 
1e470 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70  the flattening p
1e480 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62  rocedure.  A sub
1e490 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72  query.** whose r
1e4a0 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66  esult set is def
1e4b0 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61  ined by pEList a
1e4c0 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20  ppears as entry 
1e4d0 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63  in the.** FROM c
1e4e0 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
1e4f0 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  T such that the 
1e500 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69  VDBE cursor assi
1e510 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20  gned to that.** 
1e520 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FORM clause entr
1e530 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68  y is iTable.  Th
1e540 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73  is routine makes
1e550 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a   the necessary .
1e560 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45  ** changes to pE
1e570 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72  xpr so that it r
1e580 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74  efers directly t
1e590 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62  o the source tab
1e5a0 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62  le.** of the sub
1e5b0 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68 65  query rather the
1e5c0 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
1e5d0 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a  he subquery..*/.
1e5e0 73 74 61 74 69 63 20 45 78 70 72 20 2a 73 75 62  static Expr *sub
1e5f0 73 74 45 78 70 72 28 0a 20 20 53 75 62 73 74 43  stExpr(.  SubstC
1e600 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74 2c 20  ontext *pSubst, 
1e610 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1e620 6f 66 20 74 68 65 20 73 75 62 73 74 69 74 75 74  of the substitut
1e630 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ion */.  Expr *p
1e640 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
1e650 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63 68  /* Expr in which
1e660 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63   substitution oc
1e670 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  curs */.){.  if(
1e680 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
1e690 72 6e 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72  rn 0;.  if( Expr
1e6a0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1e6b0 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a  r, EP_FromJoin).
1e6c0 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69 52 69     && pExpr->iRi
1e6d0 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 70 53  ghtJoinTable==pS
1e6e0 75 62 73 74 2d 3e 69 54 61 62 6c 65 0a 20 20 29  ubst->iTable.  )
1e6f0 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 52 69  {.    pExpr->iRi
1e700 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70  ghtJoinTable = p
1e710 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65  Subst->iNewTable
1e720 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70  ;.  }.  if( pExp
1e730 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
1e740 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
1e750 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c  e==pSubst->iTabl
1e760 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78  e ){.    if( pEx
1e770 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
1e780 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
1e790 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20   = TK_NULL;.    
1e7a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
1e7b0 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45  r *pNew;.      E
1e7c0 78 70 72 20 2a 70 43 6f 70 79 20 3d 20 70 53 75  xpr *pCopy = pSu
1e7d0 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70  bst->pEList->a[p
1e7e0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70  Expr->iColumn].p
1e7f0 45 78 70 72 3b 0a 20 20 20 20 20 20 45 78 70 72  Expr;.      Expr
1e800 20 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20   ifNullRow;.    
1e810 20 20 61 73 73 65 72 74 28 20 70 53 75 62 73 74    assert( pSubst
1e820 2d 3e 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70  ->pEList!=0 && p
1e830 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 53  Expr->iColumn<pS
1e840 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  ubst->pEList->nE
1e850 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  xpr );.      ass
1e860 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67  ert( pExpr->pRig
1e870 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ht==0 );.      i
1e880 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
1e890 56 65 63 74 6f 72 28 70 43 6f 70 79 29 20 29 7b  Vector(pCopy) ){
1e8a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1e8b0 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 70  VectorErrorMsg(p
1e8c0 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2c 20 70  Subst->pParse, p
1e8d0 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Copy);.      }el
1e8e0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
1e8f0 74 65 33 20 2a 64 62 20 3d 20 70 53 75 62 73 74  te3 *db = pSubst
1e900 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  ->pParse->db;.  
1e910 20 20 20 20 20 20 69 66 28 20 70 53 75 62 73 74        if( pSubst
1e920 2d 3e 69 73 4c 65 66 74 4a 6f 69 6e 20 26 26 20  ->isLeftJoin && 
1e930 70 43 6f 70 79 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pCopy->op!=TK_CO
1e940 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
1e950 20 20 6d 65 6d 73 65 74 28 26 69 66 4e 75 6c 6c    memset(&ifNull
1e960 52 6f 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69  Row, 0, sizeof(i
1e970 66 4e 75 6c 6c 52 6f 77 29 29 3b 0a 20 20 20 20  fNullRow));.    
1e980 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e        ifNullRow.
1e990 6f 70 20 3d 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f  op = TK_IF_NULL_
1e9a0 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ROW;.          i
1e9b0 66 4e 75 6c 6c 52 6f 77 2e 70 4c 65 66 74 20 3d  fNullRow.pLeft =
1e9c0 20 70 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20   pCopy;.        
1e9d0 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 69 54 61 62    ifNullRow.iTab
1e9e0 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65  le = pSubst->iNe
1e9f0 77 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  wTable;.        
1ea00 20 20 70 43 6f 70 79 20 3d 20 26 69 66 4e 75 6c    pCopy = &ifNul
1ea10 6c 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lRow;.        }.
1ea20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
1ea30 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
1ea40 2c 20 70 43 6f 70 79 2c 20 30 29 3b 0a 20 20 20  , pCopy, 0);.   
1ea50 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26       if( pNew &&
1ea60 20 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74 4a   pSubst->isLeftJ
1ea70 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oin ){.         
1ea80 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
1ea90 28 70 4e 65 77 2c 20 45 50 5f 43 61 6e 42 65 4e  (pNew, EP_CanBeN
1eaa0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ull);.        }.
1eab0 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
1eac0 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65   && ExprHasPrope
1ead0 72 74 79 28 70 45 78 70 72 2c 45 50 5f 46 72 6f  rty(pExpr,EP_Fro
1eae0 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  mJoin) ){.      
1eaf0 20 20 20 20 70 4e 65 77 2d 3e 69 52 69 67 68 74      pNew->iRight
1eb00 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 45 78 70  JoinTable = pExp
1eb10 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  r->iRightJoinTab
1eb20 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78  le;.          Ex
1eb30 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 4e  prSetProperty(pN
1eb40 65 77 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  ew, EP_FromJoin)
1eb50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1eb60 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1eb70 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
1eb80 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 20  ;.        pExpr 
1eb90 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a  = pNew;.      }.
1eba0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1ebb0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
1ebc0 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57  ==TK_IF_NULL_ROW
1ebd0 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
1ebe0 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c  e==pSubst->iTabl
1ebf0 65 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  e ){.      pExpr
1ec00 2d 3e 69 54 61 62 6c 65 20 3d 20 70 53 75 62 73  ->iTable = pSubs
1ec10 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20  t->iNewTable;.  
1ec20 20 20 7d 0a 20 20 20 20 70 45 78 70 72 2d 3e 70    }.    pExpr->p
1ec30 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78 70 72  Left = substExpr
1ec40 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e  (pSubst, pExpr->
1ec50 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 45 78 70  pLeft);.    pExp
1ec60 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73  r->pRight = subs
1ec70 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 45  tExpr(pSubst, pE
1ec80 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
1ec90 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1eca0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1ecb0 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
1ecc0 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28      substSelect(
1ecd0 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 78  pSubst, pExpr->x
1ece0 2e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20 20  .pSelect, 1);.  
1ecf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1ed00 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75  ubstExprList(pSu
1ed10 62 73 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  bst, pExpr->x.pL
1ed20 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ist);.    }.  }.
1ed30 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a    return pExpr;.
1ed40 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
1ed50 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20 53  bstExprList(.  S
1ed60 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75  ubstContext *pSu
1ed70 62 73 74 2c 20 2f 2a 20 44 65 73 63 72 69 70 74  bst, /* Descript
1ed80 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74  ion of the subst
1ed90 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  itution */.  Exp
1eda0 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20 20  rList *pList    
1edb0 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63     /* List to sc
1edc0 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20  an and in which 
1edd0 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
1ede0 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tes */.){.  int 
1edf0 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
1ee00 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
1ee10 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
1ee20 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1ee30 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
1ee40 70 72 20 3d 20 73 75 62 73 74 45 78 70 72 28 70  pr = substExpr(p
1ee50 53 75 62 73 74 2c 20 70 4c 69 73 74 2d 3e 61 5b  Subst, pList->a[
1ee60 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 7d  i].pExpr);.  }.}
1ee70 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
1ee80 73 74 53 65 6c 65 63 74 28 0a 20 20 53 75 62 73  stSelect(.  Subs
1ee90 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74  tContext *pSubst
1eea0 2c 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e  , /* Description
1eeb0 20 6f 66 20 74 68 65 20 73 75 62 73 74 69 74 75   of the substitu
1eec0 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tion */.  Select
1eed0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1eee0 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
1eef0 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ent in which to 
1ef00 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f  make substitutio
1ef10 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 50 72  ns */.  int doPr
1ef20 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ior           /*
1ef30 20 44 6f 20 73 75 62 73 74 69 74 75 74 65 73 20   Do substitutes 
1ef40 6f 6e 20 70 2d 3e 70 50 72 69 6f 72 20 74 6f 6f  on p->pPrior too
1ef50 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74   */.){.  SrcList
1ef60 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74   *pSrc;.  struct
1ef70 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1ef80 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
1ef90 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
1efa0 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 75 62 73  ;.  do{.    subs
1efb0 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74  tExprList(pSubst
1efc0 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
1efd0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1efe0 70 53 75 62 73 74 2c 20 70 2d 3e 70 47 72 6f 75  pSubst, p->pGrou
1eff0 70 42 79 29 3b 0a 20 20 20 20 73 75 62 73 74 45  pBy);.    substE
1f000 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20  xprList(pSubst, 
1f010 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
1f020 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73    p->pHaving = s
1f030 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c  ubstExpr(pSubst,
1f040 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
1f050 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75    p->pWhere = su
1f060 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20  bstExpr(pSubst, 
1f070 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
1f080 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
1f090 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
1f0a0 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  !=0 );.    for(i
1f0b0 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74  =pSrc->nSrc, pIt
1f0c0 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b  em=pSrc->a; i>0;
1f0d0 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
1f0e0 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63        substSelec
1f0f0 74 28 70 53 75 62 73 74 2c 20 70 49 74 65 6d 2d  t(pSubst, pItem-
1f100 3e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20 20  >pSelect, 1);.  
1f110 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66      if( pItem->f
1f120 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20  g.isTabFunc ){. 
1f130 20 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72         substExpr
1f140 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 49 74  List(pSubst, pIt
1f150 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 29  em->u1.pFuncArg)
1f160 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f170 20 20 7d 77 68 69 6c 65 28 20 64 6f 50 72 69 6f    }while( doPrio
1f180 72 20 26 26 20 28 70 20 3d 20 70 2d 3e 70 50 72  r && (p = p->pPr
1f190 69 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a 23 65 6e  ior)!=0 );.}.#en
1f1a0 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
1f1b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1f1c0 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
1f1d0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
1f1e0 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  EW) */..#if !def
1f1f0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1f200 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1f210 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1f220 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54  IT_VIEW)./*.** T
1f230 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
1f240 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20  mpts to flatten 
1f250 73 75 62 71 75 65 72 69 65 73 20 61 73 20 61 20  subqueries as a 
1f260 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69  performance opti
1f270 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  mization..** Thi
1f280 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1f290 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20  s 1 if it makes 
1f2a0 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66  changes and 0 if
1f2b0 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f   no flattening o
1f2c0 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ccurs..**.** To 
1f2d0 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63  understand the c
1f2e0 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65  oncept of flatte
1f2f0 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74  ning, consider t
1f300 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1f310 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
1f320 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28   SELECT a FROM (
1f330 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
1f340 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
1f350 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a  100) WHERE a>5.*
1f360 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
1f370 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e   way of implemen
1f380 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20  ting this query 
1f390 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  is to execute th
1f3a0 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69  e.** subquery fi
1f3b0 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68  rst and store th
1f3c0 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74  e results in a t
1f3d0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
1f3e0 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20  then.** run the 
1f3f0 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74  outer query on t
1f400 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61  hat temporary ta
1f410 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69  ble.  This requi
1f420 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65  res two.** passe
1f430 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e  s over the data.
1f440 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62    Furthermore, b
1f450 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f  ecause the tempo
1f460 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61  rary table.** ha
1f470 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68  s no indices, th
1f480 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
1f490 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1f4a0 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f  y cannot be.** o
1f4b0 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20  ptimized..**.** 
1f4c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
1f4d0 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65  empts to rewrite
1f4e0 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73   queries such as
1f4f0 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a   the above into.
1f500 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74  ** a single flat
1f510 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68   select, like th
1f520 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  is:.**.**     SE
1f530 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
1f540 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
1f550 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  0 AND a>5.**.** 
1f560 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
1f570 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70  ed for this simp
1f580 6c 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73  lification gives
1f590 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
1f5a0 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73  .** but only has
1f5b0 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74   to scan the dat
1f5c0 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63  a once.  And bec
1f5d0 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67  ause indices mig
1f5e0 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20  ht .** exist on 
1f5f0 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20  the table t1, a 
1f600 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66  complete scan of
1f610 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   the data might 
1f620 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a  be.** avoided..*
1f630 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20  *.** Flattening 
1f640 69 73 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68  is subject to th
1f650 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73  e following cons
1f660 74 72 61 69 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20  traints:.**.**  
1f670 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67  (**)  We no long
1f680 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c  er attempt to fl
1f690 61 74 74 65 6e 20 61 67 67 72 65 67 61 74 65 20  atten aggregate 
1f6a0 73 75 62 71 75 65 72 69 65 73 2e 20 57 61 73 3a  subqueries. Was:
1f6b0 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 73  .**        The s
1f6c0 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
1f6d0 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e  outer query cann
1f6e0 6f 74 20 62 6f 74 68 20 62 65 20 61 67 67 72 65  ot both be aggre
1f6f0 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  gates..**.**  (*
1f700 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72  *)  We no longer
1f710 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74   attempt to flat
1f720 74 65 6e 20 61 67 67 72 65 67 61 74 65 20 73 75  ten aggregate su
1f730 62 71 75 65 72 69 65 73 2e 20 57 61 73 3a 0a 2a  bqueries. Was:.*
1f740 2a 20 20 20 20 20 20 20 20 28 32 29 20 49 66 20  *        (2) If 
1f750 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
1f760 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68 65  an aggregate the
1f770 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 32 61 29  n.**        (2a)
1f780 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1f790 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 20 6a   must not be a j
1f7a0 6f 69 6e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  oin and.**      
1f7b0 20 20 28 32 62 29 20 74 68 65 20 6f 75 74 65 72    (2b) the outer
1f7c0 20 71 75 65 72 79 20 6d 75 73 74 20 6e 6f 74 20   query must not 
1f7d0 75 73 65 20 73 75 62 71 75 65 72 69 65 73 0a 2a  use subqueries.*
1f7e0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 74  *             ot
1f7f0 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65  her than the one
1f800 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
1f810 71 75 65 72 79 20 74 68 61 74 20 69 73 20 61 20  query that is a 
1f820 63 61 6e 64 69 64 61 74 65 0a 2a 2a 20 20 20 20  candidate.**    
1f830 20 20 20 20 20 20 20 20 20 66 6f 72 20 66 6c 61           for fla
1f840 74 74 65 6e 69 6e 67 2e 20 20 28 54 68 69 73 20  ttening.  (This 
1f850 69 73 20 64 75 65 20 74 6f 20 74 69 63 6b 65 74  is due to ticket
1f860 20 5b 32 66 37 31 37 30 64 37 33 62 66 39 61 62   [2f7170d73bf9ab
1f870 66 38 30 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20  f80].**         
1f880 20 20 20 20 66 72 6f 6d 20 32 30 31 35 2d 30 32      from 2015-02
1f890 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 33  -09.).**.**   (3
1f8a0 29 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  )  If the subque
1f8b0 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
1f8c0 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46  operand of a LEF
1f8d0 54 20 4a 4f 49 4e 20 74 68 65 6e 0a 2a 2a 20 20  T JOIN then.**  
1f8e0 20 20 20 20 20 20 28 33 61 29 20 74 68 65 20 73        (3a) the s
1f8f0 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  ubquery may not 
1f900 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a 2a  be a join and.**
1f910 20 20 20 20 20 20 20 20 28 33 62 29 20 74 68 65          (3b) the
1f920 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1f930 74 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  the subquery may
1f940 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 76   not contain a v
1f950 69 72 74 75 61 6c 0a 2a 2a 20 20 20 20 20 20 20  irtual.**       
1f960 20 20 20 20 20 20 74 61 62 6c 65 20 61 6e 64 0a        table and.
1f970 2a 2a 20 20 20 20 20 20 20 20 28 33 63 29 20 74  **        (3c) t
1f980 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  he outer query m
1f990 61 79 20 6e 6f 74 20 62 65 20 61 6e 20 61 67 67  ay not be an agg
1f9a0 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  regate..**.**   
1f9b0 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (4)  The subquer
1f9c0 79 20 63 61 6e 20 6e 6f 74 20 62 65 20 44 49 53  y can not be DIS
1f9d0 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  TINCT..**.**  (*
1f9e0 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74  *)  At one point
1f9f0 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34   restrictions (4
1fa00 29 20 61 6e 64 20 28 35 29 20 64 65 66 69 6e 65  ) and (5) define
1fa10 64 20 61 20 73 75 62 73 65 74 20 6f 66 20 44 49  d a subset of DI
1fa20 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20 20  STINCT.**       
1fa30 20 73 75 62 2d 71 75 65 72 69 65 73 20 74 68 61   sub-queries tha
1fa40 74 20 77 65 72 65 20 65 78 63 6c 75 64 65 64 20  t were excluded 
1fa50 66 72 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d 69  from this optimi
1fa60 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72 69 63 74  zation. Restrict
1fa70 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 28  ion .**        (
1fa80 34 29 20 68 61 73 20 73 69 6e 63 65 20 62 65 65  4) has since bee
1fa90 6e 20 65 78 70 61 6e 64 65 64 20 74 6f 20 65 78  n expanded to ex
1faa0 63 6c 75 64 65 20 61 6c 6c 20 44 49 53 54 49 4e  clude all DISTIN
1fab0 43 54 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  CT subqueries..*
1fac0 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e  *.**  (**)  We n
1fad0 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74  o longer attempt
1fae0 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72   to flatten aggr
1faf0 65 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73  egate subqueries
1fb00 2e 20 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20  .  Was:.**      
1fb10 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1fb20 79 20 69 73 20 61 67 67 72 65 67 61 74 65 2c 20  y is aggregate, 
1fb30 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1fb40 6d 61 79 20 6e 6f 74 20 62 65 20 44 49 53 54 49  may not be DISTI
1fb50 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29  NCT..**.**   (7)
1fb60 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 6d    The subquery m
1fb70 75 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d 20  ust have a FROM 
1fb80 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20  clause.  TODO:  
1fb90 46 6f 72 20 73 75 62 71 75 65 72 69 65 73 20 77  For subqueries w
1fba0 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20  ithout.**       
1fbb0 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20   A FROM clause, 
1fbc0 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20  consider adding 
1fbd0 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 69  a FROM clause wi
1fbe0 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a  th the special.*
1fbf0 2a 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 73  *        table s
1fc00 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74 20  qlite_once that 
1fc10 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69  consists of a si
1fc20 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e  ngle row contain
1fc30 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  ing a.**        
1fc40 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a  single NULL..**.
1fc50 2a 2a 20 20 20 28 38 29 20 20 49 66 20 74 68 65  **   (8)  If the
1fc60 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c   subquery uses L
1fc70 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75  IMIT then the ou
1fc80 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f  ter query may no
1fc90 74 20 62 65 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a  t be a join..**.
1fca0 2a 2a 20 20 20 28 39 29 20 20 49 66 20 74 68 65  **   (9)  If the
1fcb0 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c   subquery uses L
1fcc0 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75  IMIT then the ou
1fcd0 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f  ter query may no
1fce0 74 20 62 65 20 61 67 67 72 65 67 61 74 65 2e 0a  t be aggregate..
1fcf0 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65 73  **.**  (**)  Res
1fd00 74 72 69 63 74 69 6f 6e 20 28 31 30 29 20 77 61  triction (10) wa
1fd10 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
1fd20 68 65 20 63 6f 64 65 20 6f 6e 20 32 30 30 35 2d  he code on 2005-
1fd30 30 32 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a 20  02-05 but we.** 
1fd40 20 20 20 20 20 20 20 61 63 63 69 64 65 6e 74 6c         accidentl
1fd50 79 20 63 61 72 72 69 65 64 20 74 68 65 20 63 6f  y carried the co
1fd60 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64 20 75 6e  mment forward un
1fd70 74 69 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e 20  til 2014-09-15. 
1fd80 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20   Original.**    
1fd90 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 3a 20      constraint: 
1fda0 22 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79  "If the subquery
1fdb0 20 69 73 20 61 67 67 72 65 67 61 74 65 20 74 68   is aggregate th
1fdc0 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  en the outer que
1fdd0 72 79 20 0a 2a 2a 20 20 20 20 20 20 20 20 6d 61  ry .**        ma
1fde0 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e  y not use LIMIT.
1fdf0 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54  ".**.**  (11)  T
1fe00 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
1fe10 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1fe20 6d 61 79 20 6e 6f 74 20 62 6f 74 68 20 68 61 76  may not both hav
1fe30 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1fe40 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20  es..**.**  (**) 
1fe50 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64   Not implemented
1fe60 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f  .  Subsumed into
1fe70 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29   restriction (3)
1fe80 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75 73 6c  .  Was previousl
1fe90 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73 65  y.**        a se
1fea0 70 61 72 61 74 65 20 72 65 73 74 72 69 63 74 69  parate restricti
1feb0 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f 6d  on deriving from
1fec0 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a   ticket #350..**
1fed0 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20 73  .**  (13)  The s
1fee0 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65  ubquery and oute
1fef0 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  r query may not 
1ff00 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a  both use LIMIT..
1ff10 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65  **.**  (14)  The
1ff20 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f   subquery may no
1ff30 74 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a  t use OFFSET..**
1ff40 0a 2a 2a 20 20 28 31 35 29 20 20 49 66 20 74 68  .**  (15)  If th
1ff50 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
1ff60 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f   part of a compo
1ff70 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
1ff80 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73   the.**        s
1ff90 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  ubquery may not 
1ffa0 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 20 20 20  use LIMIT..**   
1ffb0 20 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74       (See ticket
1ffc0 20 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65   #2339 and ticke
1ffd0 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e  t [02a8e81d44]).
1ffe0 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 49 66  .**.**  (16)  If
1fff0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
20000 20 69 73 20 61 67 67 72 65 67 61 74 65 2c 20 74   is aggregate, t
20010 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 79  hen the subquery
20020 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20 20 20 20   may not.**     
20030 20 20 20 75 73 65 20 4f 52 44 45 52 20 42 59 2e     use ORDER BY.
20040 20 20 28 54 69 63 6b 65 74 20 23 32 39 34 32 29    (Ticket #2942)
20050 20 20 54 68 69 73 20 75 73 65 64 20 74 6f 20 6e    This used to n
20060 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20  ot matter.**    
20070 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e 74      until we int
20080 72 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f 75  roduced the grou
20090 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63 74  p_concat() funct
200a0 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31  ion.  .**.**  (1
200b0 37 29 20 20 49 66 20 74 68 65 20 73 75 62 71 75  7)  If the subqu
200c0 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
200d0 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 0a 2a  d select, then.*
200e0 2a 20 20 20 20 20 20 20 20 28 31 37 61 29 20 61  *        (17a) a
200f0 6c 6c 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72  ll compound oper
20100 61 74 6f 72 73 20 6d 75 73 74 20 62 65 20 61 20  ators must be a 
20110 55 4e 49 4f 4e 20 41 4c 4c 2c 20 61 6e 64 0a 2a  UNION ALL, and.*
20120 2a 20 20 20 20 20 20 20 20 28 31 37 62 29 20 6e  *        (17b) n
20130 6f 20 74 65 72 6d 73 20 77 69 74 68 69 6e 20 74  o terms within t
20140 68 65 20 73 75 62 71 75 65 72 79 20 63 6f 6d 70  he subquery comp
20150 6f 75 6e 64 20 6d 61 79 20 62 65 20 61 67 67 72  ound may be aggr
20160 65 67 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 20  egate.**        
20170 20 20 20 20 20 20 6f 72 20 44 49 53 54 49 4e 43        or DISTINC
20180 54 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  T, and.**       
20190 20 28 31 37 63 29 20 65 76 65 72 79 20 74 65 72   (17c) every ter
201a0 6d 20 77 69 74 68 69 6e 20 74 68 65 20 73 75 62  m within the sub
201b0 71 75 65 72 79 20 63 6f 6d 70 6f 75 6e 64 20 6d  query compound m
201c0 75 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d 20  ust have a FROM 
201d0 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  clause.**       
201e0 20 28 31 37 64 29 20 74 68 65 20 6f 75 74 65 72   (17d) the outer
201f0 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62   query may not b
20200 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
20210 20 20 28 31 37 64 31 29 20 61 67 67 72 65 67 61    (17d1) aggrega
20220 74 65 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  te, or.**       
20230 20 20 20 20 20 20 20 28 31 37 64 32 29 20 44 49         (17d2) DI
20240 53 54 49 4e 43 54 2c 20 6f 72 0a 2a 2a 20 20 20  STINCT, or.**   
20250 20 20 20 20 20 20 20 20 20 20 20 28 31 37 64 33             (17d3
20260 29 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ) a join..**.** 
20270 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65 6e         The paren
20280 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79 20  t and sub-query 
20290 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45 52  may contain WHER
202a0 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a 65  E clauses. Subje
202b0 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20  ct to.**        
202c0 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33 29  rules (11), (13)
202d0 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79 20   and (14), they 
202e0 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  may also contain
202f0 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20   ORDER BY,.**   
20300 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f       LIMIT and O
20310 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 20  FFSET clauses.  
20320 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61 6e  The subquery can
20330 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d 70  not use any comp
20340 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f  ound.**        o
20350 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74 68  perator other th
20360 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65 63  an UNION ALL bec
20370 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74 68  ause all the oth
20380 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  er compound.**  
20390 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73 20        operators 
203a0 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64 20  have an implied 
203b0 44 49 53 54 49 4e 43 54 20 77 68 69 63 68 20 69  DISTINCT which i
203c0 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79 0a  s disallowed by.
203d0 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74 72 69  **        restri
203e0 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a  ction (4)..**.**
203f0 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65 61          Also, ea
20400 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20  ch component of 
20410 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d 75  the sub-query mu
20420 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  st return the sa
20430 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20  me number.**    
20440 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63 6f      of result co
20450 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20 61  lumns. This is a
20460 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69 72  ctually a requir
20470 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 6f  ement for any co
20480 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20  mpound.**       
20490 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
204a0 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20 63  t, but all the c
204b0 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20 69 73  ode here does is
204c0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
204d0 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 63  no.**        suc
204e0 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62 2d  h (illegal) sub-
204f0 71 75 65 72 79 20 69 73 20 66 6c 61 74 74 65 6e  query is flatten
20500 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ed. The caller w
20510 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a 2a  ill detect the.*
20520 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61 78 20  *        syntax 
20530 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72 6e  error and return
20540 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73 73   a detailed mess
20550 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29  age..**.**  (18)
20560 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65    If the sub-que
20570 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
20580 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c   select, then al
20590 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  l terms of the.*
205a0 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 42  *        ORDER B
205b0 59 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  Y clause of the 
205c0 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20 73  parent must be s
205d0 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  imple references
205e0 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 63   to .**        c
205f0 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 75  olumns of the su
20600 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
20610 28 31 39 29 20 20 49 66 20 74 68 65 20 73 75 62  (19)  If the sub
20620 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54  query uses LIMIT
20630 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20   then the outer 
20640 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a  query may not.**
20650 20 20 20 20 20 20 20 20 68 61 76 65 20 61 20 57          have a W
20660 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  HERE clause..**.
20670 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74 68 65  **  (20)  If the
20680 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
20690 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
206a0 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f   then it must no
206b0 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  t use.**        
206c0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
206d0 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37  se.  Ticket #377
206e0 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c  3.  We could rel
206f0 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  ax this constrai
20700 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d  nt.**        som
20710 65 77 68 61 74 20 62 79 20 73 61 79 69 6e 67 20  ewhat by saying 
20720 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f  that the terms o
20730 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
20740 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20  lause must.**   
20750 20 20 20 20 20 61 70 70 65 61 72 20 61 73 20 75       appear as u
20760 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74  nmodified result
20770 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
20780 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 75  outer query.  Bu
20790 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 68  t we.**        h
207a0 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69  ave other optimi
207b0 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20  zations in mind 
207c0 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 61  to deal with tha
207d0 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  t case..**.**  (
207e0 32 31 29 20 20 49 66 20 74 68 65 20 73 75 62 71  21)  If the subq
207f0 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54 20  uery uses LIMIT 
20800 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71  then the outer q
20810 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 0a  uery may not be.
20820 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e  **        DISTIN
20830 43 54 2e 20 20 28 53 65 65 20 74 69 63 6b 65 74  CT.  (See ticket
20840 20 5b 37 35 32 65 31 36 34 36 66 63 5d 29 2e 0a   [752e1646fc])..
20850 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54 68 65  **.**  (22)  The
20860 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f   subquery may no
20870 74 20 62 65 20 61 20 72 65 63 75 72 73 69 76 65  t be a recursive
20880 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a   CTE..**.**  (**
20890 29 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f  )  Subsumed into
208a0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37   restriction (17
208b0 64 33 29 2e 20 20 57 61 73 3a 20 49 66 20 74 68  d3).  Was: If th
208c0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
208d0 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 72 65 63  .**        a rec
208e0 75 72 73 69 76 65 20 43 54 45 2c 20 74 68 65 6e  ursive CTE, then
208f0 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d   the sub-query m
20900 61 79 20 6e 6f 74 20 62 65 20 61 20 63 6f 6d 70  ay not be a comp
20910 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 20 20  ound query..**  
20920 20 20 20 20 20 20 54 68 69 73 20 72 65 73 74 72        This restr
20930 69 63 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73  iction is becaus
20940 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74  e transforming t
20950 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 70 61 72  he.**        par
20960 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75 6e  ent to a compoun
20970 64 20 71 75 65 72 79 20 63 6f 6e 66 75 73 65 73  d query confuses
20980 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 68   the code that h
20990 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20  andles.**       
209a0 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72 69   recursive queri
209b0 65 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65 63  es in multiSelec
209c0 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  t()..**.**  (**)
209d0 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61    We no longer a
209e0 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74 65  ttempt to flatte
209f0 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71  n aggregate subq
20a00 75 65 72 69 65 73 2e 20 20 57 61 73 3a 0a 2a 2a  ueries.  Was:.**
20a10 20 20 20 20 20 20 20 20 54 68 65 20 73 75 62 71          The subq
20a20 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20  uery may not be 
20a30 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68 61  an aggregate tha
20a40 74 20 75 73 65 73 20 74 68 65 20 62 75 69 6c 74  t uses the built
20a50 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a 2a 2a  -in min() or .**
20a60 20 20 20 20 20 20 20 20 6f 72 20 6d 61 78 28 29          or max()
20a70 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28 57 69   functions.  (Wi
20a80 74 68 6f 75 74 20 74 68 69 73 20 72 65 73 74 72  thout this restr
20a90 69 63 74 69 6f 6e 2c 20 61 20 71 75 65 72 79 20  iction, a query 
20aa0 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20 20 20  like:.**        
20ab0 22 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28  "SELECT x FROM (
20ac0 53 45 4c 45 43 54 20 6d 61 78 28 79 29 2c 20 78  SELECT max(y), x
20ad0 20 46 52 4f 4d 20 74 31 29 22 20 77 6f 75 6c 64   FROM t1)" would
20ae0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
20af0 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 74 75 72  .**        retur
20b00 6e 20 74 68 65 20 76 61 6c 75 65 20 58 20 66 6f  n the value X fo
20b10 72 20 77 68 69 63 68 20 59 20 77 61 73 20 6d 61  r which Y was ma
20b20 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 20 20 28  ximal.).**.**  (
20b30 32 35 29 20 20 49 66 20 65 69 74 68 65 72 20 74  25)  If either t
20b40 68 65 20 73 75 62 71 75 65 72 79 20 6f 72 20 74  he subquery or t
20b50 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
20b60 63 6f 6e 74 61 69 6e 73 20 61 20 77 69 6e 64 6f  contains a windo
20b70 77 0a 2a 2a 20 20 20 20 20 20 20 20 66 75 6e 63  w.**        func
20b80 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 65 6c 65  tion in the sele
20b90 63 74 20 6c 69 73 74 20 6f 72 20 4f 52 44 45 52  ct list or ORDER
20ba0 20 42 59 20 63 6c 61 75 73 65 2c 20 66 6c 61 74   BY clause, flat
20bb0 74 65 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  tening.**       
20bc0 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
20bd0 64 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  d..**.**.** In t
20be0 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
20bf0 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
20c00 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
20c10 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
20c20 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  ** The subquery 
20c30 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46  is p->pSrc->a[iF
20c40 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20  rom].  isAgg is 
20c50 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65  true if the oute
20c60 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20  r query.** uses 
20c70 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
20c80 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
20c90 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64  is not attempted
20ca0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
20cb0 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65  s a no-op and re
20cc0 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66  turns 0..** If f
20cd0 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74  lattening is att
20ce0 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74  empted this rout
20cf0 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a  ine returns 1..*
20d00 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20  *.** All of the 
20d10 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79  expression analy
20d20 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f  sis must occur o
20d30 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72  n both the outer
20d40 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68   query and.** th
20d50 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72  e subquery befor
20d60 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  e this routine r
20d70 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uns..*/.static i
20d80 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65  nt flattenSubque
20d90 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ry(.  Parse *pPa
20da0 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
20db0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
20dc0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
20dd0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
20de0 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53  arent or outer S
20df0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
20e00 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20  */.  int iFrom, 
20e10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
20e20 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61  ex in p->pSrc->a
20e30 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  [] of the inner 
20e40 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  subquery */.  in
20e50 74 20 69 73 41 67 67 20 20 20 20 20 20 20 20 20  t isAgg         
20e60 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75     /* True if ou
20e70 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20  ter SELECT uses 
20e80 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
20e90 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ons */.){.  cons
20ea0 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75  t char *zSavedAu
20eb0 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72  thContext = pPar
20ec0 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
20ed0 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72  ;.  Select *pPar
20ee0 65 6e 74 3b 20 20 20 20 2f 2a 20 43 75 72 72 65  ent;    /* Curre
20ef0 6e 74 20 55 4e 49 4f 4e 20 41 4c 4c 20 74 65 72  nt UNION ALL ter
20f00 6d 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 71  m of the other q
20f10 75 65 72 79 20 2a 2f 0a 20 20 53 65 6c 65 63 74  uery */.  Select
20f20 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a   *pSub;       /*
20f30 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
20f40 20 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a   or "subquery" *
20f50 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
20f60 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  1;      /* Point
20f70 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d  er to the rightm
20f80 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75  ost select in su
20f90 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63  b-query */.  Src
20fa0 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
20fb0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
20fc0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
20fd0 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c   query */.  SrcL
20fe0 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20  ist *pSubSrc;   
20ff0 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
21000 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  se of the subque
21010 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ry */.  int iPar
21020 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56  ent;        /* V
21030 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
21040 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65  r of the pSub re
21050 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61  sult set temp ta
21060 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65  ble */.  int iNe
21070 77 50 61 72 65 6e 74 20 3d 20 2d 31 3b 2f 2a 20  wParent = -1;/* 
21080 52 65 70 6c 61 63 65 6d 65 6e 74 20 74 61 62 6c  Replacement tabl
21090 65 20 66 6f 72 20 69 50 61 72 65 6e 74 20 2a 2f  e for iParent */
210a0 0a 20 20 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69  .  int isLeftJoi
210b0 6e 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69  n = 0; /* True i
210c0 66 20 70 53 75 62 20 69 73 20 74 68 65 20 72 69  f pSub is the ri
210d0 67 68 74 20 73 69 64 65 20 6f 66 20 61 20 4c 45  ght side of a LE
210e0 46 54 20 4a 4f 49 4e 20 2a 2f 20 20 20 20 0a 20  FT JOIN */    . 
210f0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
21100 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
21110 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nter */.  Expr *
21120 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
21130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
21140 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
21150 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
21160 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65  st_item *pSubite
21170 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71  m;   /* The subq
21180 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  uery */.  sqlite
21190 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
211a0 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  db;..  /* Check 
211b0 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65  to see if flatte
211c0 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
211d0 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  d.  Return 0 if 
211e0 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  not..  */.  asse
211f0 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
21200 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d  sert( p->pPrior=
21210 3d 30 20 29 3b 0a 20 20 69 66 28 20 4f 70 74 69  =0 );.  if( Opti
21220 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
21230 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72  (db, SQLITE_Quer
21240 79 46 6c 61 74 74 65 6e 65 72 29 20 29 20 72 65  yFlattener) ) re
21250 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d  turn 0;.  pSrc =
21260 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
21270 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f  rt( pSrc && iFro
21280 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53  m>=0 && iFrom<pS
21290 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53  rc->nSrc );.  pS
212a0 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e  ubitem = &pSrc->
212b0 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72  a[iFrom];.  iPar
212c0 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ent = pSubitem->
212d0 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20  iCursor;.  pSub 
212e0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c  = pSubitem->pSel
212f0 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ect;.  assert( p
21300 53 75 62 21 3d 30 20 29 3b 0a 0a 23 69 66 6e 64  Sub!=0 );..#ifnd
21310 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
21320 49 4e 44 4f 57 46 55 4e 43 0a 20 20 69 66 28 20  INDOWFUNC.  if( 
21330 70 2d 3e 70 57 69 6e 20 7c 7c 20 70 53 75 62 2d  p->pWin || pSub-
21340 3e 70 57 69 6e 20 29 20 72 65 74 75 72 6e 20 30  >pWin ) return 0
21350 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21360 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
21370 6e 20 28 32 35 29 20 2a 2f 0a 23 65 6e 64 69 66  n (25) */.#endif
21380 0a 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53  ..  pSubSrc = pS
21390 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65  ub->pSrc;.  asse
213a0 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20  rt( pSubSrc );. 
213b0 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72   /* Prior to ver
213c0 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e  sion 3.1.2, when
213d0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
213e0 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70  T had to be simp
213f0 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20  le constants,.  
21400 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79  ** not arbitrary
21410 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65   expressions, we
21420 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f   allowed some co
21430 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54  mbining of LIMIT
21440 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a   and OFFSET.  **
21450 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63 6f   because they co
21460 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20  uld be computed 
21470 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e  at compile-time.
21480 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54    But when LIMIT
21490 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a   and OFFSET.  **
214a0 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61 72   became arbitrar
214b0 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77  y expressions, w
214c0 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f  e were forced to
214d0 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e   add restriction
214e0 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20  s (13).  ** and 
214f0 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70  (14). */.  if( p
21500 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
21510 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->pLimit ) retur
21520 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
21530 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
21540 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70   (13) */.  if( p
21550 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
21560 53 75 62 2d 3e 70 4c 69 6d 69 74 2d 3e 70 52 69  Sub->pLimit->pRi
21570 67 68 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ght ) return 0; 
21580 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
21590 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 28   (14) */.  if( (
215a0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
215b0 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26 26  _Compound)!=0 &&
215c0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b   pSub->pLimit ){
215d0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 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 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
21610 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f  triction (15) */
21620 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53  .  }.  if( pSubS
21630 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65  rc->nSrc==0 ) re
21640 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
21650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21660 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29   Restriction (7)
21670 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
21680 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
21690 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e  istinct ) return
216a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
216b0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29   Restriction (4)
216c0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
216d0 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72 63  >pLimit && (pSrc
216e0 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67  ->nSrc>1 || isAg
216f0 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  g) ){.     retur
21700 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  n 0;         /* 
21710 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38 29  Restrictions (8)
21720 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  (9) */.  }.  if(
21730 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20   p->pOrderBy && 
21740 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
21750 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 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 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
21790 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a  striction (11) *
217a0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67  /.  }.  if( isAg
217b0 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  g && pSub->pOrde
217c0 72 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20  rBy ) return 0; 
217d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
217e0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
217f0 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  6) */.  if( pSub
21800 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70  ->pLimit && p->p
21810 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30  Where ) return 0
21820 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
21830 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
21840 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  9) */.  if( pSub
21850 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d 3e  ->pLimit && (p->
21860 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
21870 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20 20  stinct)!=0 ){.  
21880 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
21890 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
218a0 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a  ion (21) */.  }.
218b0 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46    if( pSub->selF
218c0 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63 75 72  lags & (SF_Recur
218d0 73 69 76 65 29 20 29 7b 0a 20 20 20 20 72 65 74  sive) ){.    ret
218e0 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69  urn 0; /* Restri
218f0 63 74 69 6f 6e 73 20 28 32 32 29 20 2a 2f 0a 20  ctions (22) */. 
21900 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66   }..  /*.  ** If
21910 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
21920 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
21930 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  nd of a LEFT JOI
21940 4e 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  N, then the.  **
21950 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f   subquery may no
21960 74 20 62 65 20 61 20 6a 6f 69 6e 20 69 74 73 65  t be a join itse
21970 6c 66 20 28 33 61 29 2e 20 45 78 61 6d 70 6c 65  lf (3a). Example
21980 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20   of why this is 
21990 6e 6f 74 0a 20 20 2a 2a 20 61 6c 6c 6f 77 65 64  not.  ** allowed
219a0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
219b0 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45      t1 LEFT OUTE
219c0 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20  R JOIN (t2 JOIN 
219d0 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  t3).  **.  ** If
219e0 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20   we flatten the 
219f0 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20  above, we would 
21a00 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  get.  **.  **   
21a10 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f        (t1 LEFT O
21a20 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f  UTER JOIN t2) JO
21a30 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20  IN t3.  **.  ** 
21a40 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20  which is not at 
21a50 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69  all the same thi
21a60 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ng..  **.  ** If
21a70 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
21a80 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
21a90 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  nd of a LEFT JOI
21aa0 4e 2c 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65  N, then the oute
21ab0 72 0a 20 20 2a 2a 20 71 75 65 72 79 20 63 61 6e  r.  ** query can
21ac0 6e 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65 67  not be an aggreg
21ad0 61 74 65 2e 20 28 33 63 29 20 20 54 68 69 73 20  ate. (3c)  This 
21ae0 69 73 20 61 6e 20 61 72 74 69 66 61 63 74 20 6f  is an artifact o
21af0 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 61  f the way.  ** a
21b00 67 67 72 65 67 61 74 65 73 20 61 72 65 20 70 72  ggregates are pr
21b10 6f 63 65 73 73 65 64 20 2d 20 74 68 65 72 65 20  ocessed - there 
21b20 69 73 20 6e 6f 20 6d 65 63 68 61 6e 69 73 6d 20  is no mechanism 
21b30 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 0a  to determine if.
21b40 20 20 2a 2a 20 74 68 65 20 4c 45 46 54 20 4a 4f    ** the LEFT JO
21b50 49 4e 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  IN table should 
21b60 62 65 20 61 6c 6c 2d 4e 55 4c 4c 2e 0a 20 20 2a  be all-NULL..  *
21b70 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 20  *.  ** See also 
21b80 74 69 63 6b 65 74 73 20 23 33 30 36 2c 20 23 33  tickets #306, #3
21b90 35 30 2c 20 61 6e 64 20 23 33 33 30 30 2e 0a 20  50, and #3300.. 
21ba0 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69   */.  if( (pSubi
21bb0 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  tem->fg.jointype
21bc0 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
21bd0 29 7b 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f 69  ){.    isLeftJoi
21be0 6e 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  n = 1;.    if( p
21bf0 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c  SubSrc->nSrc>1 |
21c00 7c 20 69 73 41 67 67 20 7c 7c 20 49 73 56 69 72  | isAgg || IsVir
21c10 74 75 61 6c 28 70 53 75 62 53 72 63 2d 3e 61 5b  tual(pSubSrc->a[
21c20 30 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  0].pTab) ){.    
21c30 20 20 2f 2a 20 20 28 33 61 29 20 20 20 20 20 20    /*  (3a)      
21c40 20 20 20 20 20 20 20 28 33 63 29 20 20 20 20 20         (3c)     
21c50 28 33 62 29 20 2a 2f 0a 20 20 20 20 20 20 72 65  (3b) */.      re
21c60 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
21c70 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
21c80 45 58 54 52 41 5f 49 46 4e 55 4c 4c 52 4f 57 0a  EXTRA_IFNULLROW.
21c90 20 20 65 6c 73 65 20 69 66 28 20 69 46 72 6f 6d    else if( iFrom
21ca0 3e 30 20 26 26 20 21 69 73 41 67 67 20 29 7b 0a  >0 && !isAgg ){.
21cb0 20 20 20 20 2f 2a 20 53 65 74 74 69 6e 67 20 69      /* Setting i
21cc0 73 4c 65 66 74 4a 6f 69 6e 20 74 6f 20 2d 31 20  sLeftJoin to -1 
21cd0 63 61 75 73 65 73 20 4f 50 5f 49 66 4e 75 6c 6c  causes OP_IfNull
21ce0 52 6f 77 20 6f 70 63 6f 64 65 73 20 74 6f 20 62  Row opcodes to b
21cf0 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 0a  e generated for.
21d00 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72 65 66      ** every ref
21d10 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 72 65  erence to any re
21d20 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d  sult column from
21d30 20 73 75 62 71 75 65 72 79 20 69 6e 20 61 20 6a   subquery in a j
21d40 6f 69 6e 2c 20 65 76 65 6e 0a 20 20 20 20 2a 2a  oin, even.    **
21d50 20 74 68 6f 75 67 68 20 74 68 65 79 20 61 72 65   though they are
21d60 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20   not necessary. 
21d70 20 54 68 69 73 20 77 69 6c 6c 20 73 74 72 65 73   This will stres
21d80 73 2d 74 65 73 74 20 74 68 65 20 4f 50 5f 49 66  s-test the OP_If
21d90 4e 75 6c 6c 52 6f 77 20 0a 20 20 20 20 2a 2a 20  NullRow .    ** 
21da0 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 69  opcode. */.    i
21db0 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 2d 31 3b 0a  sLeftJoin = -1;.
21dc0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
21dd0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37   Restriction (17
21de0 29 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  ): If the sub-qu
21df0 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
21e00 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69  d SELECT, then i
21e10 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20  t must.  ** use 
21e20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41  only the UNION A
21e30 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64  LL operator. And
21e40 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d   none of the sim
21e50 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69  ple select queri
21e60 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b  es.  ** that mak
21e70 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e  e up the compoun
21e80 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c  d SELECT are all
21e90 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65  owed to be aggre
21ea0 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74  gate or distinct
21eb0 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20  .  ** queries.. 
21ec0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
21ed0 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66  pPrior ){.    if
21ee0 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
21ef0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
21f00 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74   0;  /* Restrict
21f10 69 6f 6e 20 28 32 30 29 20 2a 2f 0a 20 20 20 20  ion (20) */.    
21f20 7d 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  }.    if( isAgg 
21f30 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  || (p->selFlags 
21f40 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
21f50 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21  0 || pSrc->nSrc!
21f60 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =1 ){.      retu
21f70 72 6e 20 30 3b 20 2f 2a 20 28 31 37 64 31 29 2c  rn 0; /* (17d1),
21f80 20 28 31 37 64 32 29 2c 20 6f 72 20 28 31 37 64   (17d2), or (17d
21f90 33 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  3) */.    }.    
21fa0 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20  for(pSub1=pSub; 
21fb0 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75  pSub1; pSub1=pSu
21fc0 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  b1->pPrior){.   
21fd0 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53     testcase( (pS
21fe0 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
21ff0 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
22000 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
22010 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
22020 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75    testcase( (pSu
22030 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
22040 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
22050 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41  ggregate))==SF_A
22060 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20  ggregate );.    
22070 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e    assert( pSub->
22080 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20  pSrc!=0 );.     
22090 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70   assert( pSub->p
220a0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 53  EList->nExpr==pS
220b0 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ub1->pEList->nEx
220c0 70 72 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pr );.      if( 
220d0 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73  (pSub1->selFlags
220e0 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
220f0 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d  SF_Aggregate))!=
22100 30 20 20 20 20 2f 2a 20 28 31 37 62 29 20 2a 2f  0    /* (17b) */
22110 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62  .       || (pSub
22120 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75  1->pPrior && pSu
22130 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20  b1->op!=TK_ALL) 
22140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22150 2f 2a 20 28 31 37 61 29 20 2a 2f 0a 20 20 20 20  /* (17a) */.    
22160 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72     || pSub1->pSr
22170 63 2d 3e 6e 53 72 63 3c 31 20 20 20 20 20 20 20  c->nSrc<1       
22180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31             /* (1
221a0 37 63 29 20 2a 2f 0a 20 20 20 20 20 20 29 7b 0a  7c) */.      ){.
221b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
221c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
221d0 74 65 73 74 63 61 73 65 28 20 70 53 75 62 31 2d  testcase( pSub1-
221e0 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b  >pSrc->nSrc>1 );
221f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
22200 65 73 74 72 69 63 74 69 6f 6e 20 28 31 38 29 2e  estriction (18).
22210 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
22220 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
22230 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66   int ii;.      f
22240 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70  or(ii=0; ii<p->p
22250 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
22260 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  ii++){.        i
22270 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  f( p->pOrderBy->
22280 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  a[ii].u.x.iOrder
22290 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72  ByCol==0 ) retur
222a0 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
222b0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 2d   }.  }..  /* Ex-
222c0 72 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33 29  restriction (23)
222d0 3a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 6c 79 20  :.  ** The only 
222e0 77 61 79 20 74 68 61 74 20 74 68 65 20 72 65 63  way that the rec
222f0 75 72 73 69 76 65 20 70 61 72 74 20 6f 66 20 61  ursive part of a
22300 20 43 54 45 20 63 61 6e 20 63 6f 6e 74 61 69 6e   CTE can contain
22310 20 61 20 63 6f 6d 70 6f 75 6e 64 0a 20 20 2a 2a   a compound.  **
22320 20 73 75 62 71 75 65 72 79 20 69 73 20 66 6f 72   subquery is for
22330 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74 6f   the subquery to
22340 20 62 65 20 6f 6e 65 20 74 65 72 6d 20 6f 66 20   be one term of 
22350 61 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66 20  a join.  But if 
22360 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
22370 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 74 68 65  y is a join, the
22380 6e 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67  n the flattening
22390 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
223a0 6e 20 73 74 6f 70 70 65 64 20 62 79 0a 20 20 2a  n stopped by.  *
223b0 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * restriction (1
223c0 37 64 33 29 0a 20 20 2a 2f 0a 20 20 61 73 73 65  7d3).  */.  asse
223d0 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  rt( (p->selFlags
223e0 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 29   & SF_Recursive)
223f0 3d 3d 30 20 7c 7c 20 70 53 75 62 2d 3e 70 50 72  ==0 || pSub->pPr
22400 69 6f 72 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 2a  ior==0 );..  /**
22410 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68 20  *** If we reach 
22420 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74  this point, flat
22430 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
22440 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45  ted. *****/.  SE
22450 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72  LECTTRACE(1,pPar
22460 73 65 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20 25  se,p,("flatten %
22470 75 2e 25 70 20 66 72 6f 6d 20 74 65 72 6d 20 25  u.%p from term %
22480 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
22490 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 73           pSub->s
224a0 65 6c 49 64 2c 20 70 53 75 62 2c 20 69 46 72 6f  elId, pSub, iFro
224b0 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 68 6f  m));..  /* Autho
224c0 72 69 7a 65 20 74 68 65 20 73 75 62 71 75 65 72  rize the subquer
224d0 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a  y */.  pParse->z
224e0 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53  AuthContext = pS
224f0 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20  ubitem->zName;. 
22500 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73   TESTONLY(i =) s
22510 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
22520 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
22530 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b  ELECT, 0, 0, 0);
22540 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d  .  testcase( i==
22550 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20  SQLITE_DENY );. 
22560 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
22570 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75  ntext = zSavedAu
22580 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a  thContext;..  /*
22590 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
225a0 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
225b0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
225c0 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73 74 72  , then (by restr
225d0 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20  ictions.  ** 17 
225e0 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69 74  and 18 above) it
225f0 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e   must be a UNION
22600 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72   ALL and the par
22610 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a  ent query must .
22620 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66    ** be of the f
22630 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  orm:.  **.  **  
22640 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d     SELECT <expr-
22650 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62  list> FROM (<sub
22660 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d  -query>) <where-
22670 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20  clause> .  **.  
22680 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  ** followed by a
22690 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d  ny ORDER BY, LIM
226a0 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54  IT and/or OFFSET
226b0 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62   clauses. This b
226c0 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65  lock.  ** create
226d0 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20  s N-1 copies of 
226e0 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
226f0 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44   without any ORD
22700 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20  ER BY, LIMIT or 
22710 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61  .  ** OFFSET cla
22720 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74  uses and joins t
22730 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  hem to the left-
22740 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65  hand-side of the
22750 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75   original.  ** u
22760 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f  sing UNION ALL o
22770 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69  perators. In thi
22780 73 20 63 61 73 65 20 4e 20 69 73 20 74 68 65 20  s case N is the 
22790 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65  number of simple
227a0 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61  .  ** select sta
227b0 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63  tements in the c
227c0 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72  ompound sub-quer
227d0 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61  y..  **.  ** Exa
227e0 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
227f0 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46      SELECT a+1 F
22800 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20  ROM (.  **      
22810 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
22820 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  tab.  **        
22830 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
22840 20 20 20 20 20 20 53 45 4c 45 43 54 20 79 20 46        SELECT y F
22850 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20  ROM tab.  **    
22860 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
22870 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
22880 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74   abs(z*2) FROM t
22890 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57  ab2.  **     ) W
228a0 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20  HERE a!=5 ORDER 
228b0 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  BY 1.  **.  ** T
228c0 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a  ransformed into:
228d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
228e0 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74  ELECT x+1 FROM t
228f0 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a  ab WHERE x+1!=5.
22900 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41    **     UNION A
22910 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  LL.  **     SELE
22920 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20  CT y+1 FROM tab 
22930 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a  WHERE y+1!=5.  *
22940 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a  *     UNION ALL.
22950 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
22960 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20  abs(z*2)+1 FROM 
22970 74 61 62 32 20 57 48 45 52 45 20 61 62 73 28 7a  tab2 WHERE abs(z
22980 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  *2)+1!=5.  **   
22990 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a    ORDER BY 1.  *
229a0 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74  *.  ** We call t
229b0 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e  his the "compoun
229c0 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74  d-subquery flatt
229d0 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66  ening"..  */.  f
229e0 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50  or(pSub=pSub->pP
229f0 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62  rior; pSub; pSub
22a00 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a  =pSub->pPrior){.
22a10 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77      Select *pNew
22a20 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
22a30 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
22a40 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72  rderBy;.    Expr
22a50 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c   *pLimit = p->pL
22a60 69 6d 69 74 3b 0a 20 20 20 20 53 65 6c 65 63 74  imit;.    Select
22a70 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50   *pPrior = p->pP
22a80 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  rior;.    p->pOr
22a90 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  derBy = 0;.    p
22aa0 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20  ->pSrc = 0;.    
22ab0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
22ac0 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
22ad0 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
22ae0 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
22af0 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e  , p, 0);.    p->
22b00 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
22b10 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
22b20 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20   = pOrderBy;.   
22b30 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b   p->pSrc = pSrc;
22b40 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  .    p->op = TK_
22b50 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ALL;.    if( pNe
22b60 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  w==0 ){.      p-
22b70 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
22b80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
22b90 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20     pNew->pPrior 
22ba0 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
22bb0 69 66 28 20 70 50 72 69 6f 72 20 29 20 70 50 72  if( pPrior ) pPr
22bc0 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65  ior->pNext = pNe
22bd0 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  w;.      pNew->p
22be0 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Next = p;.      
22bf0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77  p->pPrior = pNew
22c00 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  ;.      SELECTTR
22c10 41 43 45 28 32 2c 70 50 61 72 73 65 2c 70 2c 28  ACE(2,pParse,p,(
22c20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65  "compound-subque
22c30 72 79 20 66 6c 61 74 74 65 6e 65 72 22 0a 20 20  ry flattener".  
22c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c50 20 20 20 20 20 20 20 20 20 20 20 20 22 20 63 72              " cr
22c60 65 61 74 65 73 20 25 75 20 61 73 20 70 65 65 72  eates %u as peer
22c70 5c 6e 22 2c 70 4e 65 77 2d 3e 73 65 6c 49 64 29  \n",pNew->selId)
22c80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
22c90 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
22ca0 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  d ) return 1;.  
22cb0 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c  }..  /* Begin fl
22cc0 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72  attening the iFr
22cd0 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74  om-th entry of t
22ce0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a  he FROM clause .
22cf0 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65    ** in the oute
22d00 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  r query..  */.  
22d10 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70  pSub = pSub1 = p
22d20 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
22d30 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  ;..  /* Delete t
22d40 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62  he transient tab
22d50 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 73 73  le structure ass
22d60 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
22d70 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20  .  ** subquery. 
22d80 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46   */.  sqlite3DbF
22d90 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
22da0 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
22db0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
22dc0 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  , pSubitem->zNam
22dd0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
22de0 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
22df0 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75  ->zAlias);.  pSu
22e00 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  bitem->zDatabase
22e10 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
22e20 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70  ->zName = 0;.  p
22e30 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  Subitem->zAlias 
22e40 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
22e50 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20  >pSelect = 0;.. 
22e60 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69   /* Defer deleti
22e70 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  ng the Table obj
22e80 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ect associated w
22e90 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  ith the.  ** sub
22ea0 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65  query until code
22eb0 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20   generation is. 
22ec0 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69   ** complete, si
22ed0 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20 73 74  nce there may st
22ee0 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70  ill exist Expr.p
22ef0 54 61 62 20 65 6e 74 72 69 65 73 20 74 68 61 74  Tab entries that
22f00 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74  .  ** refer to t
22f10 68 65 20 73 75 62 71 75 65 72 79 20 65 76 65 6e  he subquery even
22f20 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e   after flattenin
22f30 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34 36  g.  Ticket #3346
22f40 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62  ..  **.  ** pSub
22f50 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c  item->pTab is al
22f60 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79  ways non-NULL by
22f70 20 74 65 73 74 20 72 65 73 74 72 69 63 74 69 6f   test restrictio
22f80 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61 62 6f  ns and tests abo
22f90 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41  ve..  */.  if( A
22fa0 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d 3e  LWAYS(pSubitem->
22fb0 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20  pTab!=0) ){.    
22fc0 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c  Table *pTabToDel
22fd0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61   = pSubitem->pTa
22fe0 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 54  b;.    if( pTabT
22ff0 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 3d 3d 31  oDel->nTabRef==1
23000 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20   ){.      Parse 
23010 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
23020 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
23030 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
23040 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78   pTabToDel->pNex
23050 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65  tZombie = pTople
23060 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b  vel->pZombieTab;
23070 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c  .      pToplevel
23080 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70  ->pZombieTab = p
23090 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65  TabToDel;.    }e
230a0 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54  lse{.      pTabT
230b0 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 2d 2d 3b  oDel->nTabRef--;
230c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69  .    }.    pSubi
230d0 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20  tem->pTab = 0;. 
230e0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
230f0 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73  lowing loop runs
23100 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
23110 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e  erm in a compoun
23120 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d-subquery.  ** 
23130 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64  flattening (as d
23140 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e  escribed above).
23150 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e    If we are doin
23160 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69  g a different ki
23170 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74  nd.  ** of flatt
23180 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65  ening - a flatte
23190 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  ning other than 
231a0 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75  a compound-subqu
231b0 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d  ery flattening -
231c0 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  .  ** then this 
231d0 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f  loop only runs o
231e0 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nce..  **.  ** T
231f0 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61  his loop moves a
23200 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65  ll of the FROM e
23210 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73  lements of the s
23220 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
23230 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
23240 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
23250 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72  er query.  Befor
23260 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65  e doing this, re
23270 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20  member.  ** the 
23280 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
23290 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f  r the original o
232a0 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20  uter query FROM 
232b0 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20  element in.  ** 
232c0 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50  iParent.  The iP
232d0 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c  arent cursor wil
232e0 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e  l never be used.
232f0 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64    Subsequent cod
23300 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e  e.  ** will scan
23310 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f   expressions loo
23320 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74  king for iParent
23330 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
23340 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f  replace.  ** tho
23350 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69  se references wi
23360 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  th expressions t
23370 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74  hat resolve to t
23380 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  he subquery FROM
23390 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77  .  ** elements w
233a0 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e  e are now copyin
233b0 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  g in..  */.  for
233c0 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72  (pParent=p; pPar
233d0 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61  ent; pParent=pPa
233e0 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53  rent->pPrior, pS
233f0 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29  ub=pSub->pPrior)
23400 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72  {.    int nSubSr
23410 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79  c;.    u8 jointy
23420 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62  pe = 0;.    pSub
23430 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
23440 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ;     /* FROM cl
23450 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79  ause of subquery
23460 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20   */.    nSubSrc 
23470 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b  = pSubSrc->nSrc;
23480 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
23490 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79  erms in subquery
234a0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
234b0 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65      pSrc = pPare
234c0 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a  nt->pSrc;     /*
234d0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
234e0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
234f0 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63  */..    if( pSrc
23500 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
23510 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20  ( pParent==p ); 
23520 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74   /* First time t
23530 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
23540 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  */.      jointyp
23550 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 66 67  e = pSubitem->fg
23560 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  .jointype;.    }
23570 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
23580 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29  rt( pParent!=p )
23590 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75  ;  /* 2nd and su
235a0 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74  bsequent times t
235b0 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
235c0 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  */.      pSrc = 
235d0 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
235e0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
235f0 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30  pend(db, 0, 0, 0
23600 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72  );.      if( pSr
23610 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
23620 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
23630 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
23640 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
23650 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
23660 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75 73   The subquery us
23670 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74  es a single slot
23680 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
23690 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
236a0 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20  .    ** query.  
236b0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
236c0 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
236d0 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73  e element in its
236e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20   FROM clause,.  
236f0 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64    ** then expand
23700 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
23710 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66   to make space f
23720 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c  or it to hold al
23730 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a  l elements.    *
23740 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
23750 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
23760 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
23770 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43  .    **    SELEC
23780 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28  T * FROM tabA, (
23790 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75  SELECT * FROM su
237a0 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b  b1, sub2), tabB;
237b0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
237c0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68  he outer query h
237d0 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74  as 3 slots in it
237e0 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
237f0 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a  One slot of the.
23800 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
23810 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73  ry (the middle s
23820 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79 20  lot) is used by 
23830 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54  the subquery.  T
23840 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62  he next.    ** b
23850 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c  lock of code wil
23860 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  l expand the out
23870 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 63 6c  er query FROM cl
23880 61 75 73 65 20 74 6f 20 34 20 73 6c 6f 74 73 2e  ause to 4 slots.
23890 0a 20 20 20 20 2a 2a 20 54 68 65 20 6d 69 64 64  .    ** The midd
238a0 6c 65 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e  le slot is expan
238b0 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73  ded to two slots
238c0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b   in order to mak
238d0 65 20 73 70 61 63 65 0a 20 20 20 20 2a 2a 20 66  e space.    ** f
238e0 6f 72 20 74 68 65 20 74 77 6f 20 65 6c 65 6d 65  or the two eleme
238f0 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  nts in the FROM 
23900 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
23910 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20  bquery..    */. 
23920 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31     if( nSubSrc>1
23930 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   ){.      pParen
23940 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d  t->pSrc = pSrc =
23950 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45   sqlite3SrcListE
23960 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c  nlarge(db, pSrc,
23970 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d   nSubSrc-1,iFrom
23980 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  +1);.      if( d
23990 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
239a0 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
239b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
239c0 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72  .    /* Transfer
239d0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
239e0 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20   terms from the 
239f0 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
23a00 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
23a10 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uery..    */.   
23a20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
23a30 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
23a40 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
23a50 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61  lete(db, pSrc->a
23a60 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67  [i+iFrom].pUsing
23a70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
23a80 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d   pSrc->a[i+iFrom
23a90 5d 2e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d  ].fg.isTabFunc==
23aa0 30 20 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d  0 );.      pSrc-
23ab0 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53  >a[i+iFrom] = pS
23ac0 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  ubSrc->a[i];.   
23ad0 20 20 20 69 4e 65 77 50 61 72 65 6e 74 20 3d 20     iNewParent = 
23ae0 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2e 69 43  pSubSrc->a[i].iC
23af0 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 6d 65 6d  ursor;.      mem
23b00 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b  set(&pSubSrc->a[
23b10 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  i], 0, sizeof(pS
23b20 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20  ubSrc->a[i]));. 
23b30 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61     }.    pSrc->a
23b40 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e 74  [iFrom].fg.joint
23b50 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a  ype = jointype;.
23b60 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65    .    /* Now be
23b70 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67  gin substituting
23b80 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74   subquery result
23b90 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73   set expressions
23ba0 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66   for .    ** ref
23bb0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69  erences to the i
23bc0 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75  Parent in the ou
23bd0 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a  ter query..    *
23be0 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  * .    ** Exampl
23bf0 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
23c00 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62     SELECT a+5, b
23c10 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  *10 FROM (SELECT
23c20 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20   x*3 AS a, y+10 
23c30 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48  AS b FROM t1) WH
23c40 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20  ERE a>b;.    ** 
23c50 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
23c60 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
23c70 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20  ______ subquery 
23c80 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
23c90 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20       /.    **   
23ca0 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
23cb0 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75  _______ outer qu
23cc0 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ery ____________
23cd0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23ce0 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  __/.    **.    *
23cf0 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65  * We look at eve
23d00 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
23d10 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
23d20 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65   and every place
23d30 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22   we see.    ** "
23d40 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  a" we substitute
23d50 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79   "x*3" and every
23d60 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62   place we see "b
23d70 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
23d80 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20  "y+10"..    */. 
23d90 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72     if( pSub->pOr
23da0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 2f  derBy ){.      /
23db0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
23dc0 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f   any non-zero iO
23dd0 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 73  rderByCol values
23de0 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
23df0 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44 45  he.      ** ORDE
23e00 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70 72  R BY column expr
23e10 65 73 73 69 6f 6e 20 69 73 20 69 64 65 6e 74 69  ession is identi
23e20 63 61 6c 20 74 6f 20 74 68 65 20 69 4f 72 64 65  cal to the iOrde
23e30 72 42 79 43 6f 6c 27 74 68 0a 20 20 20 20 20 20  rByCol'th.      
23e40 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  ** expression re
23e50 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54  turned by SELECT
23e60 20 73 74 61 74 65 6d 65 6e 74 20 70 53 75 62 2e   statement pSub.
23e70 20 53 69 6e 63 65 20 74 68 65 73 65 20 76 61 6c   Since these val
23e80 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20  ues.      ** do 
23e90 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
23ea0 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 63 6f  correspond to co
23eb0 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54 20  lumns in SELECT 
23ec0 73 74 61 74 65 6d 65 6e 74 20 70 50 61 72 65 6e  statement pParen
23ed0 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  t,.      ** zero
23ee0 20 74 68 65 6d 20 62 65 66 6f 72 65 20 74 72 61   them before tra
23ef0 6e 73 66 65 72 69 6e 67 20 74 68 65 20 4f 52 44  nsfering the ORD
23f00 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20  ER BY clause..  
23f10 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
23f20 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69 73 20 6d  Not doing this m
23f30 61 79 20 63 61 75 73 65 20 61 6e 20 65 72 72 6f  ay cause an erro
23f40 72 20 69 66 20 61 20 73 75 62 73 65 71 75 65 6e  r if a subsequen
23f50 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20  t call to this. 
23f60 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
23f70 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61   attempts to fla
23f80 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20  tten a compound 
23f90 73 75 62 2d 71 75 65 72 79 20 69 6e 74 6f 20 70  sub-query into p
23fa0 50 61 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  Parent.      ** 
23fb0 28 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68  (the only way th
23fc0 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 69 73  is can happen is
23fd0 20 69 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   if the compound
23fe0 20 73 75 62 2d 71 75 65 72 79 20 69 73 0a 20 20   sub-query is.  
23ff0 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79      ** currently
24000 20 70 61 72 74 20 6f 66 20 70 53 75 62 2d 3e 70   part of pSub->p
24010 53 72 63 29 2e 20 53 65 65 20 74 69 63 6b 65 74  Src). See ticket
24020 20 5b 64 31 31 61 36 65 39 30 38 66 5d 2e 20 20   [d11a6e908f].  
24030 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
24040 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53  t *pOrderBy = pS
24050 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  ub->pOrderBy;.  
24060 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
24070 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
24080 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4f  i++){.        pO
24090 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78  rderBy->a[i].u.x
240a0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 30  .iOrderByCol = 0
240b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
240c0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
240d0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
240e0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
240f0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
24100 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e  By;.      pSub->
24110 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
24120 20 20 7d 0a 20 20 20 20 70 57 68 65 72 65 20 3d    }.    pWhere =
24130 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
24140 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65  db, pSub->pWhere
24150 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 69 73  , 0);.    if( is
24160 4c 65 66 74 4a 6f 69 6e 3e 30 20 29 7b 0a 20 20  LeftJoin>0 ){.  
24170 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28      setJoinExpr(
24180 70 57 68 65 72 65 2c 20 69 4e 65 77 50 61 72 65  pWhere, iNewPare
24190 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nt);.    }.    p
241a0 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d  Parent->pWhere =
241b0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
241c0 64 62 2c 20 70 57 68 65 72 65 2c 20 70 50 61 72  db, pWhere, pPar
241d0 65 6e 74 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  ent->pWhere);.  
241e0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
241f0 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Failed==0 ){.   
24200 20 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20     SubstContext 
24210 78 3b 0a 20 20 20 20 20 20 78 2e 70 50 61 72 73  x;.      x.pPars
24220 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20  e = pParse;.    
24230 20 20 78 2e 69 54 61 62 6c 65 20 3d 20 69 50 61    x.iTable = iPa
24240 72 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e 69 4e  rent;.      x.iN
24250 65 77 54 61 62 6c 65 20 3d 20 69 4e 65 77 50 61  ewTable = iNewPa
24260 72 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e 69 73  rent;.      x.is
24270 4c 65 66 74 4a 6f 69 6e 20 3d 20 69 73 4c 65 66  LeftJoin = isLef
24280 74 4a 6f 69 6e 3b 0a 20 20 20 20 20 20 78 2e 70  tJoin;.      x.p
24290 45 4c 69 73 74 20 3d 20 70 53 75 62 2d 3e 70 45  EList = pSub->pE
242a0 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 75 62 73  List;.      subs
242b0 74 53 65 6c 65 63 74 28 26 78 2c 20 70 50 61 72  tSelect(&x, pPar
242c0 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ent, 0);.    }. 
242d0 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61   .    /* The fla
242e0 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20  ttened query is 
242f0 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68  distinct if eith
24300 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20  er the inner or 
24310 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72  the.    ** outer
24320 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e   query is distin
24330 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ct. .    */.    
24340 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67  pParent->selFlag
24350 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c  s |= pSub->selFl
24360 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
24370 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20  t;.  .    /*.   
24380 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46   ** SELECT ... F
24390 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20  ROM (SELECT ... 
243a0 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62  LIMIT a OFFSET b
243b0 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54  ) LIMIT x OFFSET
243c0 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   y;.    **.    *
243d0 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64  * One is tempted
243e0 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61   to try to add a
243f0 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e   and b to combin
24400 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42  e the limits.  B
24410 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64  ut this.    ** d
24420 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20  oes not work if 
24430 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20  either limit is 
24440 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f  negative..    */
24450 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
24460 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70  Limit ){.      p
24470 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d  Parent->pLimit =
24480 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20   pSub->pLimit;. 
24490 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69       pSub->pLimi
244a0 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 0;.    }.  }
244b0 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c  ..  /* Finially,
244c0 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73 20   delete what is 
244d0 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62 71  left of the subq
244e0 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a  uery and return.
244f0 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20    ** success..  
24500 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  */.  sqlite3Sele
24510 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75  ctDelete(db, pSu
24520 62 31 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54  b1);..#if SELECT
24530 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
24540 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
24550 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  tTrace & 0x100 )
24560 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  {.    SELECTTRAC
24570 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70  E(0x100,pParse,p
24580 2c 28 22 41 66 74 65 72 20 66 6c 61 74 74 65 6e  ,("After flatten
24590 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73  ing:\n"));.    s
245a0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
245b0 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
245c0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
245d0 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
245e0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
245f0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
24600 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
24610 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
24620 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75  */../*.** A stru
24630 63 74 75 72 65 20 74 6f 20 6b 65 65 70 20 74 72  cture to keep tr
24640 61 63 6b 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68  ack of all of th
24650 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20  e column values 
24660 74 68 61 74 20 61 72 65 20 66 69 78 65 64 20 74  that are fixed t
24670 6f 0a 2a 2a 20 61 20 6b 6e 6f 77 6e 20 76 61 6c  o.** a known val
24680 75 65 20 64 75 65 20 74 6f 20 57 48 45 52 45 20  ue due to WHERE 
24690 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
246a0 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 43  ts of the form C
246b0 4f 4c 55 4d 4e 3d 56 41 4c 55 45 2e 0a 2a 2f 0a  OLUMN=VALUE..*/.
246c0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57  typedef struct W
246d0 68 65 72 65 43 6f 6e 73 74 20 57 68 65 72 65 43  hereConst WhereC
246e0 6f 6e 73 74 3b 0a 73 74 72 75 63 74 20 57 68 65  onst;.struct Whe
246f0 72 65 43 6f 6e 73 74 20 7b 0a 20 20 50 61 72 73  reConst {.  Pars
24700 65 20 2a 70 50 61 72 73 65 3b 20 20 20 2f 2a 20  e *pParse;   /* 
24710 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
24720 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 3b  */.  int nConst;
24730 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
24740 66 6f 72 20 43 4f 4c 55 4d 4e 3d 43 4f 4e 53 54  for COLUMN=CONST
24750 41 4e 54 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69  ANT terms */.  i
24760 6e 74 20 6e 43 68 6e 67 3b 20 20 20 20 20 20 20  nt nChng;       
24770 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d  /* Number of tim
24780 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 73  es a constant is
24790 20 70 72 6f 70 61 67 61 74 65 64 20 2a 2f 0a 20   propagated */. 
247a0 20 45 78 70 72 20 2a 2a 61 70 45 78 70 72 3b 20   Expr **apExpr; 
247b0 20 20 2f 2a 20 5b 69 2a 32 5d 20 69 73 20 43 4f    /* [i*2] is CO
247c0 4c 55 4d 4e 20 61 6e 64 20 5b 69 2a 32 2b 31 5d  LUMN and [i*2+1]
247d0 20 69 73 20 56 41 4c 55 45 20 2a 2f 0a 7d 3b 0a   is VALUE */.};.
247e0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
247f0 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 43   entry to the pC
24800 6f 6e 73 74 20 6f 62 6a 65 63 74 2e 20 20 45 78  onst object.  Ex
24810 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 61 64 64  cept, do not add
24820 20 64 75 70 6c 69 63 61 74 65 0a 2a 2a 20 70 43   duplicate.** pC
24830 6f 6c 75 6d 6e 20 65 6e 74 69 72 65 73 2e 0a 2a  olumn entires..*
24840 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
24850 6e 73 74 49 6e 73 65 72 74 28 0a 20 20 57 68 65  nstInsert(.  Whe
24860 72 65 43 6f 6e 73 74 20 2a 70 43 6f 6e 73 74 2c  reConst *pConst,
24870 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65        /* The Whe
24880 72 65 43 6f 6e 73 74 20 69 6e 74 6f 20 77 68 69  reConst into whi
24890 63 68 20 77 65 20 61 72 65 20 69 6e 73 65 72 74  ch we are insert
248a0 69 6e 67 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ing */.  Expr *p
248b0 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20  Column,         
248c0 20 20 2f 2a 20 54 68 65 20 43 4f 4c 55 4d 4e 20    /* The COLUMN 
248d0 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6e 73  part of the cons
248e0 74 72 61 69 6e 74 20 2a 2f 0a 20 20 45 78 70 72  traint */.  Expr
248f0 20 2a 70 56 61 6c 75 65 20 20 20 20 20 20 20 20   *pValue        
24900 20 20 20 20 20 2f 2a 20 54 68 65 20 56 41 4c 55       /* The VALU
24910 45 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f  E part of the co
24920 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20  nstraint */.){. 
24930 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
24940 28 20 70 43 6f 6c 75 6d 6e 2d 3e 6f 70 3d 3d 54  ( pColumn->op==T
24950 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 0a 20 20 2f  K_COLUMN );..  /
24960 2a 20 32 30 31 38 2d 31 30 2d 32 35 20 74 69 63  * 2018-10-25 tic
24970 6b 65 74 20 5b 63 66 35 65 64 32 30 66 5d 0a 20  ket [cf5ed20f]. 
24980 20 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   ** Make sure th
24990 65 20 73 61 6d 65 20 70 43 6f 6c 75 6d 6e 20 69  e same pColumn i
249a0 73 20 6e 6f 74 20 69 6e 73 65 72 74 65 64 20 6d  s not inserted m
249b0 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 2a 2f  ore than once */
249c0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43  .  for(i=0; i<pC
249d0 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 3b 20 69 2b  onst->nConst; i+
249e0 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 45 78  +){.    const Ex
249f0 70 72 20 2a 70 45 78 70 72 20 3d 20 70 43 6f 6e  pr *pExpr = pCon
24a00 73 74 2d 3e 61 70 45 78 70 72 5b 69 2a 32 5d 3b  st->apExpr[i*2];
24a10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
24a20 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
24a30 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  N );.    if( pEx
24a40 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 43 6f 6c  pr->iTable==pCol
24a50 75 6d 6e 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20  umn->iTable.    
24a60 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
24a70 6d 6e 3d 3d 70 43 6f 6c 75 6d 6e 2d 3e 69 43 6f  mn==pColumn->iCo
24a80 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20  lumn.    ){.    
24a90 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 41 6c    return;  /* Al
24aa0 72 65 61 64 79 20 70 72 65 73 65 6e 74 2e 20 20  ready present.  
24ab0 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  Return without d
24ac0 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 2a  oing anything. *
24ad0 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  /.    }.  }..  p
24ae0 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2b 2b 3b  Const->nConst++;
24af0 0a 20 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70  .  pConst->apExp
24b00 72 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  r = sqlite3DbRea
24b10 6c 6c 6f 63 4f 72 46 72 65 65 28 70 43 6f 6e 73  llocOrFree(pCons
24b20 74 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  t->pParse->db, p
24b30 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 2c 0a 20  Const->apExpr,. 
24b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b50 20 20 20 20 20 20 20 20 70 43 6f 6e 73 74 2d 3e          pConst->
24b60 6e 43 6f 6e 73 74 2a 32 2a 73 69 7a 65 6f 66 28  nConst*2*sizeof(
24b70 45 78 70 72 2a 29 29 3b 0a 20 20 69 66 28 20 70  Expr*));.  if( p
24b80 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 3d 3d 30  Const->apExpr==0
24b90 20 29 7b 0a 20 20 20 20 70 43 6f 6e 73 74 2d 3e   ){.    pConst->
24ba0 6e 43 6f 6e 73 74 20 3d 20 30 3b 0a 20 20 7d 65  nConst = 0;.  }e
24bb0 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 45 78 70  lse{.    if( Exp
24bc0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 56 61  rHasProperty(pVa
24bd0 6c 75 65 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c  lue, EP_FixedCol
24be0 29 20 29 20 70 56 61 6c 75 65 20 3d 20 70 56 61  ) ) pValue = pVa
24bf0 6c 75 65 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  lue->pLeft;.    
24c00 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b 70  pConst->apExpr[p
24c10 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2a 32 2d  Const->nConst*2-
24c20 32 5d 20 3d 20 70 43 6f 6c 75 6d 6e 3b 0a 20 20  2] = pColumn;.  
24c30 20 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72    pConst->apExpr
24c40 5b 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2a  [pConst->nConst*
24c50 32 2d 31 5d 20 3d 20 70 56 61 6c 75 65 3b 0a 20  2-1] = pValue;. 
24c60 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64   }.}../*.** Find
24c70 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 43 4f   all terms of CO
24c80 4c 55 4d 4e 3d 56 41 4c 55 45 20 6f 72 20 56 41  LUMN=VALUE or VA
24c90 4c 55 45 3d 43 4f 4c 55 4d 4e 20 69 6e 20 70 45  LUE=COLUMN in pE
24ca0 78 70 72 20 77 68 65 72 65 20 56 41 4c 55 45 0a  xpr where VALUE.
24cb0 2a 2a 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  ** is a constant
24cc0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
24cd0 77 68 65 72 65 20 74 68 65 20 74 65 72 6d 20 6d  where the term m
24ce0 75 73 74 20 62 65 20 74 72 75 65 20 62 65 63 61  ust be true beca
24cf0 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 70 61 72  use it.** is par
24d00 74 20 6f 66 20 74 68 65 20 41 4e 44 2d 63 6f 6e  t of the AND-con
24d10 6e 65 63 74 65 64 20 74 65 72 6d 73 20 6f 66 20  nected terms of 
24d20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  the expression. 
24d30 20 46 6f 72 20 65 61 63 68 20 74 65 72 6d 0a 2a   For each term.*
24d40 2a 20 66 6f 75 6e 64 2c 20 61 64 64 20 69 74 20  * found, add it 
24d50 74 6f 20 74 68 65 20 70 43 6f 6e 73 74 20 73 74  to the pConst st
24d60 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
24d70 69 63 20 76 6f 69 64 20 66 69 6e 64 43 6f 6e 73  ic void findCons
24d80 74 49 6e 57 68 65 72 65 28 57 68 65 72 65 43 6f  tInWhere(WhereCo
24d90 6e 73 74 20 2a 70 43 6f 6e 73 74 2c 20 45 78 70  nst *pConst, Exp
24da0 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70  r *pExpr){.  Exp
24db0 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66  r *pRight, *pLef
24dc0 74 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  t;.  if( pExpr==
24dd0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
24de0 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
24df0 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
24e00 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a  Join) ) return;.
24e10 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
24e20 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 66  =TK_AND ){.    f
24e30 69 6e 64 43 6f 6e 73 74 49 6e 57 68 65 72 65 28  indConstInWhere(
24e40 70 43 6f 6e 73 74 2c 20 70 45 78 70 72 2d 3e 70  pConst, pExpr->p
24e50 52 69 67 68 74 29 3b 0a 20 20 20 20 66 69 6e 64  Right);.    find
24e60 43 6f 6e 73 74 49 6e 57 68 65 72 65 28 70 43 6f  ConstInWhere(pCo
24e70 6e 73 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  nst, pExpr->pLef
24e80 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
24e90 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d    }.  if( pExpr-
24ea0 3e 6f 70 21 3d 54 4b 5f 45 51 20 29 20 72 65 74  >op!=TK_EQ ) ret
24eb0 75 72 6e 3b 0a 20 20 70 52 69 67 68 74 20 3d 20  urn;.  pRight = 
24ec0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
24ed0 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e   pLeft = pExpr->
24ee0 70 4c 65 66 74 3b 0a 20 20 61 73 73 65 72 74 28  pLeft;.  assert(
24ef0 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20   pRight!=0 );.  
24f00 61 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30  assert( pLeft!=0
24f10 20 29 3b 0a 20 20 69 66 28 20 70 52 69 67 68 74   );.  if( pRight
24f20 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
24f30 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72     && !ExprHasPr
24f40 6f 70 65 72 74 79 28 70 52 69 67 68 74 2c 20 45  operty(pRight, E
24f50 50 5f 46 69 78 65 64 43 6f 6c 29 0a 20 20 20 26  P_FixedCol).   &
24f60 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
24f70 6f 6e 73 74 61 6e 74 28 70 4c 65 66 74 29 0a 20  onstant(pLeft). 
24f80 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 42 69    && sqlite3IsBi
24f90 6e 61 72 79 28 73 71 6c 69 74 65 33 42 69 6e 61  nary(sqlite3Bina
24fa0 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
24fb0 28 70 43 6f 6e 73 74 2d 3e 70 50 61 72 73 65 2c  (pConst->pParse,
24fc0 70 4c 65 66 74 2c 70 52 69 67 68 74 29 29 0a 20  pLeft,pRight)). 
24fd0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 49 6e 73   ){.    constIns
24fe0 65 72 74 28 70 43 6f 6e 73 74 2c 20 70 52 69 67  ert(pConst, pRig
24ff0 68 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d 65  ht, pLeft);.  }e
25000 6c 73 65 0a 20 20 69 66 28 20 70 4c 65 66 74 2d  lse.  if( pLeft-
25010 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
25020 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f    && !ExprHasPro
25030 70 65 72 74 79 28 70 4c 65 66 74 2c 20 45 50 5f  perty(pLeft, EP_
25040 46 69 78 65 64 43 6f 6c 29 0a 20 20 20 26 26 20  FixedCol).   && 
25050 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
25060 73 74 61 6e 74 28 70 52 69 67 68 74 29 0a 20 20  stant(pRight).  
25070 20 26 26 20 73 71 6c 69 74 65 33 49 73 42 69 6e   && sqlite3IsBin
25080 61 72 79 28 73 71 6c 69 74 65 33 42 69 6e 61 72  ary(sqlite3Binar
25090 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
250a0 70 43 6f 6e 73 74 2d 3e 70 50 61 72 73 65 2c 70  pConst->pParse,p
250b0 4c 65 66 74 2c 70 52 69 67 68 74 29 29 0a 20 20  Left,pRight)).  
250c0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 49 6e 73 65  ){.    constInse
250d0 72 74 28 70 43 6f 6e 73 74 2c 20 70 4c 65 66 74  rt(pConst, pLeft
250e0 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 7d  , pRight);.  }.}
250f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
25100 61 20 57 61 6c 6b 65 72 20 65 78 70 72 65 73 73  a Walker express
25110 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 2e 20 20 70  ion callback.  p
25120 45 78 70 72 20 69 73 20 61 20 63 61 6e 64 69 64  Expr is a candid
25130 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  ate expression.*
25140 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64  * to be replaced
25150 20 62 79 20 61 20 76 61 6c 75 65 2e 20 20 49 66   by a value.  If
25160 20 70 45 78 70 72 20 69 73 20 65 71 75 69 76 61   pExpr is equiva
25170 6c 65 6e 74 20 74 6f 20 6f 6e 65 20 6f 66 20 74  lent to one of t
25180 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6e 61  he.** columns na
25190 6d 65 64 20 69 6e 20 70 57 61 6c 6b 65 72 2d 3e  med in pWalker->
251a0 75 2e 70 43 6f 6e 73 74 2c 20 74 68 65 6e 20 6f  u.pConst, then o
251b0 76 65 72 77 72 69 74 65 20 69 74 20 77 69 74 68  verwrite it with
251c0 20 69 74 73 0a 2a 2a 20 63 6f 72 72 65 73 70 6f   its.** correspo
251d0 6e 64 69 6e 67 20 76 61 6c 75 65 2e 0a 2a 2f 0a  nding value..*/.
251e0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 70 61  static int propa
251f0 67 61 74 65 43 6f 6e 73 74 61 6e 74 45 78 70 72  gateConstantExpr
25200 52 65 77 72 69 74 65 28 57 61 6c 6b 65 72 20 2a  Rewrite(Walker *
25210 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
25220 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Expr){.  int i;.
25230 20 20 57 68 65 72 65 43 6f 6e 73 74 20 2a 70 43    WhereConst *pC
25240 6f 6e 73 74 3b 0a 20 20 69 66 28 20 70 45 78 70  onst;.  if( pExp
25250 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
25260 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
25270 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28 20 45 78  ntinue;.  if( Ex
25280 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
25290 78 70 72 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c  xpr, EP_FixedCol
252a0 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ) ) return WRC_C
252b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 70 43 6f 6e 73  ontinue;.  pCons
252c0 74 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  t = pWalker->u.p
252d0 43 6f 6e 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30  Const;.  for(i=0
252e0 3b 20 69 3c 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e  ; i<pConst->nCon
252f0 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  st; i++){.    Ex
25300 70 72 20 2a 70 43 6f 6c 75 6d 6e 20 3d 20 70 43  pr *pColumn = pC
25310 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b 69 2a 32  onst->apExpr[i*2
25320 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 75  ];.    if( pColu
25330 6d 6e 3d 3d 70 45 78 70 72 20 29 20 63 6f 6e 74  mn==pExpr ) cont
25340 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43  inue;.    if( pC
25350 6f 6c 75 6d 6e 2d 3e 69 54 61 62 6c 65 21 3d 70  olumn->iTable!=p
25360 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 20 63  Expr->iTable ) c
25370 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
25380 20 70 43 6f 6c 75 6d 6e 2d 3e 69 43 6f 6c 75 6d   pColumn->iColum
25390 6e 21 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n!=pExpr->iColum
253a0 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
253b0 20 20 2f 2a 20 41 20 6d 61 74 63 68 20 69 73 20    /* A match is 
253c0 66 6f 75 6e 64 2e 20 20 41 64 64 20 74 68 65 20  found.  Add the 
253d0 45 50 5f 46 69 78 65 64 43 6f 6c 20 70 72 6f 70  EP_FixedCol prop
253e0 65 72 74 79 20 2a 2f 0a 20 20 20 20 70 43 6f 6e  erty */.    pCon
253f0 73 74 2d 3e 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20  st->nChng++;.   
25400 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72   ExprClearProper
25410 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4c 65 61  ty(pExpr, EP_Lea
25420 66 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74 50  f);.    ExprSetP
25430 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
25440 50 5f 46 69 78 65 64 43 6f 6c 29 3b 0a 20 20 20  P_FixedCol);.   
25450 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
25460 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pLeft==0 );.    
25470 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73  pExpr->pLeft = s
25480 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 43  qlite3ExprDup(pC
25490 6f 6e 73 74 2d 3e 70 50 61 72 73 65 2d 3e 64 62  onst->pParse->db
254a0 2c 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72  , pConst->apExpr
254b0 5b 69 2a 32 2b 31 5d 2c 20 30 29 3b 0a 20 20 20  [i*2+1], 0);.   
254c0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
254d0 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
254e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 57 48 45  }../*.** The WHE
254f0 52 45 2d 63 6c 61 75 73 65 20 63 6f 6e 73 74 61  RE-clause consta
25500 6e 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6f  nt propagation o
25510 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a  ptimization..**.
25520 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20  ** If the WHERE 
25530 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
25540 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72  terms of the for
25550 6d 20 43 4f 4c 55 4d 4e 3d 43 4f 4e 53 54 41 4e  m COLUMN=CONSTAN
25560 54 20 6f 72 0a 2a 2a 20 43 4f 4e 53 54 41 4e 54  T or.** CONSTANT
25570 3d 43 4f 4c 55 4d 4e 20 74 68 61 74 20 6d 75 73  =COLUMN that mus
25580 74 20 62 65 20 74 72 65 65 20 28 69 6e 20 6f 74  t be tree (in ot
25590 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68  her words, if th
255a0 65 20 74 65 72 6d 73 20 74 6f 70 2d 6c 65 76 65  e terms top-leve
255b0 6c 0a 2a 2a 20 41 4e 44 2d 63 6f 6e 6e 65 63 74  l.** AND-connect
255c0 65 64 20 74 65 72 6d 73 20 74 68 61 74 20 61 72  ed terms that ar
255d0 65 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20  e not part of a 
255e0 4f 4e 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 61  ON clause from a
255f0 20 4c 45 46 54 20 4a 4f 49 4e 29 0a 2a 2a 20 74   LEFT JOIN).** t
25600 68 65 6e 20 74 68 72 6f 75 67 68 6f 75 74 20 74  hen throughout t
25610 68 65 20 71 75 65 72 79 20 72 65 70 6c 61 63 65  he query replace
25620 20 61 6c 6c 20 6f 74 68 65 72 20 6f 63 63 75 72   all other occur
25630 72 65 6e 63 65 73 20 6f 66 20 43 4f 4c 55 4d 4e  rences of COLUMN
25640 0a 2a 2a 20 77 69 74 68 20 43 4f 4e 53 54 41 4e  .** with CONSTAN
25650 54 20 77 69 74 68 69 6e 20 74 68 65 20 57 48 45  T within the WHE
25660 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  RE clause..**.**
25670 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   For example, th
25680 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  e query:.**.**  
25690 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
256a0 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45  M t1, t2, t3 WHE
256b0 52 45 20 74 31 2e 61 3d 33 39 20 41 4e 44 20 74  RE t1.a=39 AND t
256c0 32 2e 62 3d 74 31 2e 61 20 41 4e 44 20 74 33 2e  2.b=t1.a AND t3.
256d0 63 3d 74 32 2e 62 0a 2a 2a 0a 2a 2a 20 49 73 20  c=t2.b.**.** Is 
256e0 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  transformed into
256f0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 53 45 4c 45  .**.**      SELE
25700 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32  CT * FROM t1, t2
25710 2c 20 74 33 20 57 48 45 52 45 20 74 31 2e 61 3d  , t3 WHERE t1.a=
25720 33 39 20 41 4e 44 20 74 32 2e 62 3d 33 39 20 41  39 AND t2.b=39 A
25730 4e 44 20 74 33 2e 63 3d 33 39 0a 2a 2a 0a 2a 2a  ND t3.c=39.**.**
25740 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
25750 61 6e 79 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  any transformati
25760 6f 6e 73 20 77 68 65 72 65 20 6d 61 64 65 20 61  ons where made a
25770 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e  nd false if not.
25780 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  .**.** Implement
25790 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 43 6f 6e  ation note:  Con
257a0 73 74 61 6e 74 20 70 72 6f 70 61 67 61 74 69 6f  stant propagatio
257b0 6e 20 69 73 20 74 72 69 63 6b 79 20 64 75 65 20  n is tricky due 
257c0 74 6f 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 61  to affinity.** a
257d0 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  nd collating seq
257e0 75 65 6e 63 65 20 69 6e 74 65 72 61 63 74 69 6f  uence interactio
257f0 6e 73 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68  ns.  Consider th
25800 69 73 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  is example:.**.*
25810 2a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  *    CREATE TABL
25820 45 20 74 31 28 61 20 49 4e 54 2c 62 20 54 45 58  E t1(a INT,b TEX
25830 54 29 3b 0a 2a 2a 20 20 20 20 49 4e 53 45 52 54  T);.**    INSERT
25840 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
25850 31 32 33 2c 27 30 31 32 33 27 29 3b 0a 2a 2a 20  123,'0123');.** 
25860 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
25870 20 74 31 20 57 48 45 52 45 20 61 3d 31 32 33 20   t1 WHERE a=123 
25880 41 4e 44 20 62 3d 61 3b 0a 2a 2a 20 20 20 20 53  AND b=a;.**    S
25890 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
258a0 57 48 45 52 45 20 61 3d 31 32 33 20 41 4e 44 20  WHERE a=123 AND 
258b0 62 3d 31 32 33 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  b=123;.**.** The
258c0 20 74 77 6f 20 53 45 4c 45 43 54 20 73 74 61 74   two SELECT stat
258d0 65 6d 65 6e 74 73 20 61 62 6f 76 65 20 73 68 6f  ements above sho
258e0 75 6c 64 20 72 65 74 75 72 6e 20 64 69 66 66 65  uld return diffe
258f0 72 65 6e 74 20 61 6e 73 77 65 72 73 2e 20 20 62  rent answers.  b
25900 3d 61 0a 2a 2a 20 69 73 20 61 6c 77 61 79 20 74  =a.** is alway t
25910 72 75 65 20 62 65 63 61 75 73 65 20 74 68 65 20  rue because the 
25920 63 6f 6d 70 61 72 69 73 6f 6e 20 75 73 65 73 20  comparison uses 
25930 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
25940 2c 20 62 75 74 20 62 3d 31 32 33 0a 2a 2a 20 69  , but b=123.** i
25950 73 20 66 61 6c 73 65 20 62 65 63 61 75 73 65 20  s false because 
25960 69 74 20 75 73 65 73 20 74 65 78 74 20 61 66 66  it uses text aff
25970 69 6e 69 74 79 20 61 6e 64 20 27 30 31 32 33 27  inity and '0123'
25980 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61 6d 65   is not the same
25990 20 61 73 20 27 31 32 33 27 2e 0a 2a 2a 20 54 6f   as '123'..** To
259a0 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
259b0 73 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  s, the expressio
259c0 6e 20 74 72 65 65 20 69 73 20 6e 6f 74 20 61 63  n tree is not ac
259d0 74 75 61 6c 6c 79 20 63 68 61 6e 67 65 64 20 66  tually changed f
259e0 72 6f 6d 0a 2a 2a 20 22 62 3d 61 22 20 74 6f 20  rom.** "b=a" to 
259f0 22 62 3d 31 32 33 22 20 62 75 74 20 72 61 74 68  "b=123" but rath
25a00 65 72 20 74 68 65 20 22 61 22 20 69 6e 20 22 62  er the "a" in "b
25a10 3d 61 22 20 69 73 20 74 61 67 67 65 64 20 77 69  =a" is tagged wi
25a20 74 68 20 45 50 5f 46 69 78 65 64 43 6f 6c 0a 2a  th EP_FixedCol.*
25a30 2a 20 61 6e 64 20 74 68 65 20 22 31 32 33 22 20  * and the "123" 
25a40 76 61 6c 75 65 20 69 73 20 68 75 6e 67 20 6f 66  value is hung of
25a50 66 20 6f 66 20 74 68 65 20 70 4c 65 66 74 20 70  f of the pLeft p
25a60 6f 69 6e 74 65 72 2e 20 20 43 6f 64 65 20 67 65  ointer.  Code ge
25a70 6e 65 72 61 74 6f 72 0a 2a 2a 20 72 6f 75 74 69  nerator.** routi
25a80 6e 65 73 20 6b 6e 6f 77 20 74 6f 20 67 65 6e 65  nes know to gene
25a90 72 61 74 65 20 74 68 65 20 63 6f 6e 73 74 61 6e  rate the constan
25aa0 74 20 22 31 32 33 22 20 69 6e 73 74 65 61 64 20  t "123" instead 
25ab0 6f 66 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68  of looking up th
25ac0 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  e.** column valu
25ad0 65 2e 20 20 41 6c 73 6f 2c 20 74 6f 20 61 76 6f  e.  Also, to avo
25ae0 69 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 70 72 6f  id collation pro
25af0 62 6c 65 6d 73 2c 20 74 68 69 73 20 6f 70 74 69  blems, this opti
25b00 6d 69 7a 61 74 69 6f 6e 20 69 73 0a 2a 2a 20 6f  mization is.** o
25b10 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66  nly attempted if
25b20 20 74 68 65 20 22 61 3d 31 32 33 22 20 74 65 72   the "a=123" ter
25b30 6d 20 75 73 65 73 20 74 68 65 20 64 65 66 61 75  m uses the defau
25b40 6c 74 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74  lt BINARY collat
25b50 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
25b60 6e 74 20 70 72 6f 70 61 67 61 74 65 43 6f 6e 73  nt propagateCons
25b70 74 61 6e 74 73 28 0a 20 20 50 61 72 73 65 20 2a  tants(.  Parse *
25b80 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 54 68 65  pParse,   /* The
25b90 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
25ba0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 20   */.  Select *p 
25bb0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71 75         /* The qu
25bc0 65 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ery in which to 
25bd0 70 72 6f 70 61 67 61 74 65 20 63 6f 6e 73 74 61  propagate consta
25be0 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  nts */.){.  Wher
25bf0 65 43 6f 6e 73 74 20 78 3b 0a 20 20 57 61 6c 6b  eConst x;.  Walk
25c00 65 72 20 77 3b 0a 20 20 69 6e 74 20 6e 43 68 6e  er w;.  int nChn
25c10 67 20 3d 20 30 3b 0a 20 20 78 2e 70 50 61 72 73  g = 0;.  x.pPars
25c20 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 64 6f  e = pParse;.  do
25c30 7b 0a 20 20 20 20 78 2e 6e 43 6f 6e 73 74 20 3d  {.    x.nConst =
25c40 20 30 3b 0a 20 20 20 20 78 2e 6e 43 68 6e 67 20   0;.    x.nChng 
25c50 3d 20 30 3b 0a 20 20 20 20 78 2e 61 70 45 78 70  = 0;.    x.apExp
25c60 72 20 3d 20 30 3b 0a 20 20 20 20 66 69 6e 64 43  r = 0;.    findC
25c70 6f 6e 73 74 49 6e 57 68 65 72 65 28 26 78 2c 20  onstInWhere(&x, 
25c80 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
25c90 69 66 28 20 78 2e 6e 43 6f 6e 73 74 20 29 7b 0a  if( x.nConst ){.
25ca0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 77 2c        memset(&w,
25cb0 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a   0, sizeof(w));.
25cc0 20 20 20 20 20 20 77 2e 70 50 61 72 73 65 20 3d        w.pParse =
25cd0 20 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 77   pParse;.      w
25ce0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
25cf0 20 70 72 6f 70 61 67 61 74 65 43 6f 6e 73 74 61   propagateConsta
25d00 6e 74 45 78 70 72 52 65 77 72 69 74 65 3b 0a 20  ntExprRewrite;. 
25d10 20 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61       w.xSelectCa
25d20 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  llback = sqlite3
25d30 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b 0a  SelectWalkNoop;.
25d40 20 20 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43        w.xSelectC
25d50 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20  allback2 = 0;.  
25d60 20 20 20 20 77 2e 77 61 6c 6b 65 72 44 65 70 74      w.walkerDept
25d70 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 2e 75  h = 0;.      w.u
25d80 2e 70 43 6f 6e 73 74 20 3d 20 26 78 3b 0a 20 20  .pConst = &x;.  
25d90 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45      sqlite3WalkE
25da0 78 70 72 28 26 77 2c 20 70 2d 3e 70 57 68 65 72  xpr(&w, p->pWher
25db0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
25dc0 33 44 62 46 72 65 65 28 78 2e 70 50 61 72 73 65  3DbFree(x.pParse
25dd0 2d 3e 64 62 2c 20 78 2e 61 70 45 78 70 72 29 3b  ->db, x.apExpr);
25de0 0a 20 20 20 20 20 20 6e 43 68 6e 67 20 2b 3d 20  .      nChng += 
25df0 78 2e 6e 43 68 6e 67 3b 0a 20 20 20 20 7d 0a 20  x.nChng;.    }. 
25e00 20 7d 77 68 69 6c 65 28 20 78 2e 6e 43 68 6e 67   }while( x.nChng
25e10 20 29 3b 20 20 0a 20 20 72 65 74 75 72 6e 20 6e   );  .  return n
25e20 43 68 6e 67 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  Chng;.}..#if !de
25e30 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
25e40 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
25e50 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
25e60 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20  MIT_VIEW)./*.** 
25e70 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 72  Make copies of r
25e80 65 6c 65 76 61 6e 74 20 57 48 45 52 45 20 63 6c  elevant WHERE cl
25e90 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 74 68  ause terms of th
25ea0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 6e  e outer query in
25eb0 74 6f 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20  to.** the WHERE 
25ec0 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65  clause of subque
25ed0 72 79 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a  ry.  Example:.**
25ee0 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
25ef0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41  FROM (SELECT a A
25f00 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52  S x, c-d AS y FR
25f10 4f 4d 20 74 31 29 20 57 48 45 52 45 20 78 3d 35  OM t1) WHERE x=5
25f20 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a   AND y=10;.**.**
25f30 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   Transformed int
25f40 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  o:.**.**    SELE
25f50 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT * FROM (SELEC
25f60 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53  T a AS x, c-d AS
25f70 20 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   y FROM t1 WHERE
25f80 20 61 3d 35 20 41 4e 44 20 63 2d 64 3d 31 30 29   a=5 AND c-d=10)
25f90 0a 2a 2a 20 20 20 20 20 57 48 45 52 45 20 78 3d  .**     WHERE x=
25fa0 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a  5 AND y=10;.**.*
25fb0 2a 20 54 68 65 20 68 6f 70 65 20 69 73 20 74 68  * The hope is th
25fc0 61 74 20 74 68 65 20 74 65 72 6d 73 20 61 64 64  at the terms add
25fd0 65 64 20 74 6f 20 74 68 65 20 69 6e 6e 65 72 20  ed to the inner 
25fe0 71 75 65 72 79 20 77 69 6c 6c 20 6d 61 6b 65 20  query will make 
25ff0 69 74 20 6d 6f 72 65 0a 2a 2a 20 65 66 66 69 63  it more.** effic
26000 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e  ient..**.** Do n
26010 6f 74 20 61 74 74 65 6d 70 74 20 74 68 69 73 20  ot attempt this 
26020 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 3a  optimization if:
26030 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 28 2a 2a  .**.**   (1) (**
26040 20 54 68 69 73 20 72 65 73 74 72 69 63 74 69 6f   This restrictio
26050 6e 20 77 61 73 20 72 65 6d 6f 76 65 64 20 6f 6e  n was removed on
26060 20 32 30 31 37 2d 30 39 2d 32 39 2e 20 20 57 65   2017-09-29.  We
26070 20 75 73 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20   used to.**     
26080 20 20 20 20 20 20 64 69 73 61 6c 6c 6f 77 20 74        disallow t
26090 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
260a0 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 73   for aggregate s
260b0 75 62 71 75 65 72 69 65 73 2c 20 62 75 74 20 6e  ubqueries, but n
260c0 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
260d0 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 20 62 79  it is allowed by
260e0 20 70 75 74 74 69 6e 67 20 74 68 65 20 65 78 74   putting the ext
260f0 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20  ra terms on the 
26100 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a  HAVING clause..*
26110 2a 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20  *           The 
26120 61 64 64 65 64 20 48 41 56 49 4e 47 20 63 6c 61  added HAVING cla
26130 75 73 65 20 69 73 20 70 6f 69 6e 74 6c 65 73 73  use is pointless
26140 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
26150 20 6c 61 63 6b 73 0a 2a 2a 20 20 20 20 20 20 20   lacks.**       
26160 20 20 20 20 61 20 47 52 4f 55 50 20 42 59 20 63      a GROUP BY c
26170 6c 61 75 73 65 2e 20 20 42 75 74 20 73 75 63 68  lause.  But such
26180 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65   a HAVING clause
26190 20 69 73 20 61 6c 73 6f 20 68 61 72 6d 6c 65 73   is also harmles
261a0 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 73  s.**           s
261b0 6f 20 74 68 65 72 65 20 64 6f 65 73 20 6e 6f 74  o there does not
261c0 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 61 6e   appear to be an
261d0 79 20 72 65 61 73 6f 6e 20 74 6f 20 61 64 64 20  y reason to add 
261e0 65 78 74 72 61 20 6c 6f 67 69 63 0a 2a 2a 20 20  extra logic.**  
261f0 20 20 20 20 20 20 20 20 20 74 6f 20 73 75 70 70           to supp
26200 72 65 73 73 20 69 74 2e 20 2a 2a 29 0a 2a 2a 0a  ress it. **).**.
26210 2a 2a 20 20 20 28 32 29 20 54 68 65 20 69 6e 6e  **   (2) The inn
26220 65 72 20 71 75 65 72 79 20 69 73 20 74 68 65 20  er query is the 
26230 72 65 63 75 72 73 69 76 65 20 70 61 72 74 20 6f  recursive part o
26240 66 20 61 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65  f a common table
26250 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
26260 2a 2a 20 20 20 28 33 29 20 54 68 65 20 69 6e 6e  **   (3) The inn
26270 65 72 20 71 75 65 72 79 20 68 61 73 20 61 20 4c  er query has a L
26280 49 4d 49 54 20 63 6c 61 75 73 65 20 28 73 69 6e  IMIT clause (sin
26290 63 65 20 74 68 65 20 63 68 61 6e 67 65 73 20 74  ce the changes t
262a0 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 20  o the WHERE.**  
262b0 20 20 20 20 20 63 6c 61 75 73 65 20 77 6f 75 6c       clause woul
262c0 64 20 63 68 61 6e 67 65 20 74 68 65 20 6d 65 61  d change the mea
262d0 6e 69 6e 67 20 6f 66 20 74 68 65 20 4c 49 4d 49  ning of the LIMI
262e0 54 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20  T)..**.**   (4) 
262f0 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  The inner query 
26300 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  is the right ope
26310 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a  rand of a LEFT J
26320 4f 49 4e 20 61 6e 64 20 74 68 65 0a 2a 2a 20 20  OIN and the.**  
26330 20 20 20 20 20 65 78 70 72 65 73 73 69 6f 6e 20       expression 
26340 74 6f 20 62 65 20 70 75 73 68 65 64 20 64 6f 77  to be pushed dow
26350 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20  n does not come 
26360 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75  from the ON clau
26370 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f 6e 20 74  se.**       on t
26380 68 61 74 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 2a  hat LEFT JOIN..*
26390 2a 0a 2a 2a 20 20 20 28 35 29 20 54 68 65 20 57  *.**   (5) The W
263a0 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72  HERE clause expr
263b0 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65  ession originate
263c0 73 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  s in the ON or U
263d0 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20 20  SING clause.**  
263e0 20 20 20 20 20 6f 66 20 61 20 4c 45 46 54 20 4a       of a LEFT J
263f0 4f 49 4e 20 77 68 65 72 65 20 69 43 75 72 73 6f  OIN where iCurso
26400 72 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67  r is not the rig
26410 68 74 2d 68 61 6e 64 20 74 61 62 6c 65 20 6f 66  ht-hand table of
26420 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 6c   that.**       l
26430 65 66 74 20 6a 6f 69 6e 2e 20 20 41 6e 20 65 78  eft join.  An ex
26440 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
26450 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 0a         SELECT *.
26460 2a 2a 20 20 20 20 20 20 20 20 20 20 20 46 52 4f  **           FRO
26470 4d 20 28 53 45 4c 45 43 54 20 31 20 41 53 20 61  M (SELECT 1 AS a
26480 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  1 UNION ALL SELE
26490 43 54 20 32 29 20 41 53 20 61 61 0a 2a 2a 20 20  CT 2) AS aa.**  
264a0 20 20 20 20 20 20 20 20 20 4a 4f 49 4e 20 28 53           JOIN (S
264b0 45 4c 45 43 54 20 31 20 41 53 20 62 32 20 55 4e  ELECT 1 AS b2 UN
264c0 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 32  ION ALL SELECT 2
264d0 29 20 41 53 20 62 62 20 4f 4e 20 28 61 31 3d 62  ) AS bb ON (a1=b
264e0 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  2).**           
264f0 4c 45 46 54 20 4a 4f 49 4e 20 28 53 45 4c 45 43  LEFT JOIN (SELEC
26500 54 20 38 20 41 53 20 63 33 20 55 4e 49 4f 4e 20  T 8 AS c3 UNION 
26510 41 4c 4c 20 53 45 4c 45 43 54 20 39 29 20 41 53  ALL SELECT 9) AS
26520 20 63 63 20 4f 4e 20 28 62 32 3d 32 29 3b 0a 2a   cc ON (b2=2);.*
26530 2a 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20 63  *.**       The c
26540 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 69 73  orrect answer is
26550 20 74 68 72 65 65 20 72 6f 77 73 3a 20 20 28 31   three rows:  (1
26560 2c 31 2c 4e 55 4c 4c 29 2c 28 32 2c 32 2c 38 29  ,1,NULL),(2,2,8)
26570 2c 28 32 2c 32 2c 39 29 2e 0a 2a 2a 20 20 20 20  ,(2,2,9)..**    
26580 20 20 20 42 75 74 20 69 66 20 74 68 65 20 28 62     But if the (b
26590 32 3d 32 29 20 74 65 72 6d 20 77 65 72 65 20 74  2=2) term were t
265a0 6f 20 62 65 20 70 75 73 68 65 64 20 64 6f 77 6e  o be pushed down
265b0 20 69 6e 74 6f 20 74 68 65 20 62 62 20 73 75 62   into the bb sub
265c0 71 75 65 72 79 2c 0a 2a 2a 20 20 20 20 20 20 20  query,.**       
265d0 74 68 65 6e 20 74 68 65 20 28 31 2c 31 2c 4e 55  then the (1,1,NU
265e0 4c 4c 29 20 72 6f 77 20 77 6f 75 6c 64 20 62 65  LL) row would be
265f0 20 73 75 70 70 72 65 73 73 65 64 2e 0a 2a 2a 0a   suppressed..**.
26600 2a 2a 20 20 20 28 36 29 20 54 68 65 20 69 6e 6e  **   (6) The inn
26610 65 72 20 71 75 65 72 79 20 66 65 61 74 75 72 65  er query feature
26620 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 77 69  s one or more wi
26630 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 73 20 28  ndow-functions (
26640 73 69 6e 63 65 20 0a 2a 2a 20 20 20 20 20 20 20  since .**       
26650 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 57  changes to the W
26660 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74  HERE clause of t
26670 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 63  he inner query c
26680 6f 75 6c 64 20 63 68 61 6e 67 65 20 74 68 65 20  ould change the 
26690 0a 2a 2a 20 20 20 20 20 20 20 77 69 6e 64 6f 77  .**       window
266a0 20 6f 76 65 72 20 77 68 69 63 68 20 77 69 6e 64   over which wind
266b0 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65  ow functions are
266c0 20 63 61 6c 63 75 6c 61 74 65 64 29 2e 0a 2a 2a   calculated)..**
266d0 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20  .** Return 0 if 
266e0 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  no changes are m
266f0 61 64 65 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f  ade and non-zero
26700 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   if one or more 
26710 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20  WHERE clause.** 
26720 74 65 72 6d 73 20 61 72 65 20 64 75 70 6c 69 63  terms are duplic
26730 61 74 65 64 20 69 6e 74 6f 20 74 68 65 20 73 75  ated into the su
26740 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  bquery..*/.stati
26750 63 20 69 6e 74 20 70 75 73 68 44 6f 77 6e 57 68  c int pushDownWh
26760 65 72 65 54 65 72 6d 73 28 0a 20 20 50 61 72 73  ereTerms(.  Pars
26770 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
26780 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
26790 78 74 20 28 66 6f 72 20 6d 61 6c 6c 6f 63 28 29  xt (for malloc()
267a0 20 61 6e 64 20 65 72 72 6f 72 20 72 65 70 6f 72   and error repor
267b0 74 69 6e 67 29 20 2a 2f 0a 20 20 53 65 6c 65 63  ting) */.  Selec
267c0 74 20 2a 70 53 75 62 71 2c 20 20 20 20 20 20 20  t *pSubq,       
267d0 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
267e0 20 77 68 6f 73 65 20 57 48 45 52 45 20 63 6c 61   whose WHERE cla
267f0 75 73 65 20 69 73 20 74 6f 20 62 65 20 61 75 67  use is to be aug
26800 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  mented */.  Expr
26810 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
26820 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
26830 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
26840 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  er query */.  in
26850 74 20 69 43 75 72 73 6f 72 2c 20 20 20 20 20 20  t iCursor,      
26860 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
26870 6d 62 65 72 20 6f 66 20 74 68 65 20 73 75 62 71  mber of the subq
26880 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73  uery */.  int is
26890 4c 65 66 74 4a 6f 69 6e 20 20 20 20 20 20 20 20  LeftJoin        
268a0 2f 2a 20 54 72 75 65 20 69 66 20 70 53 75 62 71  /* True if pSubq
268b0 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 65   is the right te
268c0 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  rm of a LEFT JOI
268d0 4e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  N */.){.  Expr *
268e0 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 43 68 6e  pNew;.  int nChn
268f0 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 57 68  g = 0;.  if( pWh
26900 65 72 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ere==0 ) return 
26910 30 3b 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e  0;.  if( pSubq->
26920 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
26930 63 75 72 73 69 76 65 20 29 20 72 65 74 75 72 6e  cursive ) return
26940 20 30 3b 20 20 2f 2a 20 72 65 73 74 72 69 63 74   0;  /* restrict
26950 69 6f 6e 20 28 32 29 20 2a 2f 0a 0a 23 69 66 6e  ion (2) */..#ifn
26960 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
26970 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 69 66 28  WINDOWFUNC.  if(
26980 20 70 53 75 62 71 2d 3e 70 57 69 6e 20 29 20 72   pSubq->pWin ) r
26990 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 72  eturn 0;    /* r
269a0 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20 2a  estriction (6) *
269b0 2f 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  /.#endif..#ifdef
269c0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
269d0 2f 2a 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73  /* Only the firs
269e0 74 20 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70  t term of a comp
269f0 6f 75 6e 64 20 63 61 6e 20 68 61 76 65 20 61 20  ound can have a 
26a00 57 49 54 48 20 63 6c 61 75 73 65 2e 20 20 42 75  WITH clause.  Bu
26a10 74 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65  t make.  ** sure
26a20 20 6e 6f 20 6f 74 68 65 72 20 74 65 72 6d 73 20   no other terms 
26a30 61 72 65 20 6d 61 72 6b 65 64 20 53 46 5f 52 65  are marked SF_Re
26a40 63 75 72 73 69 76 65 20 69 6e 20 63 61 73 65 20  cursive in case 
26a50 73 6f 6d 65 74 68 69 6e 67 20 63 68 61 6e 67 65  something change
26a60 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66 75  s.  ** in the fu
26a70 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20  ture..  */.  {. 
26a80 20 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 20 20     Select *pX;  
26a90 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 75 62  .    for(pX=pSub
26aa0 71 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 50  q; pX; pX=pX->pP
26ab0 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 61 73 73  rior){.      ass
26ac0 65 72 74 28 20 28 70 58 2d 3e 73 65 6c 46 6c 61  ert( (pX->selFla
26ad0 67 73 20 26 20 28 53 46 5f 52 65 63 75 72 73 69  gs & (SF_Recursi
26ae0 76 65 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  ve))==0 );.    }
26af0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
26b00 66 28 20 70 53 75 62 71 2d 3e 70 4c 69 6d 69 74  f( pSubq->pLimit
26b10 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
26b20 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74  n 0; /* restrict
26b30 69 6f 6e 20 28 33 29 20 2a 2f 0a 20 20 7d 0a 20  ion (3) */.  }. 
26b40 20 77 68 69 6c 65 28 20 70 57 68 65 72 65 2d 3e   while( pWhere->
26b50 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20  op==TK_AND ){.  
26b60 20 20 6e 43 68 6e 67 20 2b 3d 20 70 75 73 68 44    nChng += pushD
26b70 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 70 50  ownWhereTerms(pP
26b80 61 72 73 65 2c 20 70 53 75 62 71 2c 20 70 57 68  arse, pSubq, pWh
26b90 65 72 65 2d 3e 70 52 69 67 68 74 2c 0a 20 20 20  ere->pRight,.   
26ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43 75               iCu
26bc0 72 73 6f 72 2c 20 69 73 4c 65 66 74 4a 6f 69 6e  rsor, isLeftJoin
26bd0 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  );.    pWhere = 
26be0 70 57 68 65 72 65 2d 3e 70 4c 65 66 74 3b 0a 20  pWhere->pLeft;. 
26bf0 20 7d 0a 20 20 69 66 28 20 69 73 4c 65 66 74 4a   }.  if( isLeftJ
26c00 6f 69 6e 0a 20 20 20 26 26 20 28 45 78 70 72 48  oin.   && (ExprH
26c10 61 73 50 72 6f 70 65 72 74 79 28 70 57 68 65 72  asProperty(pWher
26c20 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3d 3d  e,EP_FromJoin)==
26c30 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57  0.         || pW
26c40 68 65 72 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  here->iRightJoin
26c50 54 61 62 6c 65 21 3d 69 43 75 72 73 6f 72 29 0a  Table!=iCursor).
26c60 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
26c70 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f  0; /* restrictio
26c80 6e 20 28 34 29 20 2a 2f 0a 20 20 7d 0a 20 20 69  n (4) */.  }.  i
26c90 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
26ca0 74 79 28 70 57 68 65 72 65 2c 45 50 5f 46 72 6f  ty(pWhere,EP_Fro
26cb0 6d 4a 6f 69 6e 29 20 26 26 20 70 57 68 65 72 65  mJoin) && pWhere
26cc0 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
26cd0 65 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  e!=iCursor ){.  
26ce0 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72    return 0; /* r
26cf0 65 73 74 72 69 63 74 69 6f 6e 20 28 35 29 20 2a  estriction (5) *
26d00 2f 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  /.  }.  if( sqli
26d10 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f  te3ExprIsTableCo
26d20 6e 73 74 61 6e 74 28 70 57 68 65 72 65 2c 20 69  nstant(pWhere, i
26d30 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 6e  Cursor) ){.    n
26d40 43 68 6e 67 2b 2b 3b 0a 20 20 20 20 77 68 69 6c  Chng++;.    whil
26d50 65 28 20 70 53 75 62 71 20 29 7b 0a 20 20 20 20  e( pSubq ){.    
26d60 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 78    SubstContext x
26d70 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  ;.      pNew = s
26d80 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
26d90 61 72 73 65 2d 3e 64 62 2c 20 70 57 68 65 72 65  arse->db, pWhere
26da0 2c 20 30 29 3b 0a 20 20 20 20 20 20 75 6e 73 65  , 0);.      unse
26db0 74 4a 6f 69 6e 45 78 70 72 28 70 4e 65 77 2c 20  tJoinExpr(pNew, 
26dc0 2d 31 29 3b 0a 20 20 20 20 20 20 78 2e 70 50 61  -1);.      x.pPa
26dd0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
26de0 20 20 20 20 78 2e 69 54 61 62 6c 65 20 3d 20 69      x.iTable = i
26df0 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e  Cursor;.      x.
26e00 69 4e 65 77 54 61 62 6c 65 20 3d 20 69 43 75 72  iNewTable = iCur
26e10 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69 73 4c  sor;.      x.isL
26e20 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 0a 20 20 20  eftJoin = 0;.   
26e30 20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20 70 53     x.pEList = pS
26e40 75 62 71 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ubq->pEList;.   
26e50 20 20 20 70 4e 65 77 20 3d 20 73 75 62 73 74 45     pNew = substE
26e60 78 70 72 28 26 78 2c 20 70 4e 65 77 29 3b 0a 20  xpr(&x, pNew);. 
26e70 20 20 20 20 20 69 66 28 20 70 53 75 62 71 2d 3e       if( pSubq->
26e80 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
26e90 67 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20 20  gregate ){.     
26ea0 20 20 20 70 53 75 62 71 2d 3e 70 48 61 76 69 6e     pSubq->pHavin
26eb0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  g = sqlite3ExprA
26ec0 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nd(pParse->db, p
26ed0 53 75 62 71 2d 3e 70 48 61 76 69 6e 67 2c 20 70  Subq->pHaving, p
26ee0 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  New);.      }els
26ef0 65 7b 0a 20 20 20 20 20 20 20 20 70 53 75 62 71  e{.        pSubq
26f00 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
26f10 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65  e3ExprAnd(pParse
26f20 2d 3e 64 62 2c 20 70 53 75 62 71 2d 3e 70 57 68  ->db, pSubq->pWh
26f30 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  ere, pNew);.    
26f40 20 20 7d 0a 20 20 20 20 20 20 70 53 75 62 71 20    }.      pSubq 
26f50 3d 20 70 53 75 62 71 2d 3e 70 50 72 69 6f 72 3b  = pSubq->pPrior;
26f60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
26f70 75 72 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 23 65 6e  urn nChng;.}.#en
26f80 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
26f90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
26fa0 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
26fb0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
26fc0 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  EW) */../*.** Th
26fd0 65 20 70 46 75 6e 63 20 69 73 20 74 68 65 20 6f  e pFunc is the o
26fe0 6e 6c 79 20 61 67 67 72 65 67 61 74 65 20 66 75  nly aggregate fu
26ff0 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 71 75  nction in the qu
27000 65 72 79 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  ery.  Check to s
27010 65 65 0a 2a 2a 20 69 66 20 74 68 65 20 71 75 65  ee.** if the que
27020 72 79 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  ry is a candidat
27030 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d 61  e for the min/ma
27040 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  x optimization. 
27050 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 71 75  .**.** If the qu
27060 65 72 79 20 69 73 20 61 20 63 61 6e 64 69 64 61  ery is a candida
27070 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d  te for the min/m
27080 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  ax optimization,
27090 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20 2a 70 70   then set.** *pp
270a0 4d 69 6e 4d 61 78 20 74 6f 20 62 65 20 61 6e 20  MinMax to be an 
270b0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
270c0 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 74  to be used for t
270d0 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  he optimization.
270e0 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 65 69  ** and return ei
270f0 74 68 65 72 20 57 48 45 52 45 5f 4f 52 44 45 52  ther WHERE_ORDER
27100 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f  BY_MIN or WHERE_
27110 4f 52 44 45 52 42 59 5f 4d 41 58 20 64 65 70 65  ORDERBY_MAX depe
27120 6e 64 69 6e 67 20 6f 6e 0a 2a 2a 20 77 68 65 74  nding on.** whet
27130 68 65 72 20 70 46 75 6e 63 20 69 73 20 61 20 6d  her pFunc is a m
27140 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75  in() or max() fu
27150 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
27160 20 74 68 65 20 71 75 65 72 79 20 69 73 20 6e 6f   the query is no
27170 74 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  t a candidate fo
27180 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70  r the min/max op
27190 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 72 65 74 75  timization, retu
271a0 72 6e 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45  rn.** WHERE_ORDE
271b0 52 42 59 5f 4e 4f 52 4d 41 4c 20 28 77 68 69 63  RBY_NORMAL (whic
271c0 68 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 29 2e  h must be zero).
271d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
271e0 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c  ine must be call
271f0 65 64 20 61 66 74 65 72 20 61 67 67 72 65 67 61  ed after aggrega
27200 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 68 61 76  te functions hav
27210 65 20 62 65 65 6e 0a 2a 2a 20 6c 6f 63 61 74 65  e been.** locate
27220 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 65  d but before the
27230 69 72 20 61 72 67 75 6d 65 6e 74 73 20 68 61 76  ir arguments hav
27240 65 20 62 65 65 6e 20 73 75 62 6a 65 63 74 65 64  e been subjected
27250 20 74 6f 20 61 67 67 72 65 67 61 74 65 0a 2a 2a   to aggregate.**
27260 20 61 6e 61 6c 79 73 69 73 2e 0a 2a 2f 0a 73 74   analysis..*/.st
27270 61 74 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75  atic u8 minMaxQu
27280 65 72 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ery(sqlite3 *db,
27290 20 45 78 70 72 20 2a 70 46 75 6e 63 2c 20 45 78   Expr *pFunc, Ex
272a0 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e 4d 61  prList **ppMinMa
272b0 78 29 7b 0a 20 20 69 6e 74 20 65 52 65 74 20 3d  x){.  int eRet =
272c0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
272d0 4f 52 4d 41 4c 3b 20 20 20 20 20 20 2f 2a 20 52  ORMAL;      /* R
272e0 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  eturn value */. 
272f0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
27300 74 20 3d 20 70 46 75 6e 63 2d 3e 78 2e 70 4c 69  t = pFunc->x.pLi
27310 73 74 3b 20 20 20 20 2f 2a 20 41 72 67 75 6d 65  st;    /* Argume
27320 6e 74 73 20 74 6f 20 61 67 67 20 66 75 6e 63 74  nts to agg funct
27330 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
27340 68 61 72 20 2a 7a 46 75 6e 63 3b 20 20 20 20 20  har *zFunc;     
27350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27360 2a 20 4e 61 6d 65 20 6f 66 20 61 67 67 72 65 67  * Name of aggreg
27370 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 70 46 75  ate function pFu
27380 6e 63 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  nc */.  ExprList
27390 20 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20 75 38   *pOrderBy;.  u8
273a0 20 73 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20 61   sortOrder;..  a
273b0 73 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78  ssert( *ppMinMax
273c0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
273d0 20 70 46 75 6e 63 2d 3e 6f 70 3d 3d 54 4b 5f 41   pFunc->op==TK_A
273e0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
273f0 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 7c   if( pEList==0 |
27400 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  | pEList->nExpr!
27410 3d 31 20 29 20 72 65 74 75 72 6e 20 65 52 65 74  =1 ) return eRet
27420 3b 0a 20 20 7a 46 75 6e 63 20 3d 20 70 46 75 6e  ;.  zFunc = pFun
27430 63 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 69  c->u.zToken;.  i
27440 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
27450 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29 3d  p(zFunc, "min")=
27460 3d 30 20 29 7b 0a 20 20 20 20 65 52 65 74 20 3d  =0 ){.    eRet =
27470 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
27480 49 4e 3b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65  IN;.    sortOrde
27490 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53  r = SQLITE_SO_AS
274a0 43 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  C;.  }else if( s
274b0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46  qlite3StrICmp(zF
274c0 75 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29  unc, "max")==0 )
274d0 7b 0a 20 20 20 20 65 52 65 74 20 3d 20 57 48 45  {.    eRet = WHE
274e0 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a  RE_ORDERBY_MAX;.
274f0 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20      sortOrder = 
27500 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3b 0a  SQLITE_SO_DESC;.
27510 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
27520 75 72 6e 20 65 52 65 74 3b 0a 20 20 7d 0a 20 20  urn eRet;.  }.  
27530 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 4f 72 64  *ppMinMax = pOrd
27540 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
27550 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 45  prListDup(db, pE
27560 4c 69 73 74 2c 20 30 29 3b 0a 20 20 61 73 73 65  List, 0);.  asse
27570 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20  rt( pOrderBy!=0 
27580 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
27590 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4f 72  led );.  if( pOr
275a0 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42 79  derBy ) pOrderBy
275b0 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
275c0 20 3d 20 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20   = sortOrder;.  
275d0 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a  return eRet;.}..
275e0 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74  /*.** The select
275f0 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
27600 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
27610 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 67  rgument is an ag
27620 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a  gregate query..*
27630 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  * The second arg
27640 75 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73 73  ument is the ass
27650 6f 63 69 61 74 65 64 20 61 67 67 72 65 67 61 74  ociated aggregat
27660 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54  e-info object. T
27670 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
27680 20 74 65 73 74 73 20 69 66 20 74 68 65 20 53 45   tests if the SE
27690 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 66  LECT is of the f
276a0 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  orm:.**.**   SEL
276b0 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
276c0 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68  M <tbl>.**.** wh
276d0 65 72 65 20 74 61 62 6c 65 20 69 73 20 61 20 64  ere table is a d
276e0 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20 6e  atabase table, n
276f0 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20  ot a sub-select 
27700 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68 65 20  or view. If the 
27710 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61  query.** does ma
27720 74 63 68 20 74 68 69 73 20 70 61 74 74 65 72 6e  tch this pattern
27730 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72  , then a pointer
27740 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62   to the Table ob
27750 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e  ject representin
27760 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65  g.** <tbl> is re
27770 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
27780 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  e, 0 is returned
27790 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62 6c  ..*/.static Tabl
277a0 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74  e *isSimpleCount
277b0 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67 49  (Select *p, AggI
277c0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
277d0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
277e0 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20   Expr *pExpr;.. 
277f0 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47 72   assert( !p->pGr
27800 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28 20  oupBy );..  if( 
27810 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e  p->pWhere || p->
27820 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  pEList->nExpr!=1
27830 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d   .   || p->pSrc-
27840 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70  >nSrc!=1 || p->p
27850 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
27860 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  t.  ){.    retur
27870 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20  n 0;.  }.  pTab 
27880 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
27890 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d 20  pTab;.  pExpr = 
278a0 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
278b0 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28  pExpr;.  assert(
278c0 20 70 54 61 62 20 26 26 20 21 70 54 61 62 2d 3e   pTab && !pTab->
278d0 70 53 65 6c 65 63 74 20 26 26 20 70 45 78 70 72  pSelect && pExpr
278e0 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69 72   );..  if( IsVir
278f0 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74  tual(pTab) ) ret
27900 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78  urn 0;.  if( pEx
27910 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46  pr->op!=TK_AGG_F
27920 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e  UNCTION ) return
27930 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   0;.  if( NEVER(
27940 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d  pAggInfo->nFunc=
27950 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  =0) ) return 0;.
27960 20 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f 2d    if( (pAggInfo-
27970 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d  >aFunc[0].pFunc-
27980 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c 49 54  >funcFlags&SQLIT
27990 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30  E_FUNC_COUNT)==0
279a0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
279b0 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26  f( pExpr->flags&
279c0 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65  EP_Distinct ) re
279d0 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72  turn 0;..  retur
279e0 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
279f0 20 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c   If the source-l
27a00 69 73 74 20 69 74 65 6d 20 70 61 73 73 65 64 20  ist item passed 
27a10 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 77  as an argument w
27a20 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74  as augmented wit
27a30 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20  h an.** INDEXED 
27a40 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
27a50 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  try to locate th
27a60 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 64 65  e specified inde
27a70 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 77  x. If there.** w
27a80 61 73 20 73 75 63 68 20 61 20 63 6c 61 75 73 65  as such a clause
27a90 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20 69   and the named i
27aa0 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20 66  ndex cannot be f
27ab0 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  ound, return .**
27ac0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e   SQLITE_ERROR an
27ad0 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  d leave an error
27ae0 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68 65   in pParse. Othe
27af0 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65 20  rwise, populate 
27b00 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65  .** pFrom->pInde
27b10 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  x and return SQL
27b20 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
27b30 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c  qlite3IndexedByL
27b40 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50 61  ookup(Parse *pPa
27b50 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c  rse, struct SrcL
27b60 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29  ist_item *pFrom)
27b70 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70  {.  if( pFrom->p
27b80 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 66 67  Tab && pFrom->fg
27b90 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 7b 0a  .isIndexedBy ){.
27ba0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
27bb0 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
27bc0 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 65     char *zIndexe
27bd0 64 42 79 20 3d 20 70 46 72 6f 6d 2d 3e 75 31 2e  dBy = pFrom->u1.
27be0 7a 49 6e 64 65 78 65 64 42 79 3b 0a 20 20 20 20  zIndexedBy;.    
27bf0 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
27c00 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
27c10 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20 20  pIndex; .       
27c20 20 70 49 64 78 20 26 26 20 73 71 6c 69 74 65 33   pIdx && sqlite3
27c30 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e  StrICmp(pIdx->zN
27c40 61 6d 65 2c 20 7a 49 6e 64 65 78 65 64 42 79 29  ame, zIndexedBy)
27c50 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 3d  ; .        pIdx=
27c60 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20  pIdx->pNext.    
27c70 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64 78  );.    if( !pIdx
27c80 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
27c90 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
27ca0 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78  , "no such index
27cb0 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 65 64 42  : %s", zIndexedB
27cc0 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  y, 0);.      pPa
27cd0 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
27ce0 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   = 1;.      retu
27cf0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
27d00 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d  .    }.    pFrom
27d10 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20 70 49 64  ->pIBIndex = pId
27d20 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  x;.  }.  return 
27d30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a  SQLITE_OK;.}./*.
27d40 2a 2a 20 44 65 74 65 63 74 20 63 6f 6d 70 6f 75  ** Detect compou
27d50 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nd SELECT statem
27d60 65 6e 74 73 20 74 68 61 74 20 75 73 65 20 61 6e  ents that use an
27d70 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
27d80 20 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74   with .** an alt
27d90 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69  ernative collati
27da0 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a  ng sequence..**.
27db0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e  **    SELECT ...
27dc0 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20   FROM t1 EXCEPT 
27dd0 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
27de0 74 32 20 4f 52 44 45 52 20 42 59 20 2e 2e 20 43  t2 ORDER BY .. C
27df0 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a  OLLATE ....**.**
27e00 20 54 68 65 73 65 20 61 72 65 20 72 65 77 72 69   These are rewri
27e10 74 74 65 6e 20 61 73 20 61 20 73 75 62 71 75 65  tten as a subque
27e20 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  ry:.**.**    SEL
27e30 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45  ECT * FROM (SELE
27e40 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45  CT ... FROM t1 E
27e50 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e  XCEPT SELECT ...
27e60 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20   FROM t2).**    
27e70 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f   ORDER BY ... CO
27e80 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  LLATE ....**.** 
27e90 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74  This transformat
27ea0 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79  ion is necessary
27eb0 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 75 6c   because the mul
27ec0 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
27ed0 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f  ) routine.** abo
27ee0 76 65 20 74 68 61 74 20 67 65 6e 65 72 61 74 65  ve that generate
27ef0 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61  s the code for a
27f00 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
27f10 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42   with an ORDER B
27f20 59 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73  Y clause.** uses
27f30 20 61 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74   a merge algorit
27f40 68 6d 20 74 68 61 74 20 72 65 71 75 69 72 65 73  hm that requires
27f50 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74   the same collat
27f60 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 6e 20  ing sequence on 
27f70 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f  the.** result co
27f80 6c 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68 65 20  lumns as on the 
27f90 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
27fa0 20 20 53 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20    See ticket.** 
27fb0 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74  http://www.sqlit
27fc0 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36  e.org/src/info/6
27fd0 37 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20  709574d2a.**.** 
27fe0 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74  This transformat
27ff0 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64  ion is only need
28000 65 64 20 66 6f 72 20 45 58 43 45 50 54 2c 20 49  ed for EXCEPT, I
28010 4e 54 45 52 53 45 43 54 2c 20 61 6e 64 20 55 4e  NTERSECT, and UN
28020 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f  ION..** The UNIO
28030 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77  N ALL operator w
28040 6f 72 6b 73 20 66 69 6e 65 20 77 69 74 68 20 6d  orks fine with m
28050 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
28060 79 28 29 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a  y() even when.**
28070 20 74 68 65 72 65 20 61 72 65 20 43 4f 4c 4c 41   there are COLLA
28080 54 45 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  TE terms in the 
28090 4f 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61  ORDER BY..*/.sta
280a0 74 69 63 20 69 6e 74 20 63 6f 6e 76 65 72 74 43  tic int convertC
280b0 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53  ompoundSelectToS
280c0 75 62 71 75 65 72 79 28 57 61 6c 6b 65 72 20 2a  ubquery(Walker *
280d0 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
280e0 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
280f0 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
28100 53 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20 73 71  Select *pX;.  sq
28110 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74 72  lite3 *db;.  str
28120 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
28130 6d 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73 74 20  m *a;.  SrcList 
28140 2a 70 4e 65 77 53 72 63 3b 0a 20 20 50 61 72 73  *pNewSrc;.  Pars
28150 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b  e *pParse;.  Tok
28160 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28  en dummy;..  if(
28170 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20   p->pPrior==0 ) 
28180 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
28190 6e 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f  nue;.  if( p->pO
281a0 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75  rderBy==0 ) retu
281b0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
281c0 0a 20 20 66 6f 72 28 70 58 3d 70 3b 20 70 58 20  .  for(pX=p; pX 
281d0 26 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41  && (pX->op==TK_A
281e0 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  LL || pX->op==TK
281f0 5f 53 45 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d  _SELECT); pX=pX-
28200 3e 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28  >pPrior){}.  if(
28210 20 70 58 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   pX==0 ) return 
28220 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
28230 61 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  a = p->pOrderBy-
28240 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70  >a;.  for(i=p->p
28250 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31  OrderBy->nExpr-1
28260 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
28270 20 20 69 66 28 20 61 5b 69 5d 2e 70 45 78 70 72    if( a[i].pExpr
28280 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
28290 6c 61 74 65 20 29 20 62 72 65 61 6b 3b 0a 20 20  late ) break;.  
282a0 7d 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65  }.  if( i<0 ) re
282b0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
282c0 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72  e;..  /* If we r
282d0 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
282e0 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   that means the 
282f0 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
28300 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a  s required. */..
28310 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b    pParse = pWalk
28320 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62  er->pParse;.  db
28330 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
28340 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
28350 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
28360 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
28370 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
28380 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
28390 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d  t;.  memset(&dum
283a0 6d 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75  my, 0, sizeof(du
283b0 6d 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53 72 63  mmy));.  pNewSrc
283c0 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
283d0 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28  tAppendFromTerm(
283e0 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75  pParse,0,0,0,&du
283f0 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20  mmy,pNew,0,0);. 
28400 20 69 66 28 20 70 4e 65 77 53 72 63 3d 3d 30 20   if( pNewSrc==0 
28410 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
28420 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70  rt;.  *pNew = *p
28430 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e  ;.  p->pSrc = pN
28440 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69  ewSrc;.  p->pELi
28450 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
28460 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
28470 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70  e, 0, sqlite3Exp
28480 72 28 64 62 2c 20 54 4b 5f 41 53 54 45 52 49 53  r(db, TK_ASTERIS
28490 4b 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20  K, 0));.  p->op 
284a0 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70  = TK_SELECT;.  p
284b0 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20  ->pWhere = 0;.  
284c0 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d  pNew->pGroupBy =
284d0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76   0;.  pNew->pHav
284e0 69 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ing = 0;.  pNew-
284f0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
28500 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
28510 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a    p->pNext = 0;.
28520 20 20 70 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a    p->pWith = 0;.
28530 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
28540 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20   ~SF_Compound;. 
28550 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c   assert( (p->sel
28560 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76 65  Flags & SF_Conve
28570 72 74 65 64 29 3d 3d 30 20 29 3b 0a 20 20 70 2d  rted)==0 );.  p-
28580 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
28590 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 61 73 73  Converted;.  ass
285a0 65 72 74 28 20 70 4e 65 77 2d 3e 70 50 72 69 6f  ert( pNew->pPrio
285b0 72 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e  r!=0 );.  pNew->
285c0 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
285d0 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  pNew;.  pNew->pL
285e0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  imit = 0;.  retu
285f0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
28600 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
28610 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 46 52  to see if the FR
28620 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70  OM clause term p
28630 46 72 6f 6d 20 68 61 73 20 74 61 62 6c 65 2d 76  From has table-v
28640 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 0a 2a  alued function.*
28650 2a 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 49 66  * arguments.  If
28660 20 69 74 20 64 6f 65 73 2c 20 6c 65 61 76 65 20   it does, leave 
28670 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
28680 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
28690 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
286a0 6f 2c 20 73 69 6e 63 65 20 70 46 72 6f 6d 20 69  o, since pFrom i
286b0 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f  s not allowed to
286c0 20 62 65 20 61 20 74 61 62 6c 65 2d 76 61 6c 75   be a table-valu
286d0 65 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ed function..*/.
286e0 73 74 61 74 69 63 20 69 6e 74 20 63 61 6e 6e 6f  static int canno
286f0 74 42 65 46 75 6e 63 74 69 6f 6e 28 50 61 72 73  tBeFunction(Pars
28700 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63  e *pParse, struc
28710 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
28720 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46  pFrom){.  if( pF
28730 72 6f 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  rom->fg.isTabFun
28740 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  c ){.    sqlite3
28750 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
28760 20 22 27 25 73 27 20 69 73 20 6e 6f 74 20 61 20   "'%s' is not a 
28770 66 75 6e 63 74 69 6f 6e 22 2c 20 70 46 72 6f 6d  function", pFrom
28780 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
28790 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
287a0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64  turn 0;.}..#ifnd
287b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
287c0 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  TE./*.** Argumen
287d0 74 20 70 57 69 74 68 20 28 77 68 69 63 68 20 6d  t pWith (which m
287e0 61 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e  ay be NULL) poin
287f0 74 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c  ts to a linked l
28800 69 73 74 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a  ist of nested .*
28810 2a 20 57 49 54 48 20 63 6f 6e 74 65 78 74 73 2c  * WITH contexts,
28820 20 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f   from inner to o
28830 75 74 65 72 6d 6f 73 74 2e 20 49 66 20 74 68 65  utermost. If the
28840 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65   table identifie
28850 64 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c  d by .** FROM cl
28860 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 70 49 74  ause element pIt
28870 65 6d 20 69 73 20 72 65 61 6c 6c 79 20 61 20 63  em is really a c
28880 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72  ommon-table-expr
28890 65 73 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a  ession (CTE) .**
288a0 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70   then return a p
288b0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 43 54  ointer to the CT
288c0 45 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72  E definition for
288d0 20 74 68 61 74 20 74 61 62 6c 65 2e 20 4f 74 68   that table. Oth
288e0 65 72 77 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e  erwise.** return
288f0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
28900 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65  a non-NULL value
28910 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 73 65   is returned, se
28920 74 20 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f 20  t *ppContext to 
28930 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 57 69 74  point to the Wit
28940 68 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74  h.** object that
28950 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 43 54   the returned CT
28960 45 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f  E belongs to..*/
28970 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 43  .static struct C
28980 74 65 20 2a 73 65 61 72 63 68 57 69 74 68 28 0a  te *searchWith(.
28990 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20    With *pWith,  
289a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289b0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 6e    /* Current inn
289c0 65 72 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75  ermost WITH clau
289d0 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
289e0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
289f0 65 6d 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  em,     /* FROM 
28a00 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 74  clause element t
28a10 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57  o resolve */.  W
28a20 69 74 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20  ith **ppContext 
28a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28a40 2a 20 4f 55 54 3a 20 57 49 54 48 20 63 6c 61 75  * OUT: WITH clau
28a50 73 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  se return value 
28a60 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b  belongs to */.){
28a70 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
28a80 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 49 74 65  Name;.  if( pIte
28a90 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20  m->zDatabase==0 
28aa0 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65  && (zName = pIte
28ab0 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  m->zName)!=0 ){.
28ac0 20 20 20 20 57 69 74 68 20 2a 70 3b 0a 20 20 20      With *p;.   
28ad0 20 66 6f 72 28 70 3d 70 57 69 74 68 3b 20 70 3b   for(p=pWith; p;
28ae0 20 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20   p=p->pOuter){. 
28af0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
28b00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
28b10 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCte; i++){.    
28b20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
28b30 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d  trICmp(zName, p-
28b40 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  >a[i].zName)==0 
28b50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70  ){.          *pp
28b60 43 6f 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20 20  Context = p;.   
28b70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70         return &p
28b80 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  ->a[i];.        
28b90 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
28ba0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
28bb0 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20 67  }../* The code g
28bc0 65 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74 61 69  enerator maintai
28bd0 6e 73 20 61 20 73 74 61 63 6b 20 6f 66 20 61 63  ns a stack of ac
28be0 74 69 76 65 20 57 49 54 48 20 63 6c 61 75 73 65  tive WITH clause
28bf0 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e  s.** with the in
28c00 6e 65 72 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c  ner-most WITH cl
28c10 61 75 73 65 20 62 65 69 6e 67 20 61 74 20 74 68  ause being at th
28c20 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
28c30 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ck..**.** This r
28c40 6f 75 74 69 6e 65 20 70 75 73 68 65 73 20 74 68  outine pushes th
28c50 65 20 57 49 54 48 20 63 6c 61 75 73 65 20 70 61  e WITH clause pa
28c60 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
28c70 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f  nd argument.** o
28c80 6e 74 6f 20 74 68 65 20 74 6f 70 20 6f 66 20 74  nto the top of t
28c90 68 65 20 73 74 61 63 6b 2e 20 49 66 20 61 72 67  he stack. If arg
28ca0 75 6d 65 6e 74 20 62 46 72 65 65 20 69 73 20 74  ument bFree is t
28cb0 72 75 65 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a  rue, then this.*
28cc0 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 77 69  * WITH clause wi
28cd0 6c 6c 20 6e 65 76 65 72 20 62 65 20 70 6f 70 70  ll never be popp
28ce0 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63  ed from the stac
28cf0 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  k. In this case 
28d00 69 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20  it.** should be 
28d10 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  freed along with
28d20 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
28d30 74 2e 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65  t. In other case
28d40 73 2c 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65  s, when.** bFree
28d50 3d 3d 30 2c 20 74 68 65 20 57 69 74 68 20 6f 62  ==0, the With ob
28d60 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 66 72 65  ject will be fre
28d70 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
28d80 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61  e SELECT .** sta
28d90 74 65 6d 65 6e 74 20 77 69 74 68 20 77 68 69 63  tement with whic
28da0 68 20 69 74 20 69 73 20 61 73 73 6f 63 69 61 74  h it is associat
28db0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
28dc0 74 65 33 57 69 74 68 50 75 73 68 28 50 61 72 73  te3WithPush(Pars
28dd0 65 20 2a 70 50 61 72 73 65 2c 20 57 69 74 68 20  e *pParse, With 
28de0 2a 70 57 69 74 68 2c 20 75 38 20 62 46 72 65 65  *pWith, u8 bFree
28df0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 62 46 72  ){.  assert( bFr
28e00 65 65 3d 3d 30 20 7c 7c 20 28 70 50 61 72 73 65  ee==0 || (pParse
28e10 2d 3e 70 57 69 74 68 3d 3d 30 20 26 26 20 70 50  ->pWith==0 && pP
28e20 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46 72 65  arse->pWithToFre
28e30 65 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70  e==0) );.  if( p
28e40 57 69 74 68 20 29 7b 0a 20 20 20 20 61 73 73 65  With ){.    asse
28e50 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74  rt( pParse->pWit
28e60 68 21 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20  h!=pWith );.    
28e70 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20  pWith->pOuter = 
28e80 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20  pParse->pWith;. 
28e90 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
28ea0 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 69 66   = pWith;.    if
28eb0 28 20 62 46 72 65 65 20 29 20 70 50 61 72 73 65  ( bFree ) pParse
28ec0 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 20 3d 20  ->pWithToFree = 
28ed0 70 57 69 74 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pWith;.  }.}../*
28ee0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
28ef0 6e 20 63 68 65 63 6b 73 20 69 66 20 61 72 67 75  n checks if argu
28f00 6d 65 6e 74 20 70 46 72 6f 6d 20 72 65 66 65 72  ment pFrom refer
28f10 73 20 74 6f 20 61 20 43 54 45 20 64 65 63 6c 61  s to a CTE decla
28f20 72 65 64 20 62 79 20 0a 2a 2a 20 61 20 57 49 54  red by .** a WIT
28f30 48 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20  H clause on the 
28f40 73 74 61 63 6b 20 63 75 72 72 65 6e 74 6c 79 20  stack currently 
28f50 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20 74 68  maintained by th
28f60 65 20 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a  e parser. And,.*
28f70 2a 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 70  * if currently p
28f80 72 6f 63 65 73 73 69 6e 67 20 61 20 43 54 45 20  rocessing a CTE 
28f90 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 20 69  expression, if i
28fa0 74 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65  t is a recursive
28fb0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f  .** reference to
28fc0 20 74 68 65 20 63 75 72 72 65 6e 74 20 43 54 45   the current CTE
28fd0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d  ..**.** If pFrom
28fe0 20 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68   falls into eith
28ff0 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 63 61  er of the two ca
29000 74 65 67 6f 72 69 65 73 20 61 62 6f 76 65 2c 20  tegories above, 
29010 70 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61  pFrom->pTab.** a
29020 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  nd other fields 
29030 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61 63  are populated ac
29040 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65 20 63  cordingly. The c
29050 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 68 65  aller should che
29060 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54  ck.** (pFrom->pT
29070 61 62 21 3d 30 29 20 74 6f 20 64 65 74 65 72 6d  ab!=0) to determ
29080 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
29090 6f 74 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  ot a successful 
290a0 6d 61 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75  match.** was fou
290b0 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65  nd..**.** Whethe
290c0 72 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63 68  r or not a match
290d0 20 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54   is found, SQLIT
290e0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
290f0 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20   if no error.** 
29100 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72  occurs. If an er
29110 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20  ror does occur, 
29120 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
29130 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
29140 65 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e 64 20  e.** parser and 
29150 73 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20  some error code 
29160 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
29170 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
29180 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 74  /.static int wit
29190 68 45 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65  hExpand(.  Walke
291a0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73  r *pWalker, .  s
291b0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
291c0 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50  em *pFrom.){.  P
291d0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
291e0 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
291f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
29200 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74  pParse->db;.  st
29210 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 3b 20  ruct Cte *pCte; 
29220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29230 20 4d 61 74 63 68 65 64 20 43 54 45 20 28 6f 72   Matched CTE (or
29240 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63   NULL if no matc
29250 68 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57  h) */.  With *pW
29260 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ith;            
29270 20 20 20 20 20 20 20 20 2f 2a 20 57 49 54 48 20          /* WITH 
29280 63 6c 61 75 73 65 20 74 68 61 74 20 70 43 74 65  clause that pCte
29290 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a   belongs to */..
292a0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
292b0 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70  >pTab==0 );..  p
292c0 43 74 65 20 3d 20 73 65 61 72 63 68 57 69 74 68  Cte = searchWith
292d0 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 2c 20  (pParse->pWith, 
292e0 70 46 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a  pFrom, &pWith);.
292f0 20 20 69 66 28 20 70 43 74 65 20 29 7b 0a 20 20    if( pCte ){.  
29300 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
29310 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
29320 69 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  ist;.    Select 
29330 2a 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63  *pSel;.    Selec
29340 74 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20  t *pLeft;       
29350 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74           /* Left
29360 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
29370 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  tement */.    in
29380 74 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 3b  t bMayRecursive;
29390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
293a0 72 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20  rue if compound 
293b0 6a 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20  joined by UNION 
293c0 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74  [ALL] */.    Wit
293d0 68 20 2a 70 53 61 76 65 64 57 69 74 68 3b 20 20  h *pSavedWith;  
293e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
293f0 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  itial value of p
29400 50 61 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a  Parse->pWith */.
29410 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 74 65 2d  .    /* If pCte-
29420 3e 7a 43 74 65 45 72 72 20 69 73 20 6e 6f 6e 2d  >zCteErr is non-
29430 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69  NULL at this poi
29440 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  nt, then this is
29450 20 61 6e 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20   an illegal.    
29460 2a 2a 20 72 65 63 75 72 73 69 76 65 20 72 65 66  ** recursive ref
29470 65 72 65 6e 63 65 20 74 6f 20 43 54 45 20 70 43  erence to CTE pC
29480 74 65 2e 20 4c 65 61 76 65 20 61 6e 20 65 72 72  te. Leave an err
29490 6f 72 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  or in pParse and
294a0 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65   return.    ** e
294b0 61 72 6c 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a  arly. If pCte->z
294c0 43 74 65 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20  CteErr is NULL, 
294d0 74 68 65 6e 20 74 68 69 73 20 69 73 20 6e 6f 74  then this is not
294e0 20 61 20 72 65 63 75 72 73 69 76 65 20 72 65 66   a recursive ref
294f0 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49  erence..    ** I
29500 6e 20 74 68 69 73 20 63 61 73 65 2c 20 70 72 6f  n this case, pro
29510 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ceed.  */.    if
29520 28 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20  ( pCte->zCteErr 
29530 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29540 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
29550 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 2c 20   pCte->zCteErr, 
29560 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCte->zName);.  
29570 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29580 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
29590 20 20 20 69 66 28 20 63 61 6e 6e 6f 74 42 65 46     if( cannotBeF
295a0 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  unction(pParse, 
295b0 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20  pFrom) ) return 
295c0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20  SQLITE_ERROR;.. 
295d0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
295e0 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
295f0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
29600 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
29610 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
29620 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20  zeof(Table));.  
29630 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
29640 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
29650 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62  ;.    pTab->nTab
29660 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 54 61  Ref = 1;.    pTa
29670 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  b->zName = sqlit
29680 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
29690 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Cte->zName);.   
296a0 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
296b0 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f  1;.    pTab->nRo
296c0 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61  wLogEst = 200; a
296d0 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69  ssert( 200==sqli
296e0 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37  te3LogEst(104857
296f0 36 29 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e  6) );.    pTab->
29700 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45  tabFlags |= TF_E
29710 70 68 65 6d 65 72 61 6c 20 7c 20 54 46 5f 4e 6f  phemeral | TF_No
29720 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20  VisibleRowid;.  
29730 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74    pFrom->pSelect
29740 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
29750 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 70 53  Dup(db, pCte->pS
29760 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 69  elect, 0);.    i
29770 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
29780 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  led ) return SQL
29790 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
297a0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
297b0 6d 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20  m->pSelect );.. 
297c0 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
297d0 68 69 73 20 69 73 20 61 20 72 65 63 75 72 73 69  his is a recursi
297e0 76 65 20 43 54 45 2e 20 2a 2f 0a 20 20 20 20 70  ve CTE. */.    p
297f0 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
29800 6c 65 63 74 3b 0a 20 20 20 20 62 4d 61 79 52 65  lect;.    bMayRe
29810 63 75 72 73 69 76 65 20 3d 20 28 20 70 53 65 6c  cursive = ( pSel
29820 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ->op==TK_ALL || 
29830 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  pSel->op==TK_UNI
29840 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 62 4d  ON );.    if( bM
29850 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  ayRecursive ){. 
29860 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
29870 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
29880 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
29890 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f  ->pSrc;.      fo
298a0 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e  r(i=0; i<pSrc->n
298b0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
298c0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
298d0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
298e0 26 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pSrc->a[i];.   
298f0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
29900 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 0a 20 20  zDatabase==0 .  
29910 20 20 20 20 20 20 20 26 26 20 70 49 74 65 6d 2d         && pItem-
29920 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20 20 20 20 20  >zName!=0 .     
29930 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65      && 0==sqlite
29940 33 53 74 72 49 43 6d 70 28 70 49 74 65 6d 2d 3e  3StrICmp(pItem->
29950 7a 4e 61 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e 61  zName, pCte->zNa
29960 6d 65 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  me).          ){
29970 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d  .          pItem
29980 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20  ->pTab = pTab;. 
29990 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
299a0 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 3d  fg.isRecursive =
299b0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54   1;.          pT
299c0 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20  ab->nTabRef++;. 
299d0 20 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e 73           pSel->s
299e0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65  elFlags |= SF_Re
299f0 63 75 72 73 69 76 65 3b 0a 20 20 20 20 20 20 20  cursive;.       
29a00 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
29a10 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e  ..    /* Only on
29a20 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65  e recursive refe
29a30 72 65 6e 63 65 20 69 73 20 70 65 72 6d 69 74 74  rence is permitt
29a40 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69 66 28 20  ed. */ .    if( 
29a50 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e 32 20  pTab->nTabRef>2 
29a60 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29a70 45 72 72 6f 72 4d 73 67 28 0a 20 20 20 20 20 20  ErrorMsg(.      
29a80 20 20 20 20 70 50 61 72 73 65 2c 20 22 6d 75 6c      pParse, "mul
29a90 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  tiple references
29aa0 20 74 6f 20 72 65 63 75 72 73 69 76 65 20 74 61   to recursive ta
29ab0 62 6c 65 3a 20 25 73 22 2c 20 70 43 74 65 2d 3e  ble: %s", pCte->
29ac0 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  zName.      );. 
29ad0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
29ae0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
29af0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
29b00 2d 3e 6e 54 61 62 52 65 66 3d 3d 31 20 7c 7c 20  ->nTabRef==1 || 
29b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70  .            ((p
29b20 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46  Sel->selFlags&SF
29b30 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20 70  _Recursive) && p
29b40 54 61 62 2d 3e 6e 54 61 62 52 65 66 3d 3d 32 20  Tab->nTabRef==2 
29b50 29 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a  ));..    pCte->z
29b60 43 74 65 45 72 72 20 3d 20 22 63 69 72 63 75 6c  CteErr = "circul
29b70 61 72 20 72 65 66 65 72 65 6e 63 65 3a 20 25 73  ar reference: %s
29b80 22 3b 0a 20 20 20 20 70 53 61 76 65 64 57 69 74  ";.    pSavedWit
29b90 68 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74  h = pParse->pWit
29ba0 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  h;.    pParse->p
29bb0 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20  With = pWith;.  
29bc0 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73    if( bMayRecurs
29bd0 69 76 65 20 29 7b 0a 20 20 20 20 20 20 53 65 6c  ive ){.      Sel
29be0 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 53  ect *pPrior = pS
29bf0 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  el->pPrior;.    
29c00 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
29c10 2d 3e 70 57 69 74 68 3d 3d 30 20 29 3b 0a 20 20  ->pWith==0 );.  
29c20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 57 69 74      pPrior->pWit
29c30 68 20 3d 20 70 53 65 6c 2d 3e 70 57 69 74 68 3b  h = pSel->pWith;
29c40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61  .      sqlite3Wa
29c50 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
29c60 2c 20 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 20  , pPrior);.     
29c70 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d   pPrior->pWith =
29c80 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
29c90 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
29ca0 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
29cb0 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pSel);.    }.   
29cc0 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
29cd0 20 70 57 69 74 68 3b 0a 0a 20 20 20 20 66 6f 72   pWith;..    for
29ce0 28 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65  (pLeft=pSel; pLe
29cf0 66 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66  ft->pPrior; pLef
29d00 74 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29  t=pLeft->pPrior)
29d10 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70  ;.    pEList = p
29d20 4c 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  Left->pEList;.  
29d30 20 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c    if( pCte->pCol
29d40 73 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  s ){.      if( p
29d50 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
29d60 3e 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e 70 43  >nExpr!=pCte->pC
29d70 6f 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ols->nExpr ){.  
29d80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
29d90 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
29da0 61 62 6c 65 20 25 73 20 68 61 73 20 25 64 20 76  able %s has %d v
29db0 61 6c 75 65 73 20 66 6f 72 20 25 64 20 63 6f 6c  alues for %d col
29dc0 75 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20 20 20  umns",.         
29dd0 20 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20     pCte->zName, 
29de0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  pEList->nExpr, p
29df0 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70  Cte->pCols->nExp
29e00 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  r.        );.   
29e10 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69       pParse->pWi
29e20 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b  th = pSavedWith;
29e30 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
29e40 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
29e50 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 4c 69      }.      pELi
29e60 73 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73  st = pCte->pCols
29e70 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
29e80 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
29e90 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
29ea0 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e  pEList, &pTab->n
29eb0 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c  Col, &pTab->aCol
29ec0 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52  );.    if( bMayR
29ed0 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
29ee0 20 20 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c 46    if( pSel->selF
29ef0 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73  lags & SF_Recurs
29f00 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ive ){.        p
29f10 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22  Cte->zCteErr = "
29f20 6d 75 6c 74 69 70 6c 65 20 72 65 63 75 72 73 69  multiple recursi
29f30 76 65 20 72 65 66 65 72 65 6e 63 65 73 3a 20 25  ve references: %
29f40 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  s";.      }else{
29f50 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a  .        pCte->z
29f60 43 74 65 45 72 72 20 3d 20 22 72 65 63 75 72 73  CteErr = "recurs
29f70 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 6e  ive reference in
29f80 20 61 20 73 75 62 71 75 65 72 79 3a 20 25 73 22   a subquery: %s"
29f90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29fa0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
29fb0 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29  t(pWalker, pSel)
29fc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 74 65  ;.    }.    pCte
29fd0 2d 3e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a 20  ->zCteErr = 0;. 
29fe0 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
29ff0 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20   = pSavedWith;. 
2a000 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
2a010 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
2a020 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2a030 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20  _OMIT_CTE./*.** 
2a040 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 70 61  If the SELECT pa
2a050 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
2a060 6e 64 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20  nd argument has 
2a070 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20 57 49  an associated WI
2a080 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 70  TH .** clause, p
2a090 6f 70 20 69 74 20 66 72 6f 6d 20 74 68 65 20 73  op it from the s
2a0a0 74 61 63 6b 20 73 74 6f 72 65 64 20 61 73 20 70  tack stored as p
2a0b0 61 72 74 20 6f 66 20 74 68 65 20 50 61 72 73 65  art of the Parse
2a0c0 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
2a0d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2a0e0 75 73 65 64 20 61 73 20 74 68 65 20 78 53 65 6c  used as the xSel
2a0f0 65 63 74 43 61 6c 6c 62 61 63 6b 32 28 29 20 63  ectCallback2() c
2a100 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73 71  allback by.** sq
2a110 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
2a120 64 28 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e 67  d() when walking
2a130 20 61 20 53 45 4c 45 43 54 20 74 72 65 65 20 74   a SELECT tree t
2a140 6f 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65 0a  o resolve table.
2a150 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74 68  ** names and oth
2a160 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  er FROM clause e
2a170 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61  lements. .*/.sta
2a180 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 50  tic void selectP
2a190 6f 70 57 69 74 68 28 57 61 6c 6b 65 72 20 2a 70  opWith(Walker *p
2a1a0 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
2a1b0 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
2a1c0 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
2a1d0 50 61 72 73 65 3b 0a 20 20 69 66 28 20 4f 4b 5f  Parse;.  if( OK_
2a1e0 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70  IF_ALWAYS_TRUE(p
2a1f0 50 61 72 73 65 2d 3e 70 57 69 74 68 29 20 26 26  Parse->pWith) &&
2a200 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b   p->pPrior==0 ){
2a210 0a 20 20 20 20 57 69 74 68 20 2a 70 57 69 74 68  .    With *pWith
2a220 20 3d 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74   = findRightmost
2a230 28 70 29 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20  (p)->pWith;.    
2a240 69 66 28 20 70 57 69 74 68 21 3d 30 20 29 7b 0a  if( pWith!=0 ){.
2a250 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2a260 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57 69  arse->pWith==pWi
2a270 74 68 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  th );.      pPar
2a280 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
2a290 68 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20 7d  h->pOuter;.    }
2a2a0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  .  }.}.#else.#de
2a2b0 66 69 6e 65 20 73 65 6c 65 63 74 50 6f 70 57 69  fine selectPopWi
2a2c0 74 68 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  th 0.#endif../*.
2a2d0 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 5f 69  ** The SrcList_i
2a2e0 74 65 6d 20 73 74 72 75 63 74 75 72 65 20 70 61  tem structure pa
2a2f0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
2a300 6e 64 20 61 72 67 75 6d 65 6e 74 20 72 65 70 72  nd argument repr
2a310 65 73 65 6e 74 73 20 61 0a 2a 2a 20 73 75 62 2d  esents a.** sub-
2a320 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
2a330 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
2a340 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
2a350 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  This function.**
2a360 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 70   allocates and p
2a370 6f 70 75 6c 61 74 65 73 20 74 68 65 20 53 72 63  opulates the Src
2a380 4c 69 73 74 5f 69 74 65 6d 2e 70 54 61 62 20 6f  List_item.pTab o
2a390 62 6a 65 63 74 2e 20 49 66 20 73 75 63 63 65 73  bject. If succes
2a3a0 73 66 75 6c 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  sful,.** SQLITE_
2a3b0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
2a3c0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e  Otherwise, if an
2a3d0 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e   OOM error is en
2a3e0 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 53 51  countered,.** SQ
2a3f0 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 69  LITE_NOMEM..*/.i
2a400 6e 74 20 73 71 6c 69 74 65 33 45 78 70 61 6e 64  nt sqlite3Expand
2a410 53 75 62 71 75 65 72 79 28 50 61 72 73 65 20 2a  Subquery(Parse *
2a420 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53  pParse, struct S
2a430 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
2a440 6f 6d 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  om){.  Select *p
2a450 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
2a460 6c 65 63 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70  lect;.  Table *p
2a470 54 61 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Tab;..  assert( 
2a480 70 53 65 6c 20 29 3b 0a 20 20 70 46 72 6f 6d 2d  pSel );.  pFrom-
2a490 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73  >pTab = pTab = s
2a4a0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
2a4b0 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
2a4c0 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
2a4d0 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
2a4e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2a4f0 45 4d 3b 0a 20 20 70 54 61 62 2d 3e 6e 54 61 62  EM;.  pTab->nTab
2a500 52 65 66 20 3d 20 31 3b 0a 20 20 69 66 28 20 70  Ref = 1;.  if( p
2a510 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a  From->zAlias ){.
2a520 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20      pTab->zName 
2a530 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
2a540 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 46  p(pParse->db, pF
2a550 72 6f 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  rom->zAlias);.  
2a560 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 62 2d  }else{.    pTab-
2a570 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
2a580 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
2a590 64 62 2c 20 22 73 75 62 71 75 65 72 79 5f 25 75  db, "subquery_%u
2a5a0 22 2c 20 70 53 65 6c 2d 3e 73 65 6c 49 64 29 3b  ", pSel->selId);
2a5b0 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 53  .  }.  while( pS
2a5c0 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53  el->pPrior ){ pS
2a5d0 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f  el = pSel->pPrio
2a5e0 72 3b 20 7d 0a 20 20 73 71 6c 69 74 65 33 43 6f  r; }.  sqlite3Co
2a5f0 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
2a600 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e  t(pParse, pSel->
2a610 70 45 4c 69 73 74 2c 26 70 54 61 62 2d 3e 6e 43  pEList,&pTab->nC
2a620 6f 6c 2c 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b  ol,&pTab->aCol);
2a630 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d  .  pTab->iPKey =
2a640 20 2d 31 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f   -1;.  pTab->nRo
2a650 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61  wLogEst = 200; a
2a660 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69  ssert( 200==sqli
2a670 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37  te3LogEst(104857
2a680 36 29 20 29 3b 0a 20 20 70 54 61 62 2d 3e 74 61  6) );.  pTab->ta
2a690 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68  bFlags |= TF_Eph
2a6a0 65 6d 65 72 61 6c 3b 0a 0a 20 20 72 65 74 75 72  emeral;..  retur
2a6b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2a6c0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2a6d0 6e 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20 63  ne is a Walker c
2a6e0 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78 70  allback for "exp
2a6f0 61 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43 54  anding" a SELECT
2a700 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22   statement..** "
2a710 45 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73  Expanding" means
2a720 20 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f   to do the follo
2a730 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  wing:.**.**    (
2a740 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44  1)  Make sure VD
2a750 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
2a760 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69  s have been assi
2a770 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a  gned to every.**
2a780 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74           element
2a790 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
2a7a0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  use..**.**    (2
2a7b0 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  )  Fill in the p
2a7c0 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61  TabList->a[].pTa
2a7d0 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  b fields in the 
2a7e0 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a  SrcList that .**
2a7f0 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73           defines
2a800 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57   FROM clause.  W
2a810 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61 72  hen views appear
2a820 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2a830 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  use,.**         
2a840 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61  fill pTabList->a
2a850 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20  [].pSelect with 
2a860 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45  a copy of the SE
2a870 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a  LECT statement.*
2a880 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69  *         that i
2a890 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69  mplements the vi
2a8a0 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d  ew.  A copy is m
2a8b0 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27  ade of the view'
2a8c0 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20  s SELECT.**     
2a8d0 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f      statement so
2a8e0 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65   that we can fre
2a8f0 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65  ely modify or de
2a900 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d  lete that statem
2a910 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77  ent.**         w
2a920 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20  ithout worrying 
2a930 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70  about messing up
2a940 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
2a950 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a  representation.*
2a960 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65  *         of the
2a970 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   view..**.**    
2a980 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20 74  (3)  Add terms t
2a990 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
2a9a0 73 65 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74  se to accommodat
2a9b0 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65  e the NATURAL ke
2a9c0 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20  yword.**        
2a9d0 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68   on joins and th
2a9e0 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  e ON and USING c
2a9f0 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a  lause of joins..
2aa00 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63  **.**    (4)  Sc
2aa10 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63  an the list of c
2aa20 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
2aa30 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74  sult set (pEList
2aa40 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20  ) looking.**    
2aa50 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63       for instanc
2aa60 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70  es of the "*" op
2aa70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41  erator or the TA
2aa80 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  BLE.* operator..
2aa90 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f  **         If fo
2aaa0 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68  und, expand each
2aab0 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79   "*" to be every
2aac0 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79   column in every
2aad0 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20   table.**       
2aae0 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f    and TABLE.* to
2aaf0 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
2ab00 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f   in TABLE..**.*/
2ab10 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65  .static int sele
2ab20 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b 65  ctExpander(Walke
2ab30 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
2ab40 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20  ct *p){.  Parse 
2ab50 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
2ab60 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74  r->pParse;.  int
2ab70 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c   i, j, k;.  SrcL
2ab80 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
2ab90 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
2aba0 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  t;.  struct SrcL
2abb0 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b  ist_item *pFrom;
2abc0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2abd0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45   pParse->db;.  E
2abe0 78 70 72 20 2a 70 45 2c 20 2a 70 52 69 67 68 74  xpr *pE, *pRight
2abf0 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75 31 36 20  , *pExpr;.  u16 
2ac00 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65  selFlags = p->se
2ac10 6c 46 6c 61 67 73 3b 0a 20 20 75 33 32 20 65 6c  lFlags;.  u32 el
2ac20 69 73 74 46 6c 61 67 73 20 3d 20 30 3b 0a 0a 20  istFlags = 0;.. 
2ac30 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
2ac40 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 69  SF_Expanded;.  i
2ac50 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
2ac60 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75  led  ){.    retu
2ac70 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
2ac80 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  }.  assert( p->p
2ac90 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Src!=0 );.  if( 
2aca0 28 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 45  (selFlags & SF_E
2acb0 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20  xpanded)!=0 ){. 
2acc0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
2acd0 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c  une;.  }.  pTabL
2ace0 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
2acf0 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
2ad00 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 57 69  ist;.  sqlite3Wi
2ad10 74 68 50 75 73 68 28 70 50 61 72 73 65 2c 20 70  thPush(pParse, p
2ad20 2d 3e 70 57 69 74 68 2c 20 30 29 3b 0a 0a 20 20  ->pWith, 0);..  
2ad30 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72  /* Make sure cur
2ad40 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
2ad50 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
2ad60 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e  o all entries in
2ad70 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
2ad80 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c  lause of the SEL
2ad90 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  ECT statement.. 
2ada0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63   */.  sqlite3Src
2adb0 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
2adc0 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
2add0 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  st);..  /* Look 
2ade0 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e  up every table n
2adf0 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d  amed in the FROM
2ae00 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
2ae10 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20  elect.  If.  ** 
2ae20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  an entry of the 
2ae30 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61  FROM clause is a
2ae40 20 73 75 62 71 75 65 72 79 20 69 6e 73 74 65 61   subquery instea
2ae50 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  d of a table or 
2ae60 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  view,.  ** then 
2ae70 63 72 65 61 74 65 20 61 20 74 72 61 6e 73 69 65  create a transie
2ae80 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
2ae90 72 65 20 74 6f 20 64 65 73 63 72 69 62 65 20 74  re to describe t
2aea0 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a  he subquery..  *
2aeb0 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72  /.  for(i=0, pFr
2aec0 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
2aed0 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
2aee0 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
2aef0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
2af00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
2af10 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73  rom->fg.isRecurs
2af20 69 76 65 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d  ive==0 || pFrom-
2af30 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20  >pTab!=0 );.    
2af40 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73  if( pFrom->fg.is
2af50 52 65 63 75 72 73 69 76 65 20 29 20 63 6f 6e 74  Recursive ) cont
2af60 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
2af70 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
2af80 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
2af90 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
2afa0 69 66 28 20 77 69 74 68 45 78 70 61 6e 64 28 70  if( withExpand(p
2afb0 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29 20 29  Walker, pFrom) )
2afc0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
2afd0 74 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d  t;.    if( pFrom
2afe0 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c 73 65  ->pTab ) {} else
2aff0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
2b000 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20  pFrom->zName==0 
2b010 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
2b020 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
2b030 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
2b040 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  el = pFrom->pSel
2b050 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20  ect;.      /* A 
2b060 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
2b070 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
2b080 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
2b090 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 21 3d    assert( pSel!=
2b0a0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
2b0b0 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
2b0c0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  0 );.      if( s
2b0d0 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
2b0e0 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 20  (pWalker, pSel) 
2b0f0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
2b100 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  rt;.      if( sq
2b110 6c 69 74 65 33 45 78 70 61 6e 64 53 75 62 71 75  lite3ExpandSubqu
2b120 65 72 79 28 70 50 61 72 73 65 2c 20 70 46 72 6f  ery(pParse, pFro
2b130 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  m) ) return WRC_
2b140 41 62 6f 72 74 3b 0a 23 65 6e 64 69 66 0a 20 20  Abort;.#endif.  
2b150 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
2b160 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61  * An ordinary ta
2b170 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65  ble or view name
2b180 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2b190 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  use */.      ass
2b1a0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
2b1b0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72  ==0 );.      pFr
2b1c0 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
2b1d0 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
2b1e0 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c  ableItem(pParse,
2b1f0 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20   0, pFrom);.    
2b200 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
2b210 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
2b220 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
2b230 2d 3e 6e 54 61 62 52 65 66 3e 3d 30 78 66 66 66  ->nTabRef>=0xfff
2b240 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  f ){.        sql
2b250 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2b260 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72  rse, "too many r
2b270 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25  eferences to \"%
2b280 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c  s\": max 65535",
2b290 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62  .           pTab
2b2a0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
2b2b0 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
2b2c0 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
2b2d0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
2b2e0 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d     }.      pTab-
2b2f0 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20  >nTabRef++;.    
2b300 20 20 69 66 28 20 21 49 73 56 69 72 74 75 61 6c    if( !IsVirtual
2b310 28 70 54 61 62 29 20 26 26 20 63 61 6e 6e 6f 74  (pTab) && cannot
2b320 42 65 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  BeFunction(pPars
2b330 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20  e, pFrom) ){.   
2b340 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
2b350 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 23  Abort;.      }.#
2b360 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
2b370 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
2b380 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54   !defined (SQLIT
2b390 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2b3a0 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 49  BLE).      if( I
2b3b0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 7c  sVirtual(pTab) |
2b3c0 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
2b3d0 29 7b 0a 20 20 20 20 20 20 20 20 69 31 36 20 6e  ){.        i16 n
2b3e0 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Col;.        if(
2b3f0 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
2b400 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
2b410 65 2c 20 70 54 61 62 29 20 29 20 72 65 74 75 72  e, pTab) ) retur
2b420 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
2b430 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
2b440 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  om->pSelect==0 )
2b450 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d  ;.        pFrom-
2b460 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
2b470 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
2b480 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30  pTab->pSelect, 0
2b490 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20  );.        nCol 
2b4a0 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  = pTab->nCol;.  
2b4b0 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c        pTab->nCol
2b4c0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 73   = -1;.        s
2b4d0 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
2b4e0 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d  (pWalker, pFrom-
2b4f0 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
2b500 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20     pTab->nCol = 
2b510 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65  nCol;.      }.#e
2b520 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
2b530 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  /* Locate the in
2b540 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74 68 65  dex named by the
2b550 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
2b560 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20  se, if any. */. 
2b570 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e     if( sqlite3In
2b580 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50  dexedByLookup(pP
2b590 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a  arse, pFrom) ){.
2b5a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
2b5b0 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20  _Abort;.    }.  
2b5c0 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  }..  /* Process 
2b5d0 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73  NATURAL keywords
2b5e0 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49  , and ON and USI
2b5f0 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f  NG clauses of jo
2b600 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
2b610 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2b620 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73   || sqliteProces
2b630 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29  sJoin(pParse, p)
2b640 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
2b650 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20  RC_Abort;.  }.. 
2b660 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a   /* For every "*
2b670 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e  " that occurs in
2b680 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   the column list
2b690 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d  , insert the nam
2b6a0 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63  es of.  ** all c
2b6b0 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61  olumns in all ta
2b6c0 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65  bles.  And for e
2b6d0 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73  very TABLE.* ins
2b6e0 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20  ert the names.  
2b6f0 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  ** of all column
2b700 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65  s in TABLE.  The
2b710 20 70 61 72 73 65 72 20 69 6e 73 65 72 74 65 64   parser inserted
2b720 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65   a special expre
2b730 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20  ssion.  ** with 
2b740 74 68 65 20 54 4b 5f 41 53 54 45 52 49 53 4b 20  the TK_ASTERISK 
2b750 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63  operator for eac
2b760 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f  h "*" that it fo
2b770 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  und in the colum
2b780 6e 0a 20 20 2a 2a 20 6c 69 73 74 2e 20 20 54 68  n.  ** list.  Th
2b790 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
2b7a0 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63   just has to loc
2b7b0 61 74 65 20 74 68 65 20 54 4b 5f 41 53 54 45 52  ate the TK_ASTER
2b7c0 49 53 4b 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  ISK.  ** express
2b7d0 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 20  ions and expand 
2b7e0 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20  each one to the 
2b7f0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75  list of all colu
2b800 6d 6e 73 20 69 6e 0a 20 20 2a 2a 20 61 6c 6c 20  mns in.  ** all 
2b810 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
2b820 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70  * The first loop
2b830 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20   just checks to 
2b840 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65  see if there are
2b850 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f   any "*" operato
2b860 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65  rs.  ** that nee
2b870 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a  d expanding..  *
2b880 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70  /.  for(k=0; k<p
2b890 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
2b8a0 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20 70 45 4c  +){.    pE = pEL
2b8b0 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b  ist->a[k].pExpr;
2b8c0 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
2b8d0 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62  =TK_ASTERISK ) b
2b8e0 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74  reak;.    assert
2b8f0 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54  ( pE->op!=TK_DOT
2b900 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d   || pE->pRight!=
2b910 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2b920 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20   pE->op!=TK_DOT 
2b930 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30  || (pE->pLeft!=0
2b940 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f   && pE->pLeft->o
2b950 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20  p==TK_ID) );.   
2b960 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
2b970 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68  DOT && pE->pRigh
2b980 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49  t->op==TK_ASTERI
2b990 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  SK ) break;.    
2b9a0 65 6c 69 73 74 46 6c 61 67 73 20 7c 3d 20 70 45  elistFlags |= pE
2b9b0 2d 3e 66 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 69  ->flags;.  }.  i
2b9c0 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  f( k<pEList->nEx
2b9d0 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  pr ){.    /*.   
2b9e0 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65   ** If we get he
2b9f0 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  re it means the 
2ba00 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61  result set conta
2ba10 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
2ba20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  "*".    ** opera
2ba30 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
2ba40 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20  o be expanded.  
2ba50 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
2ba60 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  h expression.   
2ba70 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
2ba80 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64  t set and expand
2ba90 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65   them one by one
2baa0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72  ..    */.    str
2bab0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
2bac0 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61  m *a = pEList->a
2bad0 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
2bae0 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e  pNew = 0;.    in
2baf0 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65  t flags = pParse
2bb00 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  ->db->flags;.   
2bb10 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d   int longNames =
2bb20 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
2bb30 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
2bb40 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
2bb50 20 20 20 20 20 20 20 20 26 26 20 28 66 6c 61 67          && (flag
2bb60 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74  s & SQLITE_Short
2bb70 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20  ColNames)==0;.. 
2bb80 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45     for(k=0; k<pE
2bb90 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
2bba0 29 7b 0a 20 20 20 20 20 20 70 45 20 3d 20 61 5b  ){.      pE = a[
2bbb0 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  k].pExpr;.      
2bbc0 65 6c 69 73 74 46 6c 61 67 73 20 7c 3d 20 70 45  elistFlags |= pE
2bbd0 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 70  ->flags;.      p
2bbe0 52 69 67 68 74 20 3d 20 70 45 2d 3e 70 52 69 67  Right = pE->pRig
2bbf0 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ht;.      assert
2bc00 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54  ( pE->op!=TK_DOT
2bc10 20 7c 7c 20 70 52 69 67 68 74 21 3d 30 20 29 3b   || pRight!=0 );
2bc20 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  .      if( pE->o
2bc30 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20  p!=TK_ASTERISK. 
2bc40 20 20 20 20 20 20 26 26 20 28 70 45 2d 3e 6f 70        && (pE->op
2bc50 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67  !=TK_DOT || pRig
2bc60 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52  ht->op!=TK_ASTER
2bc70 49 53 4b 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  ISK).      ){.  
2bc80 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61        /* This pa
2bc90 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73  rticular express
2bca0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ion does not nee
2bcb0 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
2bcc0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2bcd0 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
2bce0 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
2bcf0 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  d(pParse, pNew, 
2bd00 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[k].pExpr);.   
2bd10 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
2bd20 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
2bd30 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
2bd40 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a  ].zName = a[k].z
2bd50 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
2bd60 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
2bd70 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61  xpr-1].zSpan = a
2bd80 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20  [k].zSpan;.     
2bd90 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20       a[k].zName 
2bda0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61  = 0;.          a
2bdb0 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20  [k].zSpan = 0;. 
2bdc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2bdd0 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b   a[k].pExpr = 0;
2bde0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2bdf0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78        /* This ex
2be00 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a  pression is a "*
2be10 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22  " or a "TABLE.*"
2be20 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
2be30 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61  .        ** expa
2be40 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nded. */.       
2be50 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d   int tableSeen =
2be60 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20   0;      /* Set 
2be70 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20  to 1 when TABLE 
2be80 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20  matches */.     
2be90 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20     char *zTName 
2bea0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 74 65  = 0;       /* te
2beb0 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41  xt of name of TA
2bec0 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  BLE */.        i
2bed0 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
2bee0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  T ){.          a
2bef0 73 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74  ssert( pE->pLeft
2bf00 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
2bf10 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
2bf20 73 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c  sProperty(pE->pL
2bf30 65 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  eft, EP_IntValue
2bf40 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) );.          z
2bf50 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66  TName = pE->pLef
2bf60 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  t->u.zToken;.   
2bf70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
2bf80 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
2bf90 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
2bfa0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
2bfb0 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
2bfc0 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
2bfd0 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
2bfe0 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63  .          Selec
2bff0 74 20 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d  t *pSub = pFrom-
2c000 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
2c010 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61      char *zTabNa
2c020 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69  me = pFrom->zAli
2c030 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  as;.          co
2c040 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d  nst char *zSchem
2c050 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  aName = 0;.     
2c060 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20       int iDb;.  
2c070 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
2c080 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
2c090 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20         zTabName 
2c0a0 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
2c0b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c0c0 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
2c0d0 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61  locFailed ) brea
2c0e0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  k;.          if(
2c0f0 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75   pSub==0 || (pSu
2c100 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
2c110 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20  _NestedFrom)==0 
2c120 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
2c130 53 75 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Sub = 0;.       
2c140 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
2c150 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
2c160 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61  p(zTName, zTabNa
2c170 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
2c180 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2c190 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2c1a0 20 20 20 20 20 20 20 20 20 20 20 20 69 44 62 20              iDb 
2c1b0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
2c1c0 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
2c1d0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
2c1e0 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61         zSchemaNa
2c1f0 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62  me = iDb>=0 ? db
2c200 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
2c210 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20  ame : "*";.     
2c220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2c230 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
2c240 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
2c250 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
2c260 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43  zName = pTab->aC
2c270 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol[j].zName;.   
2c280 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
2c290 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65  Colname;  /* The
2c2a0 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e   computed column
2c2b0 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
2c2c0 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72       char *zToFr
2c2d0 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65  ee;   /* Malloce
2c2e0 64 20 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65  d string that ne
2c2f0 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  eds to be freed 
2c300 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  */.            T
2c310 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20  oken sColname;  
2c320 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75  /* Computed colu
2c330 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b  mn name as a tok
2c340 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20  en */..         
2c350 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65     assert( zName
2c360 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2c370 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 70 53  if( zTName && pS
2c380 75 62 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ub.             
2c390 26 26 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53  && sqlite3MatchS
2c3a0 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45  panName(pSub->pE
2c3b0 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e  List->a[j].zSpan
2c3c0 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d  , 0, zTName, 0)=
2c3d0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  =0.            )
2c3e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2c3f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2c400 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2c410 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c       /* If a col
2c420 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73  umn is marked as
2c430 20 27 68 69 64 64 65 6e 27 2c 20 6f 6d 69 74 20   'hidden', omit 
2c440 69 74 20 66 72 6f 6d 20 74 68 65 20 65 78 70 61  it from the expa
2c450 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 20  nded.           
2c460 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c   ** result-set l
2c470 69 73 74 20 75 6e 6c 65 73 73 20 74 68 65 20 53  ist unless the S
2c480 45 4c 45 43 54 20 68 61 73 20 74 68 65 20 53 46  ELECT has the SF
2c490 5f 49 6e 63 6c 75 64 65 48 69 64 64 65 6e 0a 20  _IncludeHidden. 
2c4a0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 69             ** bi
2c4b0 74 20 73 65 74 2e 0a 20 20 20 20 20 20 20 20 20  t set..         
2c4c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2c4d0 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
2c4e0 67 73 20 26 20 53 46 5f 49 6e 63 6c 75 64 65 48  gs & SF_IncludeH
2c4f0 69 64 64 65 6e 29 3d 3d 30 0a 20 20 20 20 20 20  idden)==0.      
2c500 20 20 20 20 20 20 20 26 26 20 49 73 48 69 64 64         && IsHidd
2c510 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e  enColumn(&pTab->
2c520 61 43 6f 6c 5b 6a 5d 29 20 0a 20 20 20 20 20 20  aCol[j]) .      
2c530 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2c540 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2c550 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2c560 20 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65             table
2c570 53 65 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20  Seen = 1;..     
2c580 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26         if( i>0 &
2c590 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  & zTName==0 ){. 
2c5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2c5b0 20 28 70 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e   (pFrom->fg.join
2c5c0 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
2c5d0 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  L)!=0.          
2c5e0 20 20 20 20 20 20 26 26 20 74 61 62 6c 65 41 6e        && tableAn
2c5f0 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61  dColumnIndex(pTa
2c600 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c  bList, i, zName,
2c610 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20 20 20   0, 0).         
2c620 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2c630 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
2c640 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d  NATURAL join, om
2c650 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75  it the join colu
2c660 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  mns from the .  
2c670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
2c680 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 72 69   table to the ri
2c690 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ght of the join 
2c6a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
2c6b0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2c6c0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2c6d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
2c6e0 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
2c6f0 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c  x(pFrom->pUsing,
2c700 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20   zName)>=0 ){.  
2c710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c720 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20   In a join with 
2c730 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20  a USING clause, 
2c740 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  omit columns in 
2c750 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
2c760 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61      ** using cla
2c770 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62  use from the tab
2c780 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e  le on the right.
2c790 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2c7a0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2c7b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2c7c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c7d0 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d          pRight =
2c7e0 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
2c7f0 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a   TK_ID, zName);.
2c800 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
2c810 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  name = zName;.  
2c820 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65            zToFre
2c830 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
2c840 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73     if( longNames
2c850 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   || pTabList->nS
2c860 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  rc>1 ){.        
2c870 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
2c880 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
2c890 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   pLeft = sqlite3
2c8a0 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20  Expr(db, TK_ID, 
2c8b0 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20  zTabName);.     
2c8c0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
2c8d0 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
2c8e0 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c  arse, TK_DOT, pL
2c8f0 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
2c900 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2c910 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20  zSchemaName ){. 
2c920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2c930 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
2c940 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53  pr(db, TK_ID, zS
2c950 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20  chemaName);.    
2c960 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2c970 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
2c980 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
2c990 20 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a   pLeft, pExpr);.
2c9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2c9c0 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20  ( longNames ){. 
2c9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
2c9e0 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  Colname = sqlite
2c9f0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
2ca00 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  .%s", zTabName, 
2ca10 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
2ca20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20          zToFree 
2ca30 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20  = zColname;.    
2ca40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2ca50 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2ca60 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
2ca70 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  pr = pRight;.   
2ca80 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2ca90 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
2caa0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
2cab0 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77  end(pParse, pNew
2cac0 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
2cad0 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b        sqlite3Tok
2cae0 65 6e 49 6e 69 74 28 26 73 43 6f 6c 6e 61 6d 65  enInit(&sColname
2caf0 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20  , zColname);.   
2cb00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2cb10 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28  ExprListSetName(
2cb20 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73  pParse, pNew, &s
2cb30 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  Colname, 0);.   
2cb40 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
2cb50 77 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67  w && (p->selFlag
2cb60 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f  s & SF_NestedFro
2cb70 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)!=0 ){.       
2cb80 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
2cb90 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58 20  prList_item *pX 
2cba0 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d  = &pNew->a[pNew-
2cbb0 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20  >nExpr-1];.     
2cbc0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75           if( pSu
2cbd0 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  b ){.           
2cbe0 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d       pX->zSpan =
2cbf0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
2cc00 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  (db, pSub->pELis
2cc10 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a  t->a[j].zSpan);.
2cc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc30 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53  testcase( pX->zS
2cc40 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pan==0 );.      
2cc50 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2cc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2cc70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74  X->zSpan = sqlit
2cc80 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
2cc90 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20 20  s.%s.%s",.      
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 20 20 20 20 20                  
2ccc0 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65       zSchemaName
2ccd0 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c  , zTabName, zCol
2cce0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
2ccf0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2cd00 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b   pX->zSpan==0 );
2cd10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2cd20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2cd30 58 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20  X->bSpanIsTab = 
2cd40 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
2cd50 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2cd60 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
2cd70 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20  ToFree);.       
2cd80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2cd90 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c         if( !tabl
2cda0 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  eSeen ){.       
2cdb0 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b     if( zTName ){
2cdc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2cdd0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2cde0 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
2cdf0 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65  ble: %s", zTName
2ce00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
2ce10 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2ce20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2ce30 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c  pParse, "no tabl
2ce40 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a  es specified");.
2ce50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2ce60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2ce70 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
2ce80 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
2ce90 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  , pEList);.    p
2cea0 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b  ->pEList = pNew;
2ceb0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 45  .  }.  if( p->pE
2cec0 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20  List ){.    if( 
2ced0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
2cee0 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
2cef0 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
2cf00 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2cf10 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2cf20 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75  , "too many colu
2cf30 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65  mns in result se
2cf40 74 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  t");.      retur
2cf50 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
2cf60 20 7d 0a 20 20 20 20 69 66 28 20 28 65 6c 69 73   }.    if( (elis
2cf70 74 46 6c 61 67 73 20 26 20 28 45 50 5f 48 61 73  tFlags & (EP_Has
2cf80 46 75 6e 63 7c 45 50 5f 53 75 62 71 75 65 72 79  Func|EP_Subquery
2cf90 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ))!=0 ){.      p
2cfa0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
2cfb0 5f 43 6f 6d 70 6c 65 78 52 65 73 75 6c 74 3b 0a  _ComplexResult;.
2cfc0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2cfd0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2cfe0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20  .}../*.** No-op 
2cff0 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20  routine for the 
2d000 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65  parse-tree walke
2d010 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  r..**.** When th
2d020 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
2d030 65 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61  e Walker.xExprCa
2d040 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72  llback then expr
2d050 65 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20  ession trees.** 
2d060 61 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f  are walked witho
2d070 75 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62  ut any actions b
2d080 65 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61  eing taken at ea
2d090 63 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d  ch node.  Presum
2d0a0 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68  ably,.** when th
2d0b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
2d0c0 65 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45  ed for Walker.xE
2d0d0 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e  xprCallback then
2d0e0 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c   .** Walker.xSel
2d0f0 65 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73  ectCallback is s
2d100 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69  et to do somethi
2d110 6e 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76  ng useful for ev
2d120 65 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79  ery .** subquery
2d130 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 74   in the parser t
2d140 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ree..*/.int sqli
2d150 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 28  te3ExprWalkNoop(
2d160 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c  Walker *NotUsed,
2d170 20 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29   Expr *NotUsed2)
2d180 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
2d190 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
2d1a0 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
2d1b0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2d1c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20  .}../*.** No-op 
2d1d0 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20  routine for the 
2d1e0 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65  parse-tree walke
2d1f0 72 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61  r for SELECT sta
2d200 74 65 6d 65 6e 74 73 2e 0a 2a 2a 20 73 75 62 71  tements..** subq
2d210 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73  uery in the pars
2d220 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20  er tree..*/.int 
2d230 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
2d240 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f  kNoop(Walker *No
2d250 74 55 73 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e  tUsed, Select *N
2d260 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  otUsed2){.  UNUS
2d270 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
2d280 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
2d290 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
2d2a0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 20  ontinue;.}..#if 
2d2b0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
2d2c0 2a 2a 20 41 6c 77 61 79 73 20 61 73 73 65 72 74  ** Always assert
2d2d0 2e 20 20 54 68 69 73 20 78 53 65 6c 65 63 74 43  .  This xSelectC
2d2e0 61 6c 6c 62 61 63 6b 32 20 69 6d 70 6c 65 6d 65  allback2 impleme
2d2f0 6e 74 61 74 69 6f 6e 20 70 72 6f 76 65 73 20 74  ntation proves t
2d300 68 61 74 20 74 68 65 0a 2a 2a 20 78 53 65 6c 65  hat the.** xSele
2d310 63 74 43 61 6c 6c 62 61 63 6b 32 20 69 73 20 6e  ctCallback2 is n
2d320 65 76 65 72 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f  ever invoked..*/
2d330 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
2d340 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32 28 57  ectWalkAssert2(W
2d350 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20  alker *NotUsed, 
2d360 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 32  Select *NotUsed2
2d370 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2d380 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
2d390 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 61 73 73  NotUsed2);.  ass
2d3a0 65 72 74 28 20 30 20 29 3b 0a 7d 0a 23 65 6e 64  ert( 0 );.}.#end
2d3b0 69 66 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  if./*.** This ro
2d3c0 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20  utine "expands" 
2d3d0 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
2d3e0 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74  nt and all of it
2d3f0 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  s subqueries..**
2d400 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   For additional 
2d410 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77  information on w
2d420 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20  hat it means to 
2d430 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43  "expand" a SELEC
2d440 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20  T.** statement, 
2d450 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  see the comment 
2d460 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78 70  on the selectExp
2d470 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62  and worker callb
2d480 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a  ack above..**.**
2d490 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c   Expanding a SEL
2d4a0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73  ECT statement is
2d4b0 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70 20   the first step 
2d4c0 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a  in processing a.
2d4d0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
2d4e0 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54  ent.  The SELECT
2d4f0 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20   statement must 
2d500 62 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f  be expanded befo
2d510 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c  re.** name resol
2d520 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d  ution is perform
2d530 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  ed..**.** If any
2d540 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
2d550 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  , an error messa
2d560 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
2d570 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68  to pParse..** Th
2d580 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
2d590 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74 68  on can detect th
2d5a0 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f  e problem by loo
2d5b0 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e  king at pParse->
2d5c0 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70  nErr.** and/or p
2d5d0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
2d5e0 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74  cFailed..*/.stat
2d5f0 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
2d600 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72 73  electExpand(Pars
2d610 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
2d620 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57  t *pSelect){.  W
2d630 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78  alker w;.  w.xEx
2d640 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c  prCallback = sql
2d650 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70  ite3ExprWalkNoop
2d660 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
2d670 50 61 72 73 65 3b 0a 20 20 69 66 28 20 4f 4b 5f  Parse;.  if( OK_
2d680 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70  IF_ALWAYS_TRUE(p
2d690 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75  Parse->hasCompou
2d6a0 6e 64 29 20 29 7b 0a 20 20 20 20 77 2e 78 53 65  nd) ){.    w.xSe
2d6b0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63  lectCallback = c
2d6c0 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65  onvertCompoundSe
2d6d0 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 3b 0a  lectToSubquery;.
2d6e0 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c      w.xSelectCal
2d6f0 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20  lback2 = 0;.    
2d700 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
2d710 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
2d720 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74 43    }.  w.xSelectC
2d730 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
2d740 45 78 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78 53  Expander;.  w.xS
2d750 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
2d760 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a   selectPopWith;.
2d770 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
2d780 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29  ect(&w, pSelect)
2d790 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
2d7a0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
2d7b0 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  RY./*.** This is
2d7c0 20 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63   a Walker.xSelec
2d7d0 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61  tCallback callba
2d7e0 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74  ck for the sqlit
2d7f0 65 33 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f  e3SelectTypeInfo
2d800 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e  ().** interface.
2d810 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20  .**.** For each 
2d820 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
2d830 75 65 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e  uery, add Column
2d840 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d  .zType and Colum
2d850 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72  n.zColl.** infor
2d860 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61  mation to the Ta
2d870 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
2d880 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68  at represents th
2d890 65 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20  e result set.** 
2d8a0 6f 66 20 74 68 61 74 20 73 75 62 71 75 65 72 79  of that subquery
2d8b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c  ..**.** The Tabl
2d8c0 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
2d8d0 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20   represents the 
2d8e0 72 65 73 75 6c 74 20 73 65 74 20 77 61 73 20 63  result set was c
2d8f0 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79  onstructed.** by
2d900 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28   selectExpander(
2d910 29 20 62 75 74 20 74 68 65 20 74 79 70 65 20 61  ) but the type a
2d920 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66  nd collation inf
2d930 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69  ormation was omi
2d940 74 74 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20  tted.** at that 
2d950 70 6f 69 6e 74 20 62 65 63 61 75 73 65 20 69 64  point because id
2d960 65 6e 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f  entifiers had no
2d970 74 20 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c  t yet been resol
2d980 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ved.  This.** ro
2d990 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2d9a0 61 66 74 65 72 20 69 64 65 6e 74 69 66 69 65 72  after identifier
2d9b0 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a   resolution..*/.
2d9c0 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
2d9d0 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70  ctAddSubqueryTyp
2d9e0 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57  eInfo(Walker *pW
2d9f0 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
2da00 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
2da10 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53  se;.  int i;.  S
2da20 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
2da30 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
2da40 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a  st_item *pFrom;.
2da50 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65  .  assert( p->se
2da60 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f  lFlags & SF_Reso
2da70 6c 76 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d  lved );.  if( p-
2da80 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48  >selFlags & SF_H
2da90 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74  asTypeInfo ) ret
2daa0 75 72 6e 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  urn;.  p->selFla
2dab0 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65  gs |= SF_HasType
2dac0 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d  Info;.  pParse =
2dad0 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
2dae0 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
2daf0 2d 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d  ->pSrc;.  for(i=
2db00 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
2db10 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
2db20 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
2db30 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  om++){.    Table
2db40 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
2db50 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74  pTab;.    assert
2db60 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ( pTab!=0 );.   
2db70 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46   if( (pTab->tabF
2db80 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
2db90 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ral)!=0 ){.     
2dba0 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
2dbb0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2dbc0 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
2dbd0 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  /.      Select *
2dbe0 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
2dbf0 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66 28  elect;.      if(
2dc00 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20   pSel ){.       
2dc10 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50   while( pSel->pP
2dc20 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53  rior ) pSel = pS
2dc30 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  el->pPrior;.    
2dc40 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
2dc50 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e  tAddColumnTypeAn
2dc60 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73  dCollation(pPars
2dc70 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a  e, pTab, pSel);.
2dc80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2dc90 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
2dca0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2dcb0 61 64 64 73 20 64 61 74 61 74 79 70 65 20 61 6e  adds datatype an
2dcc0 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
2dcd0 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ence information
2dce0 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65   to.** the Table
2dcf0 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 61   structures of a
2dd00 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ll FROM-clause s
2dd10 75 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a  ubqueries in a.*
2dd20 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
2dd30 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  nt..**.** Use th
2dd40 69 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72  is routine after
2dd50 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
2dd60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2dd70 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
2dd80 64 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20  dTypeInfo(Parse 
2dd90 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
2dda0 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64  *pSelect){.#ifnd
2ddb0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
2ddc0 55 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72  UBQUERY.  Walker
2ddd0 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43   w;.  w.xSelectC
2dde0 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
2ddf0 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b  3SelectWalkNoop;
2de00 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
2de10 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 41 64  back2 = selectAd
2de20 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66  dSubqueryTypeInf
2de30 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  o;.  w.xExprCall
2de40 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78  back = sqlite3Ex
2de50 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e  prWalkNoop;.  w.
2de60 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
2de70 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  .  sqlite3WalkSe
2de80 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74  lect(&w, pSelect
2de90 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  );.#endif.}.../*
2dea0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2deb0 20 73 65 74 73 20 75 70 20 61 20 53 45 4c 45 43   sets up a SELEC
2dec0 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  T statement for 
2ded0 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65  processing.  The
2dee0 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  .** following is
2def0 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a   accomplished:.*
2df00 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45  *.**     *  VDBE
2df10 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   Cursor numbers 
2df20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20  are assigned to 
2df30 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
2df40 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20  terms..**     * 
2df50 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65   Ephemeral Table
2df60 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65   objects are cre
2df70 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f  ated for all FRO
2df80 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
2df90 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f  ies..**     *  O
2dfa0 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
2dfb0 73 65 73 20 61 72 65 20 73 68 69 66 74 65 64 20  ses are shifted 
2dfc0 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74 65  into WHERE state
2dfd0 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20  ments.**     *  
2dfe0 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e  Wildcards "*" an
2dff0 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72  d "TABLE.*" in r
2e000 65 73 75 6c 74 20 73 65 74 73 20 61 72 65 20 65  esult sets are e
2e010 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20  xpanded..**     
2e020 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73 20 69  *  Identifiers i
2e030 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65  n expression are
2e040 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c   matched to tabl
2e050 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
2e060 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65 63 75  outine acts recu
2e070 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73  rsively on all s
2e080 75 62 71 75 65 72 69 65 73 20 77 69 74 68 69 6e  ubqueries within
2e090 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a   the SELECT..*/.
2e0a0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
2e0b0 63 74 50 72 65 70 28 0a 20 20 50 61 72 73 65 20  ctPrep(.  Parse 
2e0c0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
2e0d0 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
2e0e0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
2e0f0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
2e100 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
2e110 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
2e120 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d   coded. */.  Nam
2e130 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72  eContext *pOuter
2e140 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74  NC  /* Name cont
2e150 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65  ext for containe
2e160 72 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  r */.){.  assert
2e170 28 20 70 21 3d 30 20 7c 7c 20 70 50 61 72 73 65  ( p!=0 || pParse
2e180 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
2e190 65 64 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72  ed );.  if( pPar
2e1a0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
2e1b0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
2e1c0 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
2e1d0 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66   & SF_HasTypeInf
2e1e0 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  o ) return;.  sq
2e1f0 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
2e200 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  d(pParse, p);.  
2e210 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
2e220 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
2e230 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
2e240 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
2e250 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d  ResolveSelectNam
2e260 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f  es(pParse, p, pO
2e270 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70  uterNC);.  if( p
2e280 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70  Parse->nErr || p
2e290 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
2e2a0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
2e2b0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
2e2c0 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61  tAddTypeInfo(pPa
2e2d0 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rse, p);.}../*.*
2e2e0 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72  * Reset the aggr
2e2f0 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
2e300 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67  r..**.** The agg
2e310 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
2e320 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d  or is a set of m
2e330 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74  emory cells that
2e340 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65   hold.** interme
2e350 64 69 61 74 65 20 72 65 73 75 6c 74 73 20 77 68  diate results wh
2e360 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20  ile calculating 
2e370 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54  an aggregate.  T
2e380 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  his.** routine g
2e390 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68  enerates code th
2e3a0 61 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20  at stores NULLs 
2e3b0 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20  in all of those 
2e3c0 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e  memory.** cells.
2e3d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2e3e0 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
2e3f0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2e400 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
2e410 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
2e420 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
2e430 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
2e440 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
2e450 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67  Func;.  int nReg
2e460 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   = pAggInfo->nFu
2e470 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  nc + pAggInfo->n
2e480 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52  Column;.  if( nR
2e490 65 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  eg==0 ) return;.
2e4a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2e4b0 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  BUG.  /* Verify 
2e4c0 74 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f  that all AggInfo
2e4d0 20 72 65 67 69 73 74 65 72 73 20 61 72 65 20 77   registers are w
2e4e0 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20  ithin the range 
2e4f0 73 70 65 63 69 66 69 65 64 20 62 79 0a 20 20 2a  specified by.  *
2e500 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e  * AggInfo.mnReg.
2e510 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a  .AggInfo.mxReg *
2e520 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 67  /.  assert( nReg
2e530 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  ==pAggInfo->mxRe
2e540 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  g-pAggInfo->mnRe
2e550 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  g+1 );.  for(i=0
2e560 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; i<pAggInfo->nC
2e570 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
2e580 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66   assert( pAggInf
2e590 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e  o->aCol[i].iMem>
2e5a0 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67  =pAggInfo->mnReg
2e5b0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67  .         && pAg
2e5c0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  gInfo->aCol[i].i
2e5d0 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem<=pAggInfo->m
2e5e0 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f  xReg );.  }.  fo
2e5f0 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
2e600 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a  o->nFunc; i++){.
2e610 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67      assert( pAgg
2e620 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69  Info->aFunc[i].i
2e630 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem>=pAggInfo->m
2e640 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26  nReg.         &&
2e650 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
2e660 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e  [i].iMem<=pAggIn
2e670 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d  fo->mxReg );.  }
2e680 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
2e690 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2e6a0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49  P_Null, 0, pAggI
2e6b0 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67  nfo->mnReg, pAgg
2e6c0 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20  Info->mxReg);.  
2e6d0 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e  for(pFunc=pAggIn
2e6e0 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20  fo->aFunc, i=0; 
2e6f0 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
2e700 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29  c; i++, pFunc++)
2e710 7b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d  {.    if( pFunc-
2e720 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b  >iDistinct>=0 ){
2e730 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20  .      Expr *pE 
2e740 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a  = pFunc->pExpr;.
2e750 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
2e760 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2e770 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  E, EP_xIsSelect)
2e780 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
2e790 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  ->x.pList==0 || 
2e7a0 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pE->x.pList->nEx
2e7b0 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  pr!=1 ){.       
2e7c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2e7d0 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e  (pParse, "DISTIN
2e7e0 43 54 20 61 67 67 72 65 67 61 74 65 73 20 6d 75  CT aggregates mu
2e7f0 73 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20  st have exactly 
2e800 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  one ".          
2e810 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20   "argument");.  
2e820 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69        pFunc->iDi
2e830 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
2e840 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e850 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
2e860 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
2e870 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
2e880 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70  (pParse, pE->x.p
2e890 4c 69 73 74 2c 30 2c 30 29 3b 0a 20 20 20 20 20  List,0,0);.     
2e8a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2e8b0 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
2e8c0 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d  phemeral, pFunc-
2e8d0 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30  >iDistinct, 0, 0
2e8e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2e8f0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
2e900 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
2e910 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
2e920 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
2e930 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
2e940 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f  OP_AggFinalize o
2e950 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  pcode for every 
2e960 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
2e970 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67  on.** in the Agg
2e980 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  Info structure..
2e990 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
2e9a0 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
2e9b0 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ons(Parse *pPars
2e9c0 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
2e9d0 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
2e9e0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
2e9f0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
2ea00 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
2ea10 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   *pF;.  for(i=0,
2ea20 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46   pF=pAggInfo->aF
2ea30 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  unc; i<pAggInfo-
2ea40 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b  >nFunc; i++, pF+
2ea50 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  +){.    ExprList
2ea60 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45   *pList = pF->pE
2ea70 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
2ea80 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2ea90 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70  asProperty(pF->p
2eaa0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
2eab0 63 74 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ct) );.    sqlit
2eac0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2ead0 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d  OP_AggFinal, pF-
2eae0 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70  >iMem, pList ? p
2eaf0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29  List->nExpr : 0)
2eb00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2eb10 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46 2d  eAppendP4(v, pF-
2eb20 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
2eb30 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  EF);.  }.}.../*.
2eb40 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63  ** Update the ac
2eb50 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79  cumulator memory
2eb60 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67   cells for an ag
2eb70 67 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e  gregate based on
2eb80 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
2eb90 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
2eba0 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 41 63 63  .**.** If regAcc
2ebb0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64   is non-zero and
2ebc0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 69   there are no mi
2ebd0 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 61 67 67  n() or max() agg
2ebe0 72 65 67 61 74 65 73 0a 2a 2a 20 69 6e 20 70 41  regates.** in pA
2ebf0 67 67 49 6e 66 6f 2c 20 74 68 65 6e 20 6f 6e 6c  ggInfo, then onl
2ec00 79 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 70  y populate the p
2ec10 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75  AggInfo->nAccumu
2ec20 6c 61 74 6f 72 20 61 63 63 75 6d 75 6c 61 74 6f  lator accumulato
2ec30 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 69  r.** registers i
2ec40 20 72 65 67 69 73 74 65 72 20 72 65 67 41 63 63   register regAcc
2ec50 20 63 6f 6e 74 61 69 6e 73 20 30 2e 20 54 68 65   contains 0. The
2ec60 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 61 6b   caller will tak
2ec70 65 20 63 61 72 65 0a 2a 2a 20 6f 66 20 73 65 74  e care.** of set
2ec80 74 69 6e 67 20 61 6e 64 20 63 6c 65 61 72 69 6e  ting and clearin
2ec90 67 20 72 65 67 41 63 63 2e 0a 2a 2f 0a 73 74 61  g regAcc..*/.sta
2eca0 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41  tic void updateA
2ecb0 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
2ecc0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 72 65   *pParse, int re
2ecd0 67 41 63 63 2c 20 41 67 67 49 6e 66 6f 20 2a 70  gAcc, AggInfo *p
2ece0 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
2ecf0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
2ed00 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
2ed10 69 6e 74 20 72 65 67 48 69 74 20 3d 20 30 3b 0a  int regHit = 0;.
2ed20 20 20 69 6e 74 20 61 64 64 72 48 69 74 54 65 73    int addrHitTes
2ed30 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20  t = 0;.  struct 
2ed40 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
2ed50 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
2ed60 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70  fo_col *pC;..  p
2ed70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
2ed80 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69  ode = 1;.  for(i
2ed90 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d  =0, pF=pAggInfo-
2eda0 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e  >aFunc; i<pAggIn
2edb0 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
2edc0 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e  pF++){.    int n
2edd0 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64  Arg;.    int add
2ede0 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69  rNext = 0;.    i
2edf0 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45  nt regAgg;.    E
2ee00 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
2ee10 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c   pF->pExpr->x.pL
2ee20 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ist;.    assert(
2ee30 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2ee40 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f  y(pF->pExpr, EP_
2ee50 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
2ee60 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
2ee70 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73       nArg = pLis
2ee80 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
2ee90 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33  regAgg = sqlite3
2eea0 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
2eeb0 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  rse, nArg);.    
2eec0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
2eed0 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
2eee0 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c  , pList, regAgg,
2eef0 20 30 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f   0, SQLITE_ECEL_
2ef00 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  DUP);.    }else{
2ef10 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b  .      nArg = 0;
2ef20 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20  .      regAgg = 
2ef30 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
2ef40 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d   pF->iDistinct>=
2ef50 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e  0 ){.      addrN
2ef60 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ext = sqlite3Vdb
2ef70 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
2ef80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
2ef90 41 72 67 3d 3d 30 20 29 3b 20 20 2f 2a 20 45 72  Arg==0 );  /* Er
2efa0 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f  ror condition */
2efb0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2efc0 20 6e 41 72 67 3e 31 20 29 3b 20 20 20 2f 2a 20   nArg>1 );   /* 
2efd0 41 6c 73 6f 20 61 6e 20 65 72 72 6f 72 20 2a 2f  Also an error */
2efe0 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69  .      codeDisti
2eff0 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e  nct(pParse, pF->
2f000 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e  iDistinct, addrN
2f010 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b  ext, 1, regAgg);
2f020 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2f030 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c  F->pFunc->funcFl
2f040 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
2f050 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20  C_NEEDCOLL ){.  
2f060 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
2f070 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74  ll = 0;.      st
2f080 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
2f090 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
2f0a0 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73   int j;.      as
2f0b0 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
2f0c0 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69  ;  /* pList!=0 i
2f0d0 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20  f pF->pFunc has 
2f0e0 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20  NEEDCOLL */.    
2f0f0 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d    for(j=0, pItem
2f100 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c  =pList->a; !pCol
2f110 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b  l && j<nArg; j++
2f120 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
2f130 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
2f140 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
2f150 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45  Parse, pItem->pE
2f160 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
2f170 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
2f180 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
2f190 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44  = pParse->db->pD
2f1a0 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  fltColl;.      }
2f1b0 0a 20 20 20 20 20 20 69 66 28 20 72 65 67 48 69  .      if( regHi
2f1c0 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66 6f  t==0 && pAggInfo
2f1d0 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 29  ->nAccumulator )
2f1e0 20 72 65 67 48 69 74 20 3d 20 2b 2b 70 50 61 72   regHit = ++pPar
2f1f0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2f200 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2f210 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c  4(v, OP_CollSeq,
2f220 20 72 65 67 48 69 74 2c 20 30 2c 20 30 2c 20 28   regHit, 0, 0, (
2f230 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34  char *)pColl, P4
2f240 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d  _COLLSEQ);.    }
2f250 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2f260 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67  AddOp3(v, OP_Agg
2f270 53 74 65 70 2c 20 30 2c 20 72 65 67 41 67 67 2c  Step, 0, regAgg,
2f280 20 70 46 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20   pF->iMem);.    
2f290 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
2f2a0 64 50 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63  dP4(v, pF->pFunc
2f2b0 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
2f2c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2f2d0 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41  angeP5(v, (u8)nA
2f2e0 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
2f2f0 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
2f300 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c  (pParse, regAgg,
2f310 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20   nArg);.    if( 
2f320 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20  addrNext ){.    
2f330 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
2f340 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
2f350 72 4e 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20  rNext);.    }.  
2f360 7d 0a 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d  }.  if( regHit==
2f370 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  0 && pAggInfo->n
2f380 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 7b 0a 20  Accumulator ){. 
2f390 20 20 20 72 65 67 48 69 74 20 3d 20 72 65 67 41     regHit = regA
2f3a0 63 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65  cc;.  }.  if( re
2f3b0 67 48 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72  gHit ){.    addr
2f3c0 48 69 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65  HitTest = sqlite
2f3d0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2f3e0 50 5f 49 66 2c 20 72 65 67 48 69 74 29 3b 20 56  P_If, regHit); V
2f3f0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2f400 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70    }.  for(i=0, p
2f410 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  C=pAggInfo->aCol
2f420 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41  ; i<pAggInfo->nA
2f430 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c  ccumulator; i++,
2f440 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   pC++){.    sqli
2f450 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
2f460 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70  se, pC->pExpr, p
2f470 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  C->iMem);.  }.  
2f480 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
2f490 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Mode = 0;.  if( 
2f4a0 61 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a 20  addrHitTest ){. 
2f4b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2f4c0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 48 69  mpHere(v, addrHi
2f4d0 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  tTest);.  }.}../
2f4e0 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c  *.** Add a singl
2f4f0 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73  e OP_Explain ins
2f500 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  truction to the 
2f510 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20  VDBE to explain 
2f520 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e  a simple.** coun
2f530 74 28 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c  t(*) query ("SEL
2f540 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
2f550 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66  M pTab")..*/.#if
2f560 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2f570 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20  _EXPLAIN.static 
2f580 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70  void explainSimp
2f590 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65  leCount(.  Parse
2f5a0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2f5b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2f5c0 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
2f5d0 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
2f5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f5f0 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20   /* Table being 
2f600 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64  queried */.  Ind
2f610 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
2f620 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f630 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70  Index used to op
2f640 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20  timize scan, or 
2f650 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  NULL */.){.  if(
2f660 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
2f670 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  ==2 ){.    int b
2f680 43 6f 76 65 72 20 3d 20 28 70 49 64 78 21 3d 30  Cover = (pIdx!=0
2f690 20 26 26 20 28 48 61 73 52 6f 77 69 64 28 70 54   && (HasRowid(pT
2f6a0 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61 72  ab) || !IsPrimar
2f6b0 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 29  yKeyIndex(pIdx))
2f6c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2f6d0 62 65 45 78 70 6c 61 69 6e 28 70 50 61 72 73 65  beExplain(pParse
2f6e0 2c 20 30 2c 20 22 53 43 41 4e 20 54 41 42 4c 45  , 0, "SCAN TABLE
2f6f0 20 25 73 25 73 25 73 22 2c 0a 20 20 20 20 20 20   %s%s%s",.      
2f700 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20    pTab->zName,. 
2f710 20 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20         bCover ? 
2f720 22 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47  " USING COVERING
2f730 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20   INDEX " : "",. 
2f740 20 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20         bCover ? 
2f750 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22  pIdx->zName : ""
2f760 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65  .    );.  }.}.#e
2f770 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70  lse.# define exp
2f780 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28  lainSimpleCount(
2f790 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f  a,b,c).#endif../
2f7a0 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c 6b  *.** sqlite3Walk
2f7b0 45 78 70 72 28 29 20 63 61 6c 6c 62 61 63 6b 20  Expr() callback 
2f7c0 75 73 65 64 20 62 79 20 68 61 76 69 6e 67 54 6f  used by havingTo
2f7d0 57 68 65 72 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  Where()..**.** I
2f7e0 66 20 74 68 65 20 6e 6f 64 65 20 70 61 73 73 65  f the node passe
2f7f0 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  d to the callbac
2f800 6b 20 69 73 20 61 20 54 4b 5f 41 4e 44 20 6e 6f  k is a TK_AND no
2f810 64 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 57  de, return .** W
2f820 52 43 5f 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74  RC_Continue to t
2f830 65 6c 6c 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ell sqlite3WalkE
2f840 78 70 72 28 29 20 74 6f 20 69 74 65 72 61 74 65  xpr() to iterate
2f850 20 74 68 72 6f 75 67 68 20 63 68 69 6c 64 20 6e   through child n
2f860 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  odes..**.** Othe
2f870 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 57 52  rwise, return WR
2f880 43 5f 50 72 75 6e 65 2e 20 49 6e 20 74 68 69 73  C_Prune. In this
2f890 20 63 61 73 65 2c 20 61 6c 73 6f 20 63 68 65 63   case, also chec
2f8a0 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20 73 75 62  k if the .** sub
2f8b0 2d 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 74 63  -expression matc
2f8c0 68 65 73 20 74 68 65 20 63 72 69 74 65 72 69 61  hes the criteria
2f8d0 20 66 6f 72 20 62 65 69 6e 67 20 6d 6f 76 65 64   for being moved
2f8e0 20 74 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a   to the WHERE.**
2f8f0 20 63 6c 61 75 73 65 2e 20 49 66 20 73 6f 2c 20   clause. If so, 
2f900 61 64 64 20 69 74 20 74 6f 20 74 68 65 20 57 48  add it to the WH
2f910 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64 20 72  ERE clause and r
2f920 65 70 6c 61 63 65 20 74 68 65 20 73 75 62 2d 65  eplace the sub-e
2f930 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 77 69 74  xpression.** wit
2f940 68 69 6e 20 74 68 65 20 48 41 56 49 4e 47 20 65  hin the HAVING e
2f950 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 61  xpression with a
2f960 20 63 6f 6e 73 74 61 6e 74 20 22 31 22 2e 0a 2a   constant "1"..*
2f970 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 76  /.static int hav
2f980 69 6e 67 54 6f 57 68 65 72 65 45 78 70 72 43 62  ingToWhereExprCb
2f990 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2f9a0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
2f9b0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
2f9c0 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 53  =TK_AND ){.    S
2f9d0 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 57 61 6c  elect *pS = pWal
2f9e0 6b 65 72 2d 3e 75 2e 70 53 65 6c 65 63 74 3b 0a  ker->u.pSelect;.
2f9f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
2fa00 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47  xprIsConstantOrG
2fa10 72 6f 75 70 42 79 28 70 57 61 6c 6b 65 72 2d 3e  roupBy(pWalker->
2fa20 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70  pParse, pExpr, p
2fa30 53 2d 3e 70 47 72 6f 75 70 42 79 29 20 29 7b 0a  S->pGroupBy) ){.
2fa40 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
2fa50 62 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  b = pWalker->pPa
2fa60 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 45  rse->db;.      E
2fa70 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  xpr *pNew = sqli
2fa80 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
2fa90 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71   TK_INTEGER, &sq
2faa0 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31  lite3IntTokens[1
2fab0 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ], 0);.      if(
2fac0 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
2fad0 20 45 78 70 72 20 2a 70 57 68 65 72 65 20 3d 20   Expr *pWhere = 
2fae0 70 53 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20  pS->pWhere;.    
2faf0 20 20 20 20 53 57 41 50 28 45 78 70 72 2c 20 2a      SWAP(Expr, *
2fb00 70 4e 65 77 2c 20 2a 70 45 78 70 72 29 3b 0a 20  pNew, *pExpr);. 
2fb10 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
2fb20 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
2fb30 20 70 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a   pWhere, pNew);.
2fb40 20 20 20 20 20 20 20 20 70 53 2d 3e 70 57 68 65          pS->pWhe
2fb50 72 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  re = pNew;.     
2fb60 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
2fb70 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 1;.      }. 
2fb80 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
2fb90 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20  WRC_Prune;.  }. 
2fba0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2fbb0 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  inue;.}../*.** T
2fbc0 72 61 6e 73 66 65 72 20 65 6c 69 67 69 62 6c 65  ransfer eligible
2fbd0 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20   terms from the 
2fbe0 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 6f 66  HAVING clause of
2fbf0 20 61 20 71 75 65 72 79 2c 20 77 68 69 63 68 20   a query, which 
2fc00 69 73 0a 2a 2a 20 70 72 6f 63 65 73 73 65 64 20  is.** processed 
2fc10 61 66 74 65 72 20 67 72 6f 75 70 69 6e 67 2c 20  after grouping, 
2fc20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
2fc30 75 73 65 2c 20 77 68 69 63 68 20 69 73 20 70 72  use, which is pr
2fc40 6f 63 65 73 73 65 64 20 62 65 66 6f 72 65 0a 2a  ocessed before.*
2fc50 2a 20 67 72 6f 75 70 69 6e 67 2e 20 46 6f 72 20  * grouping. For 
2fc60 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 71 75 65  example, the que
2fc70 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  ry:.**.**   SELE
2fc80 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c 65  CT * FROM <table
2fc90 73 3e 20 57 48 45 52 45 20 61 3d 3f 20 47 52 4f  s> WHERE a=? GRO
2fca0 55 50 20 42 59 20 62 20 48 41 56 49 4e 47 20 62  UP BY b HAVING b
2fcb0 3d 3f 20 41 4e 44 20 63 3d 3f 0a 2a 2a 0a 2a 2a  =? AND c=?.**.**
2fcc0 20 63 61 6e 20 62 65 20 72 65 77 72 69 74 74 65   can be rewritte
2fcd0 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45  n as:.**.**   SE
2fce0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62  LECT * FROM <tab
2fcf0 6c 65 73 3e 20 57 48 45 52 45 20 61 3d 3f 20 41  les> WHERE a=? A
2fd00 4e 44 20 62 3d 3f 20 47 52 4f 55 50 20 42 59 20  ND b=? GROUP BY 
2fd10 62 20 48 41 56 49 4e 47 20 63 3d 3f 0a 2a 2a 0a  b HAVING c=?.**.
2fd20 2a 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65  ** A term of the
2fd30 20 48 41 56 49 4e 47 20 65 78 70 72 65 73 73 69   HAVING expressi
2fd40 6f 6e 20 69 73 20 65 6c 69 67 69 62 6c 65 20 66  on is eligible f
2fd50 6f 72 20 74 72 61 6e 73 66 65 72 20 69 66 20 69  or transfer if i
2fd60 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 65 6e  t consists.** en
2fd70 74 69 72 65 6c 79 20 6f 66 20 63 6f 6e 73 74 61  tirely of consta
2fd80 6e 74 73 20 61 6e 64 20 65 78 70 72 65 73 73 69  nts and expressi
2fd90 6f 6e 73 20 74 68 61 74 20 61 72 65 20 61 6c 73  ons that are als
2fda0 6f 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  o GROUP BY terms
2fdb0 20 74 68 61 74 0a 2a 2a 20 75 73 65 20 74 68 65   that.** use the
2fdc0 20 22 42 49 4e 41 52 59 22 20 63 6f 6c 6c 61 74   "BINARY" collat
2fdd0 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f  ion sequence..*/
2fde0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 61 76  .static void hav
2fdf0 69 6e 67 54 6f 57 68 65 72 65 28 50 61 72 73 65  ingToWhere(Parse
2fe00 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
2fe10 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 73   *p){.  Walker s
2fe20 57 61 6c 6b 65 72 3b 0a 20 20 6d 65 6d 73 65 74  Walker;.  memset
2fe30 28 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69  (&sWalker, 0, si
2fe40 7a 65 6f 66 28 73 57 61 6c 6b 65 72 29 29 3b 0a  zeof(sWalker));.
2fe50 20 20 73 57 61 6c 6b 65 72 2e 70 50 61 72 73 65    sWalker.pParse
2fe60 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 57 61   = pParse;.  sWa
2fe70 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61  lker.xExprCallba
2fe80 63 6b 20 3d 20 68 61 76 69 6e 67 54 6f 57 68 65  ck = havingToWhe
2fe90 72 65 45 78 70 72 43 62 3b 0a 20 20 73 57 61 6c  reExprCb;.  sWal
2fea0 6b 65 72 2e 75 2e 70 53 65 6c 65 63 74 20 3d 20  ker.u.pSelect = 
2feb0 70 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  p;.  sqlite3Walk
2fec0 45 78 70 72 28 26 73 57 61 6c 6b 65 72 2c 20 70  Expr(&sWalker, p
2fed0 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 23 69 66 20  ->pHaving);.#if 
2fee0 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
2fef0 4c 45 44 0a 20 20 69 66 28 20 73 57 61 6c 6b 65  LED.  if( sWalke
2ff00 72 2e 65 43 6f 64 65 20 26 26 20 28 73 71 6c 69  r.eCode && (sqli
2ff10 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
2ff20 20 30 78 31 30 30 29 21 3d 30 20 29 7b 0a 20 20   0x100)!=0 ){.  
2ff30 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
2ff40 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 4d  100,pParse,p,("M
2ff50 6f 76 65 20 48 41 56 49 4e 47 20 74 65 72 6d 73  ove HAVING terms
2ff60 20 69 6e 74 6f 20 57 48 45 52 45 3a 5c 6e 22 29   into WHERE:\n")
2ff70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
2ff80 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
2ff90 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
2ffa0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  f.}../*.** Check
2ffb0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 70   to see if the p
2ffc0 54 68 69 73 20 65 6e 74 72 79 20 6f 66 20 70 54  This entry of pT
2ffd0 61 62 4c 69 73 74 20 69 73 20 61 20 73 65 6c 66  abList is a self
2ffe0 2d 6a 6f 69 6e 20 6f 66 20 61 20 70 72 69 6f 72  -join of a prior
2fff0 20 76 69 65 77 2e 0a 2a 2a 20 49 66 20 69 74 20   view..** If it 
30000 69 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  is, then return 
30010 74 68 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  the SrcList_item
30020 20 66 6f 72 20 74 68 65 20 70 72 69 6f 72 20 76   for the prior v
30030 69 65 77 2e 20 20 49 66 20 69 74 20 69 73 20 6e  iew.  If it is n
30040 6f 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  ot,.** then retu
30050 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
30060 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
30070 74 65 6d 20 2a 69 73 53 65 6c 66 4a 6f 69 6e 56  tem *isSelfJoinV
30080 69 65 77 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  iew(.  SrcList *
30090 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20  pTabList,       
300a0 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
300b0 72 20 73 65 6c 66 2d 6a 6f 69 6e 73 20 69 6e 20  r self-joins in 
300c0 74 68 69 73 20 46 52 4f 4d 20 63 6c 61 75 73 65  this FROM clause
300d0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
300e0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 68 69 73  List_item *pThis
300f0 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
30100 20 70 72 69 6f 72 20 72 65 66 65 72 65 6e 63 65   prior reference
30110 20 74 6f 20 74 68 69 73 20 73 75 62 71 75 65 72   to this subquer
30120 79 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  y */.){.  struct
30130 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
30140 49 74 65 6d 3b 0a 20 20 66 6f 72 28 70 49 74 65  Item;.  for(pIte
30150 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b  m = pTabList->a;
30160 20 70 49 74 65 6d 3c 70 54 68 69 73 3b 20 70 49   pItem<pThis; pI
30170 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  tem++){.    if( 
30180 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d  pItem->pSelect==
30190 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
301a0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
301b0 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 20 63  viaCoroutine ) c
301c0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
301d0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pItem->zName==0
301e0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
301f0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
30200 69 63 6d 70 28 70 49 74 65 6d 2d 3e 7a 44 61 74  icmp(pItem->zDat
30210 61 62 61 73 65 2c 20 70 54 68 69 73 2d 3e 7a 44  abase, pThis->zD
30220 61 74 61 62 61 73 65 29 21 3d 30 20 29 20 63 6f  atabase)!=0 ) co
30230 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
30240 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
30250 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54  pItem->zName, pT
30260 68 69 73 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29  his->zName)!=0 )
30270 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
30280 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
30290 6d 70 61 72 65 28 30 2c 20 0a 20 20 20 20 20 20  mpare(0, .      
302a0 20 20 20 20 70 54 68 69 73 2d 3e 70 53 65 6c 65      pThis->pSele
302b0 63 74 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65  ct->pWhere, pIte
302c0 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 57 68 65  m->pSelect->pWhe
302d0 72 65 2c 20 2d 31 29 20 0a 20 20 20 20 29 7b 0a  re, -1) .    ){.
302e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 65        /* The vie
302f0 77 20 77 61 73 20 6d 6f 64 69 66 69 65 64 20 62  w was modified b
30300 79 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 74  y some other opt
30310 69 6d 69 7a 61 74 69 6f 6e 20 73 75 63 68 20 61  imization such a
30320 73 0a 20 20 20 20 20 20 2a 2a 20 70 75 73 68 44  s.      ** pushD
30330 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 29 20  ownWhereTerms() 
30340 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  */.      continu
30350 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  e;.    }.    ret
30360 75 72 6e 20 70 49 74 65 6d 3b 0a 20 20 7d 0a 20  urn pItem;.  }. 
30370 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69   return 0;.}..#i
30380 66 64 65 66 20 53 51 4c 49 54 45 5f 43 4f 55 4e  fdef SQLITE_COUN
30390 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41  TOFVIEW_OPTIMIZA
303a0 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  TION./*.** Attem
303b0 70 74 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20  pt to transform 
303c0 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66  a query of the f
303d0 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  orm.**.**    SEL
303e0 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
303f0 4d 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  M (SELECT x FROM
30400 20 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45   t1 UNION ALL SE
30410 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 32 29 0a  LECT y FROM t2).
30420 2a 2a 0a 2a 2a 20 49 6e 74 6f 20 74 68 69 73 3a  **.** Into this:
30430 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
30440 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   (SELECT count(*
30450 29 20 46 52 4f 4d 20 74 31 29 2b 28 53 45 4c 45  ) FROM t1)+(SELE
30460 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
30470 20 74 32 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74   t2).**.** The t
30480 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  ransformation on
30490 6c 79 20 77 6f 72 6b 73 20 69 66 20 61 6c 6c 20  ly works if all 
304a0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
304b0 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
304c0 20 20 20 2a 20 20 54 68 65 20 73 75 62 71 75 65     *  The subque
304d0 72 79 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c  ry is a UNION AL
304e0 4c 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  L of two or more
304f0 20 74 65 72 6d 73 0a 2a 2a 20 20 20 2a 20 20 54   terms.**   *  T
30500 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
30510 20 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49   not have a LIMI
30520 54 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 2a 20  T clause.**   * 
30530 20 54 68 65 72 65 20 69 73 20 6e 6f 20 57 48 45   There is no WHE
30540 52 45 20 6f 72 20 47 52 4f 55 50 20 42 59 20 6f  RE or GROUP BY o
30550 72 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73  r HAVING clauses
30560 20 6f 6e 20 74 68 65 20 73 75 62 71 75 65 72 69   on the subqueri
30570 65 73 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20 6f  es.**   *  The o
30580 75 74 65 72 20 71 75 65 72 79 20 69 73 20 61 20  uter query is a 
30590 73 69 6d 70 6c 65 20 63 6f 75 6e 74 28 2a 29 0a  simple count(*).
305a0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  **.** Return TRU
305b0 45 20 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  E if the optimiz
305c0 61 74 69 6f 6e 20 69 73 20 75 6e 64 65 72 74 61  ation is underta
305d0 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ken..*/.static i
305e0 6e 74 20 63 6f 75 6e 74 4f 66 56 69 65 77 4f 70  nt countOfViewOp
305f0 74 69 6d 69 7a 61 74 69 6f 6e 28 50 61 72 73 65  timization(Parse
30600 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
30610 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a   *p){.  Select *
30620 70 53 75 62 2c 20 2a 70 50 72 69 6f 72 3b 0a 20  pSub, *pPrior;. 
30630 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20   Expr *pExpr;.  
30640 45 78 70 72 20 2a 70 43 6f 75 6e 74 3b 0a 20 20  Expr *pCount;.  
30650 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
30660 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
30670 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 3d  & SF_Aggregate)=
30680 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
30690 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 61   /* This is an a
306a0 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 69 66  ggregate */.  if
306b0 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ( p->pEList->nEx
306c0 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
306d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
306e0 2f 2a 20 53 69 6e 67 6c 65 20 72 65 73 75 6c 74  /* Single result
306f0 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 70 45 78   column */.  pEx
30700 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
30710 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66  a[0].pExpr;.  if
30720 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
30730 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72  AGG_FUNCTION ) r
30740 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
30750 2f 2a 20 52 65 73 75 6c 74 20 69 73 20 61 6e 20  /* Result is an 
30760 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 69  aggregate */.  i
30770 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
30780 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
30790 65 6e 2c 22 63 6f 75 6e 74 22 29 20 29 20 72 65  en,"count") ) re
307a0 74 75 72 6e 20 30 3b 20 20 2f 2a 20 49 73 20 63  turn 0;  /* Is c
307b0 6f 75 6e 74 28 29 20 2a 2f 0a 20 20 69 66 28 20  ount() */.  if( 
307c0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d  pExpr->x.pList!=
307d0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
307e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
307f0 20 4d 75 73 74 20 62 65 20 63 6f 75 6e 74 28 2a   Must be count(*
30800 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 53  ) */.  if( p->pS
30810 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65  rc->nSrc!=1 ) re
30820 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
30830 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
30840 74 61 62 6c 65 20 69 6e 20 46 52 4f 4d 20 20 2a  table in FROM  *
30850 2f 0a 20 20 70 53 75 62 20 3d 20 70 2d 3e 70 53  /.  pSub = p->pS
30860 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
30870 3b 0a 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20  ;.  if( pSub==0 
30880 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
30890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
308a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
308b0 4d 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20  M is a subquery 
308c0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
308d0 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72  Prior==0 ) retur
308e0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
308f0 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62         /* Must b
30900 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 72 79 20  e a compound ry 
30910 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28  */.  do{.    if(
30920 20 70 53 75 62 2d 3e 6f 70 21 3d 54 4b 5f 41 4c   pSub->op!=TK_AL
30930 4c 20 26 26 20 70 53 75 62 2d 3e 70 50 72 69 6f  L && pSub->pPrio
30940 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  r ) return 0;  /
30950 2a 20 4d 75 73 74 20 62 65 20 55 4e 49 4f 4e 20  * Must be UNION 
30960 41 4c 4c 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ALL */.    if( p
30970 53 75 62 2d 3e 70 57 68 65 72 65 20 29 20 72 65  Sub->pWhere ) re
30980 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
30990 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
309a0 4e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  No WHERE clause 
309b0 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  */.    if( pSub-
309c0 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >pLimit ) return
309d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
309e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 4c           /* No L
309f0 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20  IMIT clause */. 
30a00 20 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c     if( pSub->sel
30a10 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
30a20 67 61 74 65 20 29 20 72 65 74 75 72 6e 20 30 3b  gate ) return 0;
30a30 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6e 20 61       /* Not an a
30a40 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 20 20  ggregate */.    
30a50 70 53 75 62 20 3d 20 70 53 75 62 2d 3e 70 50 72  pSub = pSub->pPr
30a60 69 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ior;            
30a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a80 20 20 2f 2a 20 52 65 70 65 61 74 20 6f 76 65 72    /* Repeat over
30a90 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 7d   compound */.  }
30aa0 77 68 69 6c 65 28 20 70 53 75 62 20 29 3b 0a 0a  while( pSub );..
30ab0 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
30ac0 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 6e   this point then
30ad0 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 70 65 72   it is OK to per
30ae0 66 6f 72 6d 20 74 68 65 20 74 72 61 6e 73 66 6f  form the transfo
30af0 72 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62  rmation */..  db
30b00 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
30b10 20 70 43 6f 75 6e 74 20 3d 20 70 45 78 70 72 3b   pCount = pExpr;
30b20 0a 20 20 70 45 78 70 72 20 3d 20 30 3b 0a 20 20  .  pExpr = 0;.  
30b30 70 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  pSub = p->pSrc->
30b40 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20  a[0].pSelect;.  
30b50 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
30b60 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 73 71 6c  elect = 0;.  sql
30b70 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
30b80 65 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a  e(db, p->pSrc);.
30b90 20 20 70 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69    p->pSrc = sqli
30ba0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
30bb0 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65  pParse->db, size
30bc0 6f 66 28 2a 70 2d 3e 70 53 72 63 29 29 3b 0a 20  of(*p->pSrc));. 
30bd0 20 77 68 69 6c 65 28 20 70 53 75 62 20 29 7b 0a   while( pSub ){.
30be0 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d 3b      Expr *pTerm;
30bf0 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 53  .    pPrior = pS
30c00 75 62 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  ub->pPrior;.    
30c10 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 3d 20 30  pSub->pPrior = 0
30c20 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4e 65 78  ;.    pSub->pNex
30c30 74 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 2d  t = 0;.    pSub-
30c40 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
30c50 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20 70  Aggregate;.    p
30c60 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d  Sub->selFlags &=
30c70 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20   ~SF_Compound;. 
30c80 20 20 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74     pSub->nSelect
30c90 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  Row = 0;.    sql
30ca0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
30cb0 74 65 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c  te(db, pSub->pEL
30cc0 69 73 74 29 3b 0a 20 20 20 20 70 54 65 72 6d 20  ist);.    pTerm 
30cd0 3d 20 70 50 72 69 6f 72 20 3f 20 73 71 6c 69 74  = pPrior ? sqlit
30ce0 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 43  e3ExprDup(db, pC
30cf0 6f 75 6e 74 2c 20 30 29 20 3a 20 70 43 6f 75 6e  ount, 0) : pCoun
30d00 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 45 4c  t;.    pSub->pEL
30d10 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
30d20 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
30d30 73 65 2c 20 30 2c 20 70 54 65 72 6d 29 3b 0a 20  se, 0, pTerm);. 
30d40 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74     pTerm = sqlit
30d50 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
30d60 54 4b 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 29  TK_SELECT, 0, 0)
30d70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 45 78  ;.    sqlite3PEx
30d80 70 72 41 64 64 53 65 6c 65 63 74 28 70 50 61 72  prAddSelect(pPar
30d90 73 65 2c 20 70 54 65 72 6d 2c 20 70 53 75 62 29  se, pTerm, pSub)
30da0 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 3d  ;.    if( pExpr=
30db0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  =0 ){.      pExp
30dc0 72 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d  r = pTerm;.    }
30dd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 45 78 70  else{.      pExp
30de0 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
30df0 28 70 50 61 72 73 65 2c 20 54 4b 5f 50 4c 55 53  (pParse, TK_PLUS
30e00 2c 20 70 54 65 72 6d 2c 20 70 45 78 70 72 29 3b  , pTerm, pExpr);
30e10 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 20  .    }.    pSub 
30e20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20  = pPrior;.  }.  
30e30 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
30e40 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
30e50 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
30e60 7e 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 0a  ~SF_Aggregate;..
30e70 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
30e80 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
30e90 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
30ea0 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20   & 0x400 ){.    
30eb0 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30  SELECTTRACE(0x40
30ec0 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74  0,pParse,p,("Aft
30ed0 65 72 20 63 6f 75 6e 74 2d 6f 66 2d 76 69 65 77  er count-of-view
30ee0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a 5c 6e   optimization:\n
30ef0 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
30f00 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
30f10 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , p, 0);.  }.#en
30f20 64 69 66 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  dif.  return 1;.
30f30 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
30f40 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f  TE_COUNTOFVIEW_O
30f50 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
30f60 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
30f70 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45  ode for the SELE
30f80 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76  CT statement giv
30f90 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67 75  en in the p argu
30fa0 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  ment.  .**.** Th
30fb0 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 72 65  e results are re
30fc0 74 75 72 6e 65 64 20 61 63 63 6f 72 64 69 6e 67  turned according
30fd0 20 74 6f 20 74 68 65 20 53 65 6c 65 63 74 44 65   to the SelectDe
30fe0 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  st structure..**
30ff0 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e   See comments in
31000 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 66 6f 72   sqliteInt.h for
31010 20 66 75 72 74 68 65 72 20 69 6e 66 6f 72 6d 61   further informa
31020 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
31030 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
31040 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
31050 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65  rrors.  If any e
31060 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63  rrors are.** enc
31070 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61  ountered, then a
31080 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
31090 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c  ror message is l
310a0 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65  eft in.** pParse
310b0 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a  ->zErrMsg..**.**
310c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
310d0 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20  es NOT free the 
310e0 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
310f0 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65   passed in.  The
31100 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  .** calling func
31110 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f  tion needs to do
31120 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71   that..*/.int sq
31130 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50  lite3Select(.  P
31140 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
31150 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
31160 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
31170 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
31180 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
31190 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
311a0 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a  being coded. */.
311b0 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
311c0 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68 61 74  est      /* What
311d0 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20   to do with the 
311e0 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
311f0 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
31200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31210 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
31220 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
31230 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74  Info;     /* Ret
31240 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  urn from sqlite3
31250 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a  WhereBegin() */.
31260 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
31270 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
31280 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
31290 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
312a0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67  on */.  int isAg
312b0 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
312c0 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63  * True for selec
312d0 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f  t lists like "co
312e0 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70  unt(*)" */.  Exp
312f0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20  rList *pEList = 
31300 30 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63  0;  /* List of c
31310 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63  olumns to extrac
31320 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  t. */.  SrcList 
31330 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f  *pTabList;     /
31340 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
31350 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20   to select from 
31360 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
31370 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
31380 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
31390 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
313a0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
313b0 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65  oupBy;    /* The
313c0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
313d0 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
313e0 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e  /.  Expr *pHavin
313f0 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  g;         /* Th
31400 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e  e HAVING clause.
31410 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
31420 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20  .  int rc = 1;  
31430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
31440 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f  ue to return fro
31450 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  m this function 
31460 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78  */.  DistinctCtx
31470 20 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a 20 49   sDistinct; /* I
31480 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f  nfo on how to co
31490 64 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  de the DISTINCT 
314a0 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 53 6f 72  keyword */.  Sor
314b0 74 43 74 78 20 73 53 6f 72 74 3b 20 20 20 20 20  tCtx sSort;     
314c0 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68      /* Info on h
314d0 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20 4f  ow to code the O
314e0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
314f0 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67  /.  AggInfo sAgg
31500 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e  Info;      /* In
31510 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62  formation used b
31520 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  y aggregate quer
31530 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e  ies */.  int iEn
31540 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
31550 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
31560 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65  e end of the que
31570 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ry */.  sqlite3 
31580 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f  *db;           /
31590 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
315a0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45  onnection */.  E
315b0 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78  xprList *pMinMax
315c0 4f 72 64 65 72 42 79 20 3d 20 30 3b 20 20 2f 2a  OrderBy = 0;  /*
315d0 20 41 64 64 65 64 20 4f 52 44 45 52 20 42 59 20   Added ORDER BY 
315e0 66 6f 72 20 6d 69 6e 2f 6d 61 78 20 71 75 65 72  for min/max quer
315f0 69 65 73 20 2a 2f 0a 20 20 75 38 20 6d 69 6e 4d  ies */.  u8 minM
31600 61 78 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20  axFlag;         
31610 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20          /* Flag 
31620 66 6f 72 20 6d 69 6e 2f 6d 61 78 20 71 75 65 72  for min/max quer
31630 69 65 73 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70  ies */..  db = p
31640 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d  Parse->db;.  v =
31650 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
31660 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 70  pParse);.  if( p
31670 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  ==0 || db->mallo
31680 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
31690 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72  e->nErr ){.    r
316a0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
316b0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
316c0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
316d0 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c  TE_SELECT, 0, 0,
316e0 20 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a   0) ) return 1;.
316f0 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e    memset(&sAggIn
31700 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41  fo, 0, sizeof(sA
31710 67 67 49 6e 66 6f 29 29 3b 0a 23 69 66 20 53 45  ggInfo));.#if SE
31720 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
31730 44 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28  D.  SELECTTRACE(
31740 31 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 62 65  1,pParse,p, ("be
31750 67 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 3a 5c  gin processing:\
31760 6e 22 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72  n", pParse->addr
31770 45 78 70 6c 61 69 6e 29 29 3b 0a 20 20 69 66 28  Explain));.  if(
31780 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
31790 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20  ace & 0x100 ){. 
317a0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
317b0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
317c0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
317d0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
317e0 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74  erBy==0 || pDest
317f0 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73  ->eDest!=SRT_Dis
31800 74 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72  tFifo );.  asser
31810 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
31820 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  0 || pDest->eDes
31830 74 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20  t!=SRT_Fifo );. 
31840 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
31850 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74  erBy==0 || pDest
31860 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73  ->eDest!=SRT_Dis
31870 74 51 75 65 75 65 20 29 3b 0a 20 20 61 73 73 65  tQueue );.  asse
31880 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
31890 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  =0 || pDest->eDe
318a0 73 74 21 3d 53 52 54 5f 51 75 65 75 65 20 29 3b  st!=SRT_Queue );
318b0 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65  .  if( Ignorable
318c0 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29  Orderby(pDest) )
318d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 44 65  {.    assert(pDe
318e0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
318f0 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e  xists || pDest->
31900 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e  eDest==SRT_Union
31910 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
31920 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
31930 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73  T_Except || pDes
31940 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  t->eDest==SRT_Di
31950 73 63 61 72 64 20 7c 7c 0a 20 20 20 20 20 20 20  scard ||.       
31960 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74      pDest->eDest
31970 3d 3d 53 52 54 5f 51 75 65 75 65 20 20 7c 7c 20  ==SRT_Queue  || 
31980 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
31990 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20 20  T_DistFifo ||.  
319a0 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
319b0 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51  eDest==SRT_DistQ
319c0 75 65 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e 65  ueue || pDest->e
319d0 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29 3b  Dest==SRT_Fifo);
319e0 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52  .    /* If ORDER
319f0 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66   BY makes no dif
31a00 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f  ference in the o
31a10 75 74 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68  utput then neith
31a20 65 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44  er does.    ** D
31a30 49 53 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61  ISTINCT so it ca
31a40 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f  n be removed too
31a50 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
31a60 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
31a70 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  b, p->pOrderBy);
31a80 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
31a90 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c   = 0;.    p->sel
31aa0 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73  Flags &= ~SF_Dis
31ab0 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c  tinct;.  }.  sql
31ac0 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70  ite3SelectPrep(p
31ad0 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20  Parse, p, 0);.  
31ae0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
31af0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
31b00 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
31b10 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
31b20 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45  .  assert( p->pE
31b30 4c 69 73 74 21 3d 30 20 29 3b 0a 23 69 66 20 53  List!=0 );.#if S
31b40 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
31b50 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
31b60 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
31b70 31 30 34 20 29 7b 0a 20 20 20 20 53 45 4c 45 43  104 ){.    SELEC
31b80 54 54 52 41 43 45 28 30 78 31 30 34 2c 70 50 61  TTRACE(0x104,pPa
31b90 72 73 65 2c 70 2c 20 28 22 61 66 74 65 72 20 6e  rse,p, ("after n
31ba0 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 3a 5c  ame resolution:\
31bb0 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n"));.    sqlite
31bc0 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
31bd0 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, p, 0);.  }.#e
31be0 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 44 65 73  ndif..  if( pDes
31bf0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t->eDest==SRT_Ou
31c00 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65  tput ){.    gene
31c10 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
31c20 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a  pParse, p);.  }.
31c30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
31c40 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a  OMIT_WINDOWFUNC.
31c50 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 69 6e    if( sqlite3Win
31c60 64 6f 77 52 65 77 72 69 74 65 28 70 50 61 72 73  dowRewrite(pPars
31c70 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 67 6f 74  e, p) ){.    got
31c80 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
31c90 7d 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  }.#if SELECTTRAC
31ca0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
31cb0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
31cc0 63 65 20 26 20 30 78 31 30 38 20 29 7b 0a 20 20  ce & 0x108 ){.  
31cd0 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
31ce0 31 30 34 2c 70 50 61 72 73 65 2c 70 2c 20 28 22  104,pParse,p, ("
31cf0 61 66 74 65 72 20 77 69 6e 64 6f 77 20 72 65 77  after window rew
31d00 72 69 74 65 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  rite:\n"));.    
31d10 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
31d20 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
31d30 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69    }.#endif.#endi
31d40 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
31d50 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20  _WINDOWFUNC */. 
31d60 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
31d70 53 72 63 3b 0a 20 20 69 73 41 67 67 20 3d 20 28  Src;.  isAgg = (
31d80 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
31d90 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a  _Aggregate)!=0;.
31da0 20 20 6d 65 6d 73 65 74 28 26 73 53 6f 72 74 2c    memset(&sSort,
31db0 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72 74   0, sizeof(sSort
31dc0 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64  ));.  sSort.pOrd
31dd0 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
31de0 42 79 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f  By;..  /* Try to
31df0 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a   various optimiz
31e00 61 74 69 6f 6e 73 20 28 66 6c 61 74 74 65 6e 69  ations (flatteni
31e10 6e 67 20 73 75 62 71 75 65 72 69 65 73 2c 20 61  ng subqueries, a
31e20 6e 64 20 73 74 72 65 6e 67 74 68 0a 20 20 2a 2a  nd strength.  **
31e30 20 72 65 64 75 63 74 69 6f 6e 20 6f 66 20 6a 6f   reduction of jo
31e40 69 6e 20 6f 70 65 72 61 74 6f 72 73 29 20 69 6e  in operators) in
31e50 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
31e60 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6d 61 69   up into the mai
31e70 6e 20 71 75 65 72 79 0a 20 20 2a 2f 0a 23 69 66  n query.  */.#if
31e80 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
31e90 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
31ea0 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
31eb0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20  TE_OMIT_VIEW).  
31ec0 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72  for(i=0; !p->pPr
31ed0 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73  ior && i<pTabLis
31ee0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
31ef0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
31f00 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
31f10 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b  &pTabList->a[i];
31f20 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75  .    Select *pSu
31f30 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  b = pItem->pSele
31f40 63 74 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  ct;.    Table *p
31f50 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61  Tab = pItem->pTa
31f60 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65  b;..    /* Conve
31f70 72 74 20 4c 45 46 54 20 4a 4f 49 4e 20 69 6e 74  rt LEFT JOIN int
31f80 6f 20 4a 4f 49 4e 20 69 66 20 74 68 65 72 65 20  o JOIN if there 
31f90 61 72 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  are terms of the
31fa0 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20 20 20   right table.   
31fb0 20 2a 2a 20 6f 66 20 74 68 65 20 4c 45 46 54 20   ** of the LEFT 
31fc0 4a 4f 49 4e 20 75 73 65 64 20 69 6e 20 74 68 65  JOIN used in the
31fd0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20   WHERE clause.. 
31fe0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
31ff0 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  Item->fg.jointyp
32000 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 0a  e & JT_LEFT)!=0.
32010 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45       && sqlite3E
32020 78 70 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c  xprImpliesNonNul
32030 6c 52 6f 77 28 70 2d 3e 70 57 68 65 72 65 2c 20  lRow(p->pWhere, 
32040 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 0a  pItem->iCursor).
32050 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61       && Optimiza
32060 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
32070 53 51 4c 49 54 45 5f 53 69 6d 70 6c 69 66 79 4a  SQLITE_SimplifyJ
32080 6f 69 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  oin).    ){.    
32090 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
320a0 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20  100,pParse,p,.  
320b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 22                ("
320c0 4c 45 46 54 2d 4a 4f 49 4e 20 73 69 6d 70 6c 69  LEFT-JOIN simpli
320d0 66 69 65 73 20 74 6f 20 4a 4f 49 4e 20 6f 6e 20  fies to JOIN on 
320e0 74 65 72 6d 20 25 64 5c 6e 22 2c 69 29 29 3b 0a  term %d\n",i));.
320f0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e        pItem->fg.
32100 6a 6f 69 6e 74 79 70 65 20 26 3d 20 7e 28 4a 54  jointype &= ~(JT
32110 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 29 3b  _LEFT|JT_OUTER);
32120 0a 20 20 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e  .      unsetJoin
32130 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20  Expr(p->pWhere, 
32140 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  pItem->iCursor);
32150 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e  .    }..    /* N
32160 6f 20 66 75 74 68 65 72 20 61 63 74 69 6f 6e 20  o futher action 
32170 69 66 20 74 68 69 73 20 74 65 72 6d 20 6f 66 20  if this term of 
32180 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
32190 69 73 20 6e 6f 20 61 20 73 75 62 71 75 65 72 79  is no a subquery
321a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62   */.    if( pSub
321b0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
321c0 0a 20 20 20 20 2f 2a 20 43 61 74 63 68 20 6d 69  .    /* Catch mi
321d0 73 6d 61 74 63 68 20 69 6e 20 74 68 65 20 64 65  smatch in the de
321e0 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 73 20 6f  clared columns o
321f0 66 20 61 20 76 69 65 77 20 61 6e 64 20 74 68 65  f a view and the
32200 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a   number of.    *
32210 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  * columns in the
32220 20 53 45 4c 45 43 54 20 6f 6e 20 74 68 65 20 52   SELECT on the R
32230 48 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54  HS */.    if( pT
32240 61 62 2d 3e 6e 43 6f 6c 21 3d 70 53 75 62 2d 3e  ab->nCol!=pSub->
32250 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
32260 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
32270 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
32280 65 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75  expected %d colu
32290 6d 6e 73 20 66 6f 72 20 27 25 73 27 20 62 75 74  mns for '%s' but
322a0 20 67 6f 74 20 25 64 22 2c 0a 20 20 20 20 20 20   got %d",.      
322b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
322c0 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62  pTab->nCol, pTab
322d0 2d 3e 7a 4e 61 6d 65 2c 20 70 53 75 62 2d 3e 70  ->zName, pSub->p
322e0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
322f0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
32300 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _end;.    }..   
32310 20 2f 2a 20 44 6f 20 6e 6f 74 20 74 72 79 20 74   /* Do not try t
32320 6f 20 66 6c 61 74 74 65 6e 20 61 6e 20 61 67 67  o flatten an agg
32330 72 65 67 61 74 65 20 73 75 62 71 75 65 72 79 2e  regate subquery.
32340 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
32350 6c 61 74 74 65 6e 69 6e 67 20 61 6e 20 61 67 67  lattening an agg
32360 72 65 67 61 74 65 20 73 75 62 71 75 65 72 79 20  regate subquery 
32370 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65  is only possible
32380 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   if the outer qu
32390 65 72 79 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f  ery.    ** is no
323a0 74 20 61 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69  t a join.  But i
323b0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
323c0 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2c  y is not a join,
323d0 20 74 68 65 6e 20 74 68 65 20 73 75 62 71 75 65   then the subque
323e0 72 79 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  ry.    ** will b
323f0 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  e implemented as
32400 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 61 6e   a co-routine an
32410 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 61 64  d there is no ad
32420 76 61 6e 74 61 67 65 20 74 6f 0a 20 20 20 20 2a  vantage to.    *
32430 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20  * flattening in 
32440 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20 20 2a  that case..    *
32450 2f 0a 20 20 20 20 69 66 28 20 28 70 53 75 62 2d  /.    if( (pSub-
32460 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
32470 67 67 72 65 67 61 74 65 29 21 3d 30 20 29 20 63  ggregate)!=0 ) c
32480 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
32490 65 72 74 28 20 70 53 75 62 2d 3e 70 47 72 6f 75  ert( pSub->pGrou
324a0 70 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f  pBy==0 );..    /
324b0 2a 20 49 66 20 74 68 65 20 6f 75 74 65 72 20 71  * If the outer q
324c0 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 61 20  uery contains a 
324d0 22 63 6f 6d 70 6c 65 78 22 20 72 65 73 75 6c 74  "complex" result
324e0 20 73 65 74 20 28 74 68 61 74 20 69 73 2c 0a 20   set (that is,. 
324f0 20 20 20 2a 2a 20 69 66 20 74 68 65 20 72 65 73     ** if the res
32500 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f  ult set of the o
32510 75 74 65 72 20 71 75 65 72 79 20 75 73 65 73 20  uter query uses 
32520 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 73 75 62  functions or sub
32530 71 75 65 72 69 65 73 29 0a 20 20 20 20 2a 2a 20  queries).    ** 
32540 61 6e 64 20 69 66 20 74 68 65 20 73 75 62 71 75  and if the subqu
32550 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  ery contains an 
32560 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
32570 61 6e 64 20 69 66 0a 20 20 20 20 2a 2a 20 69 74  and if.    ** it
32580 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 65 6d 65   will be impleme
32590 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75  nted as a co-rou
325a0 74 69 6e 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  tine, then do no
325b0 74 20 66 6c 61 74 74 65 6e 2e 20 20 54 68 69 73  t flatten.  This
325c0 0a 20 20 20 20 2a 2a 20 72 65 73 74 72 69 63 74  .    ** restrict
325d0 69 6f 6e 20 61 6c 6c 6f 77 73 20 53 51 4c 20 63  ion allows SQL c
325e0 6f 6e 73 74 72 75 63 74 73 20 6c 69 6b 65 20 74  onstructs like t
325f0 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  his:.    **.    
32600 2a 2a 20 20 53 45 4c 45 43 54 20 65 78 70 65 6e  **  SELECT expen
32610 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28 78 29  sive_function(x)
32620 0a 20 20 20 20 2a 2a 20 20 20 20 46 52 4f 4d 20  .    **    FROM 
32630 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74  (SELECT x FROM t
32640 61 62 20 4f 52 44 45 52 20 42 59 20 79 20 4c 49  ab ORDER BY y LI
32650 4d 49 54 20 31 30 29 3b 0a 20 20 20 20 2a 2a 0a  MIT 10);.    **.
32660 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70 65 6e      ** The expen
32670 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20  sive_function() 
32680 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 75 74 65 64  is only computed
32690 20 6f 6e 20 74 68 65 20 31 30 20 72 6f 77 73 20   on the 10 rows 
326a0 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 72 65 20  that.    ** are 
326b0 6f 75 74 70 75 74 2c 20 72 61 74 68 65 72 20 74  output, rather t
326c0 68 61 6e 20 65 76 65 72 79 20 72 6f 77 20 6f 66  han every row of
326d0 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20   the table..    
326e0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  **.    ** The re
326f0 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74  quirement that t
32700 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68  he outer query h
32710 61 76 65 20 61 20 63 6f 6d 70 6c 65 78 20 72 65  ave a complex re
32720 73 75 6c 74 20 73 65 74 0a 20 20 20 20 2a 2a 20  sult set.    ** 
32730 6d 65 61 6e 73 20 74 68 61 74 20 66 6c 61 74 74  means that flatt
32740 65 6e 69 6e 67 20 64 6f 65 73 20 6f 63 63 75 72  ening does occur
32750 20 6f 6e 20 73 69 6d 70 6c 65 72 20 53 51 4c 20   on simpler SQL 
32760 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 74 68  constraints with
32770 6f 75 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 65  out.    ** the e
32780 78 70 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f  xpensive_functio
32790 6e 28 29 20 6c 69 6b 65 3a 0a 20 20 20 20 2a 2a  n() like:.    **
327a0 0a 20 20 20 20 2a 2a 20 20 53 45 4c 45 43 54 20  .    **  SELECT 
327b0 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  x FROM (SELECT x
327c0 20 46 52 4f 4d 20 74 61 62 20 4f 52 44 45 52 20   FROM tab ORDER 
327d0 42 59 20 79 20 4c 49 4d 49 54 20 31 30 29 3b 0a  BY y LIMIT 10);.
327e0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
327f0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30  Sub->pOrderBy!=0
32800 0a 20 20 20 20 20 26 26 20 69 3d 3d 30 0a 20 20  .     && i==0.  
32810 20 20 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61     && (p->selFla
32820 67 73 20 26 20 53 46 5f 43 6f 6d 70 6c 65 78 52  gs & SF_ComplexR
32830 65 73 75 6c 74 29 21 3d 30 0a 20 20 20 20 20 26  esult)!=0.     &
32840 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  & (pTabList->nSr
32850 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 7c 7c  c==1.         ||
32860 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d   (pTabList->a[1]
32870 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54  .fg.jointype&(JT
32880 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29  _LEFT|JT_CROSS))
32890 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0).    ){.    
328a0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
328b0 7d 0a 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74  }..    if( flatt
328c0 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 73  enSubquery(pPars
328d0 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 29 20  e, p, i, isAgg) 
328e0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
328f0 20 73 75 62 71 75 65 72 79 20 63 61 6e 20 62 65   subquery can be
32900 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 69   absorbed into i
32910 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20  ts parent. */.  
32920 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20      i = -1;.    
32930 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d  }.    pTabList =
32940 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66   p->pSrc;.    if
32950 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
32960 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
32970 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 21 49  _end;.    if( !I
32980 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
32990 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pDest) ){.      
329a0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
329b0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
329c0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
329d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
329e0 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
329f0 45 43 54 0a 20 20 2f 2a 20 48 61 6e 64 6c 65 20  ECT.  /* Handle 
32a00 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
32a10 73 74 61 74 65 6d 65 6e 74 73 20 75 73 69 6e 67  statements using
32a20 20 74 68 65 20 73 65 70 61 72 61 74 65 20 6d 75   the separate mu
32a30 6c 74 69 53 65 6c 65 63 74 28 29 0a 20 20 2a 2a  ltiSelect().  **
32a40 20 70 72 6f 63 65 64 75 72 65 2e 0a 20 20 2a 2f   procedure..  */
32a50 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
32a60 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c   ){.    rc = mul
32a70 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  tiSelect(pParse,
32a80 20 70 2c 20 70 44 65 73 74 29 3b 0a 23 69 66 20   p, pDest);.#if 
32a90 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
32aa0 4c 45 44 0a 20 20 20 20 53 45 4c 45 43 54 54 52  LED.    SELECTTR
32ab0 41 43 45 28 30 78 31 2c 70 50 61 72 73 65 2c 70  ACE(0x1,pParse,p
32ac0 2c 28 22 65 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d  ,("end compound-
32ad0 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e  select processin
32ae0 67 5c 6e 22 29 29 3b 0a 20 20 20 20 69 66 28 20  g\n"));.    if( 
32af0 28 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72  (sqlite3SelectTr
32b00 61 63 65 20 26 20 30 78 32 30 30 30 29 21 3d 30  ace & 0x2000)!=0
32b10 20 26 26 20 45 78 70 6c 61 69 6e 51 75 65 72 79   && ExplainQuery
32b20 50 6c 61 6e 50 61 72 65 6e 74 28 70 50 61 72 73  PlanParent(pPars
32b30 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  e)==0 ){.      s
32b40 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
32b50 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
32b60 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
32b70 69 66 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20  if( p->pNext==0 
32b80 29 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c  ) ExplainQueryPl
32b90 61 6e 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  anPop(pParse);. 
32ba0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
32bb0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  }.#endif..  /* D
32bc0 6f 20 74 68 65 20 57 48 45 52 45 2d 63 6c 61 75  o the WHERE-clau
32bd0 73 65 20 63 6f 6e 73 74 61 6e 74 20 70 72 6f 70  se constant prop
32be0 61 67 61 74 69 6f 6e 20 6f 70 74 69 6d 69 7a 61  agation optimiza
32bf0 74 69 6f 6e 20 69 66 20 74 68 69 73 20 69 73 0a  tion if this is.
32c00 20 20 2a 2a 20 61 20 6a 6f 69 6e 2e 20 20 4e 6f    ** a join.  No
32c10 20 6e 65 65 64 20 74 6f 20 73 70 65 65 64 20 74   need to speed t
32c20 69 6d 65 20 6f 6e 20 74 68 69 73 20 6f 70 65 72  ime on this oper
32c30 61 74 69 6f 6e 20 66 6f 72 20 6e 6f 6e 2d 6a 6f  ation for non-jo
32c40 69 6e 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20  in queries.  ** 
32c50 61 73 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  as the equivalen
32c60 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77  t optimization w
32c70 69 6c 6c 20 62 65 20 68 61 6e 64 6c 65 64 20 62  ill be handled b
32c80 79 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20  y query planner 
32c90 69 6e 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 57  in.  ** sqlite3W
32ca0 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 20 20 2a  hereBegin()..  *
32cb0 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74  /.  if( pTabList
32cc0 2d 3e 6e 53 72 63 3e 31 0a 20 20 20 26 26 20 4f  ->nSrc>1.   && O
32cd0 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
32ce0 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 50 72  ed(db, SQLITE_Pr
32cf0 6f 70 61 67 61 74 65 43 6f 6e 73 74 29 0a 20 20  opagateConst).  
32d00 20 26 26 20 70 72 6f 70 61 67 61 74 65 43 6f 6e   && propagateCon
32d10 73 74 61 6e 74 73 28 70 50 61 72 73 65 2c 20 70  stants(pParse, p
32d20 29 0a 20 20 29 7b 0a 23 69 66 20 53 45 4c 45 43  ).  ){.#if SELEC
32d30 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
32d40 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
32d50 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
32d60 30 20 29 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  0 ){.      SELEC
32d70 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61  TTRACE(0x100,pPa
32d80 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 63 6f  rse,p,("After co
32d90 6e 73 74 61 6e 74 20 70 72 6f 70 61 67 61 74 69  nstant propagati
32da0 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  on:\n"));.      
32db0 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
32dc0 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
32dd0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
32de0 65 6c 73 65 7b 0a 20 20 20 20 53 45 4c 45 43 54  else{.    SELECT
32df0 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72  TRACE(0x100,pPar
32e00 73 65 2c 70 2c 28 22 43 6f 6e 73 74 61 6e 74 20  se,p,("Constant 
32e10 70 72 6f 70 61 67 61 74 69 6f 6e 20 6e 6f 74 20  propagation not 
32e20 68 65 6c 70 66 75 6c 5c 6e 22 29 29 3b 0a 20 20  helpful\n"));.  
32e30 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
32e40 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54  _COUNTOFVIEW_OPT
32e50 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  IMIZATION.  if( 
32e60 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
32e70 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51  led(db, SQLITE_Q
32e80 75 65 72 79 46 6c 61 74 74 65 6e 65 72 7c 53 51  ueryFlattener|SQ
32e90 4c 49 54 45 5f 43 6f 75 6e 74 4f 66 56 69 65 77  LITE_CountOfView
32ea0 29 0a 20 20 20 26 26 20 63 6f 75 6e 74 4f 66 56  ).   && countOfV
32eb0 69 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28  iewOptimization(
32ec0 70 50 61 72 73 65 2c 20 70 29 0a 20 20 29 7b 0a  pParse, p).  ){.
32ed0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
32ee0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
32ef0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
32f00 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
32f10 73 74 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74  st;.    pTabList
32f20 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 7d 0a   = p->pSrc;.  }.
32f30 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 6f 72  #endif..  /* For
32f40 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 74 68   each term in th
32f50 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 64  e FROM clause, d
32f60 6f 20 74 77 6f 20 74 68 69 6e 67 73 3a 0a 20 20  o two things:.  
32f70 2a 2a 20 28 31 29 20 41 75 74 68 6f 72 69 7a 65  ** (1) Authorize
32f80 64 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 74  d unreferenced t
32f90 61 62 6c 65 73 0a 20 20 2a 2a 20 28 32 29 20 47  ables.  ** (2) G
32fa0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
32fb0 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73   all sub-queries
32fc0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
32fd0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
32fe0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  c; i++){.    str
32ff0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
33000 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c   *pItem = &pTabL
33010 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53  ist->a[i];.    S
33020 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a  electDest dest;.
33030 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62      Select *pSub
33040 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
33050 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
33060 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
33070 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
33080 57 29 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  W).    const cha
33090 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e  r *zSavedAuthCon
330a0 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  text;.#endif..  
330b0 20 20 2f 2a 20 49 73 73 75 65 20 53 51 4c 49 54    /* Issue SQLIT
330c0 45 5f 52 45 41 44 20 61 75 74 68 6f 72 69 7a 61  E_READ authoriza
330d0 74 69 6f 6e 73 20 77 69 74 68 20 61 20 66 61 6b  tions with a fak
330e0 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 66 6f  e column name fo
330f0 72 20 61 6e 79 0a 20 20 20 20 2a 2a 20 74 61 62  r any.    ** tab
33100 6c 65 73 20 74 68 61 74 20 61 72 65 20 72 65 66  les that are ref
33110 65 72 65 6e 63 65 64 20 62 75 74 20 66 72 6f 6d  erenced but from
33120 20 77 68 69 63 68 20 6e 6f 20 76 61 6c 75 65 73   which no values
33130 20 61 72 65 20 65 78 74 72 61 63 74 65 64 2e 0a   are extracted..
33140 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 73 20      ** Examples 
33150 6f 66 20 77 68 65 72 65 20 74 68 65 73 65 20 6b  of where these k
33160 69 6e 64 73 20 6f 66 20 6e 75 6c 6c 20 53 51 4c  inds of null SQL
33170 49 54 45 5f 52 45 41 44 20 61 75 74 68 6f 72 69  ITE_READ authori
33180 7a 61 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 77  zations.    ** w
33190 6f 75 6c 64 20 6f 63 63 75 72 3a 0a 20 20 20 20  ould occur:.    
331a0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 45  **.    **     SE
331b0 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
331c0 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 53 51 4c 49  OM t1;   -- SQLI
331d0 54 45 5f 52 45 41 44 20 74 31 2e 22 22 0a 20 20  TE_READ t1."".  
331e0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
331f0 74 31 2e 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32  t1.* FROM t1, t2
33200 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45  ;   -- SQLITE_RE
33210 41 44 20 74 32 2e 22 22 0a 20 20 20 20 2a 2a 0a  AD t2."".    **.
33220 20 20 20 20 2a 2a 20 54 68 65 20 66 61 6b 65 20      ** The fake 
33230 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 61  column name is a
33240 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20  n empty string. 
33250 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
33260 66 6f 72 20 61 20 74 61 62 6c 65 20 74 6f 0a 20  for a table to. 
33270 20 20 20 2a 2a 20 68 61 76 65 20 61 20 63 6f 6c     ** have a col
33280 75 6d 6e 20 6e 61 6d 65 64 20 62 79 20 74 68 65  umn named by the
33290 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 69   empty string, i
332a0 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
332b0 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 0a  re is no way to.
332c0 20 20 20 20 2a 2a 20 64 69 73 74 69 6e 67 75 69      ** distingui
332d0 73 68 20 62 65 74 77 65 65 6e 20 61 6e 20 75 6e  sh between an un
332e0 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
332f0 20 61 6e 64 20 61 6e 20 61 63 74 75 61 6c 20 72   and an actual r
33300 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a  eference to the.
33310 20 20 20 20 2a 2a 20 22 22 20 63 6f 6c 75 6d 6e      ** "" column
33320 2e 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  . The original d
33330 65 73 69 67 6e 20 77 61 73 20 66 6f 72 20 74 68  esign was for th
33340 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61  e fake column na
33350 6d 65 20 74 6f 20 62 65 20 61 20 4e 55 4c 4c 2c  me to be a NULL,
33360 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77 6f  .    ** which wo
33370 75 6c 64 20 62 65 20 75 6e 61 6d 62 69 67 75 6f  uld be unambiguo
33380 75 73 2e 20 20 42 75 74 20 6c 65 67 61 63 79 20  us.  But legacy 
33390 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61  authorization ca
333a0 6c 6c 62 61 63 6b 73 20 6d 69 67 68 74 0a 20 20  llbacks might.  
333b0 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 65 20    ** assume the 
333c0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 6e  column name is n
333d0 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 73 65 67 66  on-NULL and segf
333e0 61 75 6c 74 2e 20 20 54 68 65 20 75 73 65 20 6f  ault.  The use o
333f0 66 20 61 6e 20 65 6d 70 74 79 0a 20 20 20 20 2a  f an empty.    *
33400 2a 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65  * string for the
33410 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d   fake column nam
33420 65 20 73 65 65 6d 73 20 73 61 66 65 72 2e 0a 20  e seems safer.. 
33430 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49     */.    if( pI
33440 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3d 3d 30 20  tem->colUsed==0 
33450 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
33460 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
33470 2c 20 53 51 4c 49 54 45 5f 52 45 41 44 2c 20 70  , SQLITE_READ, p
33480 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 22 22 2c  Item->zName, "",
33490 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
334a0 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21  e);.    }..#if !
334b0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
334c0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
334d0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
334e0 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 20 20  _OMIT_VIEW).    
334f0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
33500 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65   for all sub-que
33510 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
33520 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2f 0a 20   clause.    */. 
33530 20 20 20 70 53 75 62 20 3d 20 70 49 74 65 6d 2d     pSub = pItem-
33540 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 66  >pSelect;.    if
33550 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74  ( pSub==0 ) cont
33560 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f  inue;..    /* So
33570 6d 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64 65  metimes the code
33580 20 66 6f 72 20 61 20 73 75 62 71 75 65 72 79 20   for a subquery 
33590 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65  will be generate
335a0 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20  d more than.    
335b0 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65 20  ** once, if the 
335c0 73 75 62 71 75 65 72 79 20 69 73 20 70 61 72 74  subquery is part
335d0 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
335e0 61 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20 4a  ause in a LEFT J
335f0 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20  OIN,.    ** for 
33600 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61  example.  In tha
33610 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72  t case, do not r
33620 65 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f  egenerate the co
33630 64 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20  de to manifest. 
33640 20 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72 20     ** a view or 
33650 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74  the co-routine t
33660 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69  o implement a vi
33670 65 77 2e 20 20 54 68 65 20 66 69 72 73 74 20 69  ew.  The first i
33680 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69  nstance.    ** i
33690 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74 68  s sufficient, th
336a0 6f 75 67 68 20 74 68 65 20 73 75 62 72 6f 75 74  ough the subrout
336b0 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 20  ine to manifest 
336c0 74 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e 65  the view does ne
336d0 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20  ed.    ** to be 
336e0 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a  invoked again. *
336f0 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  /.    if( pItem-
33700 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a  >addrFillSub ){.
33710 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
33720 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
33730 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
33740 2a 20 54 68 65 20 73 75 62 72 6f 75 74 69 6e 65  * The subroutine
33750 20 74 68 61 74 20 6d 61 6e 69 66 65 73 74 73 20   that manifests 
33760 74 68 65 20 76 69 65 77 20 6d 69 67 68 74 20 62  the view might b
33770 65 20 61 20 6f 6e 65 2d 74 69 6d 65 20 72 6f 75  e a one-time rou
33780 74 69 6e 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  tine,.        **
33790 20 6f 72 20 69 74 20 6d 69 67 68 74 20 6e 65 65   or it might nee
337a0 64 20 74 6f 20 62 65 20 72 65 72 75 6e 20 6f 6e  d to be rerun on
337b0 20 65 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20   each iteration 
337c0 62 65 63 61 75 73 65 20 69 74 0a 20 20 20 20 20  because it.     
337d0 20 20 20 2a 2a 20 65 6e 63 6f 64 65 73 20 61 20     ** encodes a 
337e0 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75  correlated subqu
337f0 65 72 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ery. */.        
33800 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65  testcase( sqlite
33810 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 49  3VdbeGetOp(v, pI
33820 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
33830 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 6e  )->opcode==OP_On
33840 63 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ce );.        sq
33850 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
33860 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74  v, OP_Gosub, pIt
33870 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70  em->regReturn, p
33880 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
33890 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
338a0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
338b0 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d  }..    /* Increm
338c0 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68  ent Parse.nHeigh
338d0 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74 20  t by the height 
338e0 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65  of the largest e
338f0 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
33900 20 74 72 65 65 20 72 65 66 65 72 72 65 64 20 74   tree referred t
33910 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20 70  o by this, the p
33920 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68  arent select. Th
33930 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20  e child select. 
33940 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69     ** may contai
33950 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
33960 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20  es of at most.  
33970 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58    ** (SQLITE_MAX
33980 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73  _EXPR_DEPTH-Pars
33990 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67 68  e.nHeight) heigh
339a0 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69 74  t. This is a bit
339b0 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e  .    ** more con
339c0 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e  servative than n
339d0 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75  ecessary, but mu
339e0 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20 65  ch easier than e
339f0 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20  nforcing.    ** 
33a00 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a  an exact limit..
33a10 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73      */.    pPars
33a20 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71  e->nHeight += sq
33a30 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
33a40 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f  eight(p);..    /
33a50 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66  * Make copies of
33a60 20 63 6f 6e 73 74 61 6e 74 20 57 48 45 52 45 2d   constant WHERE-
33a70 63 6c 61 75 73 65 20 74 65 72 6d 73 20 69 6e 20  clause terms in 
33a80 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
33a90 64 6f 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73 69  down.    ** insi
33aa0 64 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  de the subquery.
33ab0 20 20 54 68 69 73 20 63 61 6e 20 68 65 6c 70 20    This can help 
33ac0 74 68 65 20 73 75 62 71 75 65 72 79 20 74 6f 20  the subquery to 
33ad0 72 75 6e 20 6d 6f 72 65 20 65 66 66 69 63 69 65  run more efficie
33ae0 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ntly..    */.   
33af0 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
33b00 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
33b10 49 54 45 5f 50 75 73 68 44 6f 77 6e 29 0a 20 20  ITE_PushDown).  
33b20 20 20 20 26 26 20 70 75 73 68 44 6f 77 6e 57 68     && pushDownWh
33b30 65 72 65 54 65 72 6d 73 28 70 50 61 72 73 65 2c  ereTerms(pParse,
33b40 20 70 53 75 62 2c 20 70 2d 3e 70 57 68 65 72 65   pSub, p->pWhere
33b50 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
33b60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
33b70 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 49               (pI
33b80 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  tem->fg.jointype
33b90 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 29   & JT_OUTER)!=0)
33ba0 0a 20 20 20 20 29 7b 0a 23 69 66 20 53 45 4c 45  .    ){.#if SELE
33bb0 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
33bc0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
33bd0 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
33be0 78 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x100 ){.        
33bf0 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30  SELECTTRACE(0x10
33c00 30 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20 20 20  0,pParse,p,.    
33c10 20 20 20 20 20 20 20 20 28 22 41 66 74 65 72 20          ("After 
33c20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 70 75 73  WHERE-clause pus
33c30 68 2d 64 6f 77 6e 20 69 6e 74 6f 20 73 75 62 71  h-down into subq
33c40 75 65 72 79 20 25 64 3a 5c 6e 22 2c 20 70 53 75  uery %d:\n", pSu
33c50 62 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20 20 20  b->selId));.    
33c60 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
33c70 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
33c80 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
33c90 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
33ca0 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
33cb0 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28  0x100,pParse,p,(
33cc0 22 50 75 73 68 2d 64 6f 77 6e 20 6e 6f 74 20 70  "Push-down not p
33cd0 6f 73 73 69 62 6c 65 5c 6e 22 29 29 3b 0a 20 20  ossible\n"));.  
33ce0 20 20 7d 0a 0a 20 20 20 20 7a 53 61 76 65 64 41    }..    zSavedA
33cf0 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61  uthContext = pPa
33d00 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
33d10 74 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 7a  t;.    pParse->z
33d20 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 49  AuthContext = pI
33d30 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 20  tem->zName;..   
33d40 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
33d50 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
33d60 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20  he subquery.    
33d70 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 75  **.    ** The su
33d80 62 71 75 65 72 79 20 69 73 20 69 6d 70 6c 65 6d  bquery is implem
33d90 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f  ented as a co-ro
33da0 75 74 69 6e 65 20 69 66 20 74 68 65 20 73 75 62  utine if the sub
33db0 71 75 65 72 79 20 69 73 0a 20 20 20 20 2a 2a 20  query is.    ** 
33dc0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
33dd0 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20   the outer loop 
33de0 28 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73  (so that it does
33df0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a   not need to be.
33e00 20 20 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20      ** computed 
33e10 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 29 0a  more than once).
33e20 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 4f      **.    ** TO
33e30 44 4f 3a 20 41 72 65 20 74 68 65 72 65 20 6f 74  DO: Are there ot
33e40 68 65 72 20 72 65 61 73 6f 6e 73 20 62 65 73 69  her reasons besi
33e50 64 65 20 28 31 29 20 74 6f 20 75 73 65 20 61 20  de (1) to use a 
33e60 63 6f 2d 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  co-routine.    *
33e70 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
33e80 3f 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ?.    */.    if(
33e90 20 69 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70   i==0.     && (p
33ea0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31  TabList->nSrc==1
33eb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
33ec0 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e  (pTabList->a[1].
33ed0 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f  fg.jointype&(JT_
33ee0 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21  LEFT|JT_CROSS))!
33ef0 3d 30 29 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20  =0)  /* (1) */. 
33f00 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49     ){.      /* I
33f10 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f  mplement a co-ro
33f20 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
33f30 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20  return a single 
33f40 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
33f50 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 6f  t.      ** set o
33f60 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f  n each invocatio
33f70 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
33f80 20 20 69 6e 74 20 61 64 64 72 54 6f 70 20 3d 20    int addrTop = 
33f90 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
33fa0 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a 20 20 20  ntAddr(v)+1;.   
33fb0 20 20 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e    .      pItem->
33fc0 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50  regReturn = ++pP
33fd0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
33fe0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
33ff0 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
34000 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e  routine, pItem->
34010 72 65 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64  regReturn, 0, ad
34020 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 56 64  drTop);.      Vd
34030 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
34040 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  s", pItem->pTab-
34050 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
34060 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
34070 75 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20  ub = addrTop;.  
34080 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
34090 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
340a0 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
340b0 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
340c0 29 3b 0a 20 20 20 20 20 20 45 78 70 6c 61 69 6e  );.      Explain
340d0 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
340e0 65 2c 20 31 2c 20 22 43 4f 2d 52 4f 55 54 49 4e  e, 1, "CO-ROUTIN
340f0 45 20 25 75 22 2c 20 70 53 75 62 2d 3e 73 65 6c  E %u", pSub->sel
34100 49 64 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Id));.      sqli
34110 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
34120 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a  , pSub, &dest);.
34130 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61        pItem->pTa
34140 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20  b->nRowLogEst = 
34150 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pSub->nSelectRow
34160 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66  ;.      pItem->f
34170 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d  g.viaCoroutine =
34180 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d   1;.      pItem-
34190 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73  >regResult = des
341a0 74 2e 69 53 64 73 74 3b 0a 20 20 20 20 20 20 73  t.iSdst;.      s
341b0 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72  qlite3VdbeEndCor
341c0 6f 75 74 69 6e 65 28 76 2c 20 70 49 74 65 6d 2d  outine(v, pItem-
341d0 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
341e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
341f0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f  mpHere(v, addrTo
34200 70 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  p-1);.      sqli
34210 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43  te3ClearTempRegC
34220 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20  ache(pParse);.  
34230 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
34240 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
34250 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
34260 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65  l fill an epheme
34270 72 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 20  ral table with. 
34280 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74       ** the cont
34290 65 6e 74 20 6f 66 20 74 68 69 73 20 73 75 62 71  ent of this subq
342a0 75 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64  uery.  pItem->ad
342b0 64 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70  drFillSub will p
342c0 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f  oint.      ** to
342d0 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
342e0 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 73 75  the generated su
342f0 62 72 6f 75 74 69 6e 65 2e 20 20 70 49 74 65 6d  broutine.  pItem
34300 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20 20 20 20  ->regReturn.    
34310 20 20 2a 2a 20 69 73 20 61 20 72 65 67 69 73 74    ** is a regist
34320 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  er allocated to 
34330 68 6f 6c 64 20 74 68 65 20 73 75 62 72 6f 75 74  hold the subrout
34340 69 6e 65 20 72 65 74 75 72 6e 20 61 64 64 72 65  ine return addre
34350 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ss.      */.    
34360 20 20 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20    int topAddr;. 
34370 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 41 64 64       int onceAdd
34380 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  r = 0;.      int
34390 20 72 65 74 41 64 64 72 3b 0a 20 20 20 20 20 20   retAddr;.      
343a0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
343b0 74 65 6d 20 2a 70 50 72 69 6f 72 3b 0a 0a 20 20  tem *pPrior;..  
343c0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
343d0 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d  m->addrFillSub==
343e0 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  0 );.      pItem
343f0 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  ->regReturn = ++
34400 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
34410 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73 71      topAddr = sq
34420 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
34430 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
34440 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
34450 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  rn);.      pItem
34460 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
34470 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20 20  topAddr+1;.     
34480 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69   if( pItem->fg.i
34490 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 29  sCorrelated==0 )
344a0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
344b0 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
344c0 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64 20 61  not correlated a
344d0 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  nd if we are not
344e0 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20 20   inside of.     
344f0 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2c     ** a trigger,
34500 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65   then we only ne
34510 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
34520 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  e value of the s
34530 75 62 71 75 65 72 79 0a 20 20 20 20 20 20 20 20  ubquery.        
34540 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20  ** once. */.    
34550 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20 73      onceAddr = s
34560 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
34570 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64  (v, OP_Once); Vd
34580 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
34590 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
345a0 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c  nt((v, "material
345b0 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74  ize \"%s\"", pIt
345c0 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
345d0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
345e0 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70          VdbeNoop
345f0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74  Comment((v, "mat
34600 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22  erialize \"%s\""
34610 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
34620 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Name));.      }.
34630 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 69        pPrior = i
34640 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28 70 54  sSelfJoinView(pT
34650 61 62 4c 69 73 74 2c 20 70 49 74 65 6d 29 3b 0a  abList, pItem);.
34660 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72        if( pPrior
34670 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
34680 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
34690 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 49 74   OP_OpenDup, pIt
346a0 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50 72  em->iCursor, pPr
346b0 69 6f 72 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  ior->iCursor);. 
346c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
346d0 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74 21 3d  Prior->pSelect!=
346e0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 53 75  0 );.        pSu
346f0 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  b->nSelectRow = 
34700 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74 2d  pPrior->pSelect-
34710 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
34720 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34730 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
34740 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
34750 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74  RT_EphemTab, pIt
34760 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
34770 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65        ExplainQue
34780 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
34790 31 2c 20 22 4d 41 54 45 52 49 41 4c 49 5a 45 20  1, "MATERIALIZE 
347a0 25 75 22 2c 20 70 53 75 62 2d 3e 73 65 6c 49 64  %u", pSub->selId
347b0 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ));.        sqli
347c0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
347d0 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a  , pSub, &dest);.
347e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
347f0 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c  tem->pTab->nRowL
34800 6f 67 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e 53  ogEst = pSub->nS
34810 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
34820 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29 20 73  if( onceAddr ) s
34830 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
34840 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72 29 3b  re(v, onceAddr);
34850 0a 20 20 20 20 20 20 72 65 74 41 64 64 72 20 3d  .      retAddr =
34860 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34870 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
34880 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
34890 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  n);.      VdbeCo
348a0 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 25  mment((v, "end %
348b0 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  s", pItem->pTab-
348c0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
348d0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
348e0 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72 2c 20  eP1(v, topAddr, 
348f0 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20 20 20  retAddr);.      
34900 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70  sqlite3ClearTemp
34910 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29  RegCache(pParse)
34920 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
34930 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
34940 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
34950 6e 64 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  nd;.    pParse->
34960 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74  nHeight -= sqlit
34970 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
34980 68 74 28 70 29 3b 0a 20 20 20 20 70 50 61 72 73  ht(p);.    pPars
34990 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
349a0 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74  = zSavedAuthCont
349b0 65 78 74 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  ext;.#endif.  }.
349c0 0a 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 65 6c  .  /* Various el
349d0 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 53 45  ements of the SE
349e0 4c 45 43 54 20 63 6f 70 69 65 64 20 69 6e 74 6f  LECT copied into
349f0 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73   local variables
34a00 20 66 6f 72 0a 20 20 2a 2a 20 63 6f 6e 76 65 6e   for.  ** conven
34a10 69 65 6e 63 65 20 2a 2f 0a 20 20 70 45 4c 69 73  ience */.  pELis
34a20 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
34a30 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
34a40 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20  ere;.  pGroupBy 
34a50 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
34a60 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48   pHaving = p->pH
34a70 61 76 69 6e 67 3b 0a 20 20 73 44 69 73 74 69 6e  aving;.  sDistin
34a80 63 74 2e 69 73 54 6e 63 74 20 3d 20 28 70 2d 3e  ct.isTnct = (p->
34a90 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
34aa0 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66  stinct)!=0;..#if
34ab0 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
34ac0 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
34ad0 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
34ae0 30 78 34 30 30 20 29 7b 0a 20 20 20 20 53 45 4c  0x400 ){.    SEL
34af0 45 43 54 54 52 41 43 45 28 30 78 34 30 30 2c 70  ECTTRACE(0x400,p
34b00 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20  Parse,p,("After 
34b10 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
34b20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22 29 29 3b 0a  analysis:\n"));.
34b30 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
34b40 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
34b50 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
34b60 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72    /* If the quer
34b70 79 20 69 73 20 44 49 53 54 49 4e 43 54 20 77 69  y is DISTINCT wi
34b80 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 62  th an ORDER BY b
34b90 75 74 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67  ut is not an agg
34ba0 72 65 67 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a  regate, and .  *
34bb0 2a 20 69 66 20 74 68 65 20 73 65 6c 65 63 74 2d  * if the select-
34bc0 6c 69 73 74 20 69 73 20 74 68 65 20 73 61 6d 65  list is the same
34bd0 20 61 73 20 74 68 65 20 4f 52 44 45 52 20 42 59   as the ORDER BY
34be0 20 6c 69 73 74 2c 20 74 68 65 6e 20 74 68 69 73   list, then this
34bf0 20 71 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20   query.  ** can 
34c00 62 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20  be rewritten as 
34c10 61 20 47 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f  a GROUP BY. In o
34c20 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 69 73  ther words, this
34c30 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
34c40 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
34c50 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44  xyz FROM ... ORD
34c60 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20  ER BY xyz.  **. 
34c70 20 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f 72 6d   ** is transform
34c80 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ed to:.  **.  **
34c90 20 20 20 20 20 53 45 4c 45 43 54 20 78 79 7a 20       SELECT xyz 
34ca0 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42  FROM ... GROUP B
34cb0 59 20 78 79 7a 20 4f 52 44 45 52 20 42 59 20 78  Y xyz ORDER BY x
34cc0 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  yz.  **.  ** The
34cd0 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20   second form is 
34ce0 70 72 65 66 65 72 72 65 64 20 61 73 20 61 20 73  preferred as a s
34cf0 69 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f 72 20  ingle index (or 
34d00 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79 20  temp-table) may 
34d10 62 65 20 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f  be .  ** used fo
34d20 72 20 62 6f 74 68 20 74 68 65 20 4f 52 44 45 52  r both the ORDER
34d30 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
34d40 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 41 73 20   processing. As 
34d50 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a  originally .  **
34d60 20 77 72 69 74 74 65 6e 20 74 68 65 20 71 75 65   written the que
34d70 72 79 20 6d 75 73 74 20 75 73 65 20 61 20 74 65  ry must use a te
34d80 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 61 74 20  mp-table for at 
34d90 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65  least one of the
34da0 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42 59 20   ORDER .  ** BY 
34db0 61 6e 64 20 44 49 53 54 49 4e 43 54 2c 20 61 6e  and DISTINCT, an
34dc0 64 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 73 65  d an index or se
34dd0 70 61 72 61 74 65 20 74 65 6d 70 2d 74 61 62 6c  parate temp-tabl
34de0 65 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72 2e  e for the other.
34df0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e  .  */.  if( (p->
34e00 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
34e10 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
34e20 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69  gate))==SF_Disti
34e30 6e 63 74 20 0a 20 20 20 26 26 20 73 71 6c 69 74  nct .   && sqlit
34e40 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
34e50 65 28 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  e(sSort.pOrderBy
34e60 2c 20 70 45 4c 69 73 74 2c 20 2d 31 29 3d 3d 30  , pEList, -1)==0
34e70 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c  .  ){.    p->sel
34e80 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73  Flags &= ~SF_Dis
34e90 74 69 6e 63 74 3b 0a 20 20 20 20 70 47 72 6f 75  tinct;.    pGrou
34ea0 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
34eb0 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
34ec0 69 73 74 44 75 70 28 64 62 2c 20 70 45 4c 69 73  istDup(db, pELis
34ed0 74 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f  t, 0);.    /* No
34ee0 74 69 63 65 20 74 68 61 74 20 65 76 65 6e 20 74  tice that even t
34ef0 68 6f 75 67 68 74 20 53 46 5f 44 69 73 74 69 6e  hought SF_Distin
34f00 63 74 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61  ct has been clea
34f10 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73 65 6c 46  red from p->selF
34f20 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65  lags,.    ** the
34f30 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
34f40 74 20 69 73 20 73 74 69 6c 6c 20 73 65 74 2e 20  t is still set. 
34f50 20 48 65 6e 63 65 2c 20 69 73 54 6e 63 74 20 72   Hence, isTnct r
34f60 65 70 72 65 73 65 6e 74 73 20 74 68 65 0a 20 20  epresents the.  
34f70 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 73 65    ** original se
34f80 74 74 69 6e 67 20 6f 66 20 74 68 65 20 53 46 5f  tting of the SF_
34f90 44 69 73 74 69 6e 63 74 20 66 6c 61 67 2c 20 6e  Distinct flag, n
34fa0 6f 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ot the current s
34fb0 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20 20 61 73  etting */.    as
34fc0 73 65 72 74 28 20 73 44 69 73 74 69 6e 63 74 2e  sert( sDistinct.
34fd0 69 73 54 6e 63 74 20 29 3b 0a 0a 23 69 66 20 53  isTnct );..#if S
34fe0 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
34ff0 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ED.    if( sqlit
35000 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
35010 30 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20 53  0x400 ){.      S
35020 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30 30  ELECTTRACE(0x400
35030 2c 70 50 61 72 73 65 2c 70 2c 28 22 54 72 61 6e  ,pParse,p,("Tran
35040 73 66 6f 72 6d 20 44 49 53 54 49 4e 43 54 20 69  sform DISTINCT i
35050 6e 74 6f 20 47 52 4f 55 50 20 42 59 3a 5c 6e 22  nto GROUP BY:\n"
35060 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
35070 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
35080 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, p, 0);.    }.
35090 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
350a0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
350b0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
350c0 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 20   then create an 
350d0 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
350e0 74 6f 0a 20 20 2a 2a 20 64 6f 20 74 68 65 20 73  to.  ** do the s
350f0 6f 72 74 69 6e 67 2e 20 20 42 75 74 20 74 68 69  orting.  But thi
35100 73 20 73 6f 72 74 69 6e 67 20 65 70 68 65 6d 65  s sorting epheme
35110 72 61 6c 20 69 6e 64 65 78 20 6d 69 67 68 74 20  ral index might 
35120 65 6e 64 20 75 70 0a 20 20 2a 2a 20 62 65 69 6e  end up.  ** bein
35130 67 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20  g unused if the 
35140 64 61 74 61 20 63 61 6e 20 62 65 20 65 78 74 72  data can be extr
35150 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72  acted in pre-sor
35160 74 65 64 20 6f 72 64 65 72 2e 0a 20 20 2a 2a 20  ted order..  ** 
35170 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63  If that is the c
35180 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 4f 50  ase, then the OP
35190 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
351a0 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20  nstruction will 
351b0 62 65 0a 20 20 2a 2a 20 63 68 61 6e 67 65 64 20  be.  ** changed 
351c0 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e  to an OP_Noop on
351d0 63 65 20 77 65 20 66 69 67 75 72 65 20 6f 75 74  ce we figure out
351e0 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e   that the sortin
351f0 67 20 69 6e 64 65 78 20 69 73 0a 20 20 2a 2a 20  g index is.  ** 
35200 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65  not needed.  The
35210 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
35220 6e 64 65 78 20 76 61 72 69 61 62 6c 65 20 69 73  ndex variable is
35230 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74   used to facilit
35240 61 74 65 0a 20 20 2a 2a 20 74 68 61 74 20 63 68  ate.  ** that ch
35250 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ange..  */.  if(
35260 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
35270 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
35280 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b  pKeyInfo;.    pK
35290 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
352a0 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  KeyInfoFromExprL
352b0 69 73 74 28 0a 20 20 20 20 20 20 20 20 70 50 61  ist(.        pPa
352c0 72 73 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  rse, sSort.pOrde
352d0 72 42 79 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e  rBy, 0, pEList->
352e0 6e 45 78 70 72 29 3b 0a 20 20 20 20 73 53 6f 72  nExpr);.    sSor
352f0 74 2e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61  t.iECursor = pPa
35300 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
35310 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
35320 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c  ndex =.      sql
35330 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
35340 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
35350 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 73 53  al,.          sS
35360 6f 72 74 2e 69 45 43 75 72 73 6f 72 2c 20 73 53  ort.iECursor, sS
35370 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ort.pOrderBy->nE
35380 78 70 72 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e 45  xpr+1+pEList->nE
35390 78 70 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  xpr, 0,.        
353a0 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
353b0 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 0a 20 20  o, P4_KEYINFO.  
353c0 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a      );.  }else{.
353d0 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f      sSort.addrSo
353e0 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20  rtIndex = -1;.  
353f0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  }..  /* If the o
35400 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65  utput is destine
35410 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72  d for a temporar
35420 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68  y table, open th
35430 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  at table..  */. 
35440 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73   if( pDest->eDes
35450 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
35460 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
35470 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
35480 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44  penEphemeral, pD
35490 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70 45  est->iSDParm, pE
354a0 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
354b0 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
354c0 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  limiter..  */.  
354d0 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  iEnd = sqlite3Vd
354e0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
354f0 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
35500 67 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d  gs & SF_FixedLim
35510 69 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  it)==0 ){.    p-
35520 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 33 32  >nSelectRow = 32
35530 30 3b 20 20 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e  0;  /* 4 billion
35540 20 72 6f 77 73 20 2a 2f 0a 20 20 7d 0a 20 20 63   rows */.  }.  c
35550 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
35560 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
35570 69 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e  iEnd);.  if( p->
35580 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20 73 53 6f  iLimit==0 && sSo
35590 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
355a0 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
355b0 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f  e3VdbeChangeOpco
355c0 64 65 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72  de(v, sSort.addr
355d0 53 6f 72 74 49 6e 64 65 78 2c 20 4f 50 5f 53 6f  SortIndex, OP_So
355e0 72 74 65 72 4f 70 65 6e 29 3b 0a 20 20 20 20 73  rterOpen);.    s
355f0 53 6f 72 74 2e 73 6f 72 74 46 6c 61 67 73 20 7c  Sort.sortFlags |
35600 3d 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  = SORTFLAG_UseSo
35610 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rter;.  }..  /* 
35620 4f 70 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61  Open an ephemera
35630 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66  l index to use f
35640 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  or the distinct 
35650 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  set..  */.  if( 
35660 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
35670 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
35680 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e   sDistinct.tabTn
35690 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
356a0 62 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74 69 6e  b++;.    sDistin
356b0 63 74 2e 61 64 64 72 54 6e 63 74 20 3d 20 73 71  ct.addrTnct = sq
356c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
356d0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
356e0 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ral,.           
356f0 20 20 20 20 20 20 20 20 20 20 20 20 73 44 69 73              sDis
35700 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30  tinct.tabTnct, 0
35710 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
35720 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
35730 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  r*)sqlite3KeyInf
35740 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
35750 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  arse, p->pEList,
35760 30 2c 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  0,0),.          
35770 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f               P4_
35780 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71  KEYINFO);.    sq
35790 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
357a0 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44  5(v, BTREE_UNORD
357b0 45 52 45 44 29 3b 0a 20 20 20 20 73 44 69 73 74  ERED);.    sDist
357c0 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d  inct.eTnctType =
357d0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
357e0 55 4e 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c  UNORDERED;.  }el
357f0 73 65 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63  se{.    sDistinc
35800 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48  t.eTnctType = WH
35810 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f  ERE_DISTINCT_NOO
35820 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69  P;.  }..  if( !i
35830 73 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79  sAgg && pGroupBy
35840 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  ==0 ){.    /* No
35850 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
35860 69 6f 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55  ions and no GROU
35870 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  P BY clause */. 
35880 20 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67     u16 wctrlFlag
35890 73 20 3d 20 28 73 44 69 73 74 69 6e 63 74 2e 69  s = (sDistinct.i
358a0 73 54 6e 63 74 20 3f 20 57 48 45 52 45 5f 57 41  sTnct ? WHERE_WA
358b0 4e 54 5f 44 49 53 54 49 4e 43 54 20 3a 20 30 29  NT_DISTINCT : 0)
358c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
358d0 20 20 20 20 7c 20 28 70 2d 3e 73 65 6c 46 6c 61      | (p->selFla
358e0 67 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d  gs & SF_FixedLim
358f0 69 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  it);.#ifndef SQL
35900 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
35910 55 4e 43 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a  UNC.    Window *
35920 70 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 20  pWin = p->pWin; 
35930 20 20 20 20 20 2f 2a 20 4d 61 73 74 65 72 20 77       /* Master w
35940 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 28 6f 72  indow object (or
35950 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69 66   NULL) */.    if
35960 28 20 70 57 69 6e 20 29 7b 0a 20 20 20 20 20 20  ( pWin ){.      
35970 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64  sqlite3WindowCod
35980 65 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 57  eInit(pParse, pW
35990 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  in);.    }.#endi
359a0 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 48  f.    assert( WH
359b0 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 3d 3d 53  ERE_USE_LIMIT==S
359c0 46 5f 46 69 78 65 64 4c 69 6d 69 74 20 29 3b 0a  F_FixedLimit );.
359d0 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74  ..    /* Begin t
359e0 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
359f0 2e 20 2a 2f 0a 20 20 20 20 53 45 4c 45 43 54 54  . */.    SELECTT
35a00 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c  RACE(1,pParse,p,
35a10 28 22 57 68 65 72 65 42 65 67 69 6e 5c 6e 22 29  ("WhereBegin\n")
35a20 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  );.    pWInfo = 
35a30 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
35a40 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
35a50 73 74 2c 20 70 57 68 65 72 65 2c 20 73 53 6f 72  st, pWhere, sSor
35a60 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20  t.pOrderBy,.    
35a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a80 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45             p->pE
35a90 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c 61 67 73  List, wctrlFlags
35aa0 2c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29  , p->nSelectRow)
35ab0 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
35ac0 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
35ad0 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 73  t_end;.    if( s
35ae0 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75  qlite3WhereOutpu
35af0 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f  tRowCount(pWInfo
35b00 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  ) < p->nSelectRo
35b10 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53  w ){.      p->nS
35b20 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
35b30 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77  e3WhereOutputRow
35b40 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20  Count(pWInfo);. 
35b50 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 44 69     }.    if( sDi
35b60 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26  stinct.isTnct &&
35b70 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
35b80 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 20  istinct(pWInfo) 
35b90 29 7b 0a 20 20 20 20 20 20 73 44 69 73 74 69 6e  ){.      sDistin
35ba0 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 73  ct.eTnctType = s
35bb0 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73  qlite3WhereIsDis
35bc0 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20  tinct(pWInfo);. 
35bd0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 53 6f     }.    if( sSo
35be0 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  rt.pOrderBy ){. 
35bf0 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61       sSort.nOBSa
35c00 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  t = sqlite3Where
35c10 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f  IsOrdered(pWInfo
35c20 29 3b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6c  );.      sSort.l
35c30 61 62 65 6c 4f 42 4c 6f 70 74 20 3d 20 73 71 6c  abelOBLopt = sql
35c40 69 74 65 33 57 68 65 72 65 4f 72 64 65 72 42 79  ite3WhereOrderBy
35c50 4c 69 6d 69 74 4f 70 74 4c 61 62 65 6c 28 70 57  LimitOptLabel(pW
35c60 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  Info);.      if(
35c70 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d 73   sSort.nOBSat==s
35c80 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e  Sort.pOrderBy->n
35c90 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
35ca0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
35cb0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
35cc0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72  }..    /* If sor
35cd0 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
35ce0 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
35cf0 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70   prior OP_OpenEp
35d00 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20  hemeral .    ** 
35d10 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65  instruction ende
35d20 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e  d up not being n
35d30 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e  eeded, then chan
35d40 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  ge the OP_OpenEp
35d50 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69  hemeral.    ** i
35d60 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a  nto an OP_Noop..
35d70 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
35d80 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
35d90 65 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e 70  ex>=0 && sSort.p
35da0 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
35db0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
35dc0 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73  hangeToNoop(v, s
35dd0 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
35de0 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ex);.    }..    
35df0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
35e00 74 3d 3d 70 45 4c 69 73 74 20 29 3b 0a 23 69 66  t==pEList );.#if
35e10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
35e20 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20  _WINDOWFUNC.    
35e30 69 66 28 20 70 57 69 6e 20 29 7b 0a 20 20 20 20  if( pWin ){.    
35e40 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62 20    int addrGosub 
35e50 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
35e60 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
35e70 20 69 6e 74 20 69 43 6f 6e 74 20 3d 20 73 71 6c   int iCont = sql
35e80 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
35e90 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  l(v);.      int 
35ea0 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
35eb0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
35ec0 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 47  ;.      int regG
35ed0 6f 73 75 62 20 3d 20 2b 2b 70 50 61 72 73 65 2d  osub = ++pParse-
35ee0 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 20 20 73 71  >nMem;..      sq
35ef0 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53  lite3WindowCodeS
35f00 74 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  tep(pParse, p, p
35f10 57 49 6e 66 6f 2c 20 72 65 67 47 6f 73 75 62 2c  WInfo, regGosub,
35f20 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 0a 20 20   addrGosub);..  
35f30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
35f40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
35f50 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  , 0, iBreak);.  
35f60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
35f70 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
35f80 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 20  ddrGosub);.     
35f90 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
35fa0 28 28 76 2c 20 22 69 6e 6e 65 72 2d 6c 6f 6f 70  ((v, "inner-loop
35fb0 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
35fc0 20 20 20 20 20 20 73 53 6f 72 74 2e 6c 61 62 65        sSort.labe
35fd0 6c 4f 42 4c 6f 70 74 20 3d 20 30 3b 0a 20 20 20  lOBLopt = 0;.   
35fe0 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
35ff0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d 31  op(pParse, p, -1
36000 2c 20 26 73 53 6f 72 74 2c 20 26 73 44 69 73 74  , &sSort, &sDist
36010 69 6e 63 74 2c 20 70 44 65 73 74 2c 20 69 43 6f  inct, pDest, iCo
36020 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  nt, iBreak);.   
36030 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
36040 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
36050 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ont);.      sqli
36060 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
36070 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 47   OP_Return, regG
36080 6f 73 75 62 29 3b 0a 20 20 20 20 20 20 56 64 62  osub);.      Vdb
36090 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e  eComment((v, "en
360a0 64 20 69 6e 6e 65 72 2d 6c 6f 6f 70 20 73 75 62  d inner-loop sub
360b0 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20  routine"));.    
360c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
360d0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
360e0 65 61 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  eak);.    }else.
360f0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
36100 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
36110 20 2a 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20 20   */.    {.      
36120 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64  /* Use the stand
36130 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20  ard inner loop. 
36140 2a 2f 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  */.      selectI
36150 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
36160 20 70 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20   p, -1, &sSort, 
36170 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73  &sDistinct, pDes
36180 74 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  t,.          sql
36190 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75  ite3WhereContinu
361a0 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a  eLabel(pWInfo),.
361b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
361c0 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c  3WhereBreakLabel
361d0 28 70 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20  (pWInfo));..    
361e0 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74    /* End the dat
361f0 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  abase scan loop.
36200 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
36210 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
36220 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  pWInfo);.    }. 
36230 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
36240 68 69 73 20 63 61 73 65 20 77 68 65 6e 20 74 68  his case when th
36250 65 72 65 20 65 78 69 73 74 20 61 67 67 72 65 67  ere exist aggreg
36260 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72  ate functions or
36270 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
36280 73 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74  se.    ** or bot
36290 68 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e  h */.    NameCon
362a0 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20  text sNC;    /* 
362b0 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72  Name context for
362c0 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72   processing aggr
362d0 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f  egate informatio
362e0 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d  n */.    int iAM
362f0 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em;          /* 
36300 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73  First Mem addres
36310 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75  s for storing cu
36320 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a  rrent GROUP BY *
36330 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b  /.    int iBMem;
36340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
36350 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66  st Mem address f
36360 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55  or previous GROU
36370 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20  P BY */.    int 
36380 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20  iUseFlag;       
36390 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68  /* Mem address h
363a0 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69  olding flag indi
363b0 63 61 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c  cating that at l
363c0 65 61 73 74 0a 20 20 20 20 20 20 20 20 20 20 20  east.           
363d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
363e0 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69  one row of the i
363f0 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67 67 72  nput to the aggr
36400 65 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a  egator has been.
36410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36420 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
36430 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ssed */.    int 
36440 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20  iAbortFlag;     
36450 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77  /* Mem address w
36460 68 69 63 68 20 63 61 75 73 65 73 20 71 75 65 72  hich causes quer
36470 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74  y abort if posit
36480 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67  ive */.    int g
36490 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f  roupBySort;    /
364a0 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d  * Rows come from
364b0 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50   source in GROUP
364c0 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20   BY order */.   
364d0 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20   int addrEnd;   
364e0 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70       /* End of p
364f0 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68  rocessing for th
36500 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20  is SELECT */.   
36510 20 69 6e 74 20 73 6f 72 74 50 54 61 62 20 3d 20   int sortPTab = 
36520 30 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61  0;   /* Pseudota
36530 62 6c 65 20 75 73 65 64 20 74 6f 20 64 65 63 6f  ble used to deco
36540 64 65 20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c  de sorting resul
36550 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f  ts */.    int so
36560 72 74 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a  rtOut = 0;    /*
36570 20 4f 75 74 70 75 74 20 72 65 67 69 73 74 65 72   Output register
36580 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72   from the sorter
36590 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 72 64 65   */.    int orde
365a0 72 42 79 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54  rByGrp = 0; /* T
365b0 72 75 65 20 69 66 20 74 68 65 20 47 52 4f 55 50  rue if the GROUP
365c0 20 42 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59   BY and ORDER BY
365d0 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 2a 2f   are the same */
365e0 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ..    /* Remove 
365f0 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61  any and all alia
36600 73 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20  ses between the 
36610 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74  result set and t
36620 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20  he.    ** GROUP 
36630 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a  BY clause..    *
36640 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
36650 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  By ){.      int 
36660 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
36670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
36680 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
36690 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
366a0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20  st_item *pItem; 
366b0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
366c0 6f 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  over expression 
366d0 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20  in a list */..  
366e0 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c      for(k=p->pEL
366f0 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  ist->nExpr, pIte
36700 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20  m=p->pEList->a; 
36710 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b  k>0; k--, pItem+
36720 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65  +){.        pIte
36730 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20  m->u.x.iAlias = 
36740 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
36750 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d   for(k=pGroupBy-
36760 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47  >nExpr, pItem=pG
36770 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20  roupBy->a; k>0; 
36780 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  k--, pItem++){. 
36790 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e         pItem->u.
367a0 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  x.iAlias = 0;.  
367b0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
367c0 72 74 28 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c  rt( 66==sqlite3L
367d0 6f 67 45 73 74 28 31 30 30 29 20 29 3b 0a 20 20  ogEst(100) );.  
367e0 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65      if( p->nSele
367f0 63 74 52 6f 77 3e 36 36 20 29 20 70 2d 3e 6e 53  ctRow>66 ) p->nS
36800 65 6c 65 63 74 52 6f 77 20 3d 20 36 36 3b 0a 20  electRow = 66;. 
36810 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
36820 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
36830 65 33 4c 6f 67 45 73 74 28 31 29 20 29 3b 0a 20  e3LogEst(1) );. 
36840 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
36850 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  ow = 0;.    }.. 
36860 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
36870 73 20 62 6f 74 68 20 61 20 47 52 4f 55 50 20 42  s both a GROUP B
36880 59 20 61 6e 64 20 61 6e 20 4f 52 44 45 52 20 42  Y and an ORDER B
36890 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  Y clause and the
368a0 79 20 61 72 65 0a 20 20 20 20 2a 2a 20 69 64 65  y are.    ** ide
368b0 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20 69 74 20  ntical, then it 
368c0 6d 61 79 20 62 65 20 70 6f 73 73 69 62 6c 65 20  may be possible 
368d0 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 4f  to disable the O
368e0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 0a  RDER BY clause .
368f0 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 67 72      ** on the gr
36900 6f 75 6e 64 73 20 74 68 61 74 20 74 68 65 20 47  ounds that the G
36910 52 4f 55 50 20 42 59 20 77 69 6c 6c 20 63 61 75  ROUP BY will cau
36920 73 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63  se elements to c
36930 6f 6d 65 20 6f 75 74 20 0a 20 20 20 20 2a 2a 20  ome out .    ** 
36940 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f  in the correct o
36950 72 64 65 72 2e 20 49 74 20 61 6c 73 6f 20 6d 61  rder. It also ma
36960 79 20 6e 6f 74 20 2d 20 74 68 65 20 47 52 4f 55  y not - the GROU
36970 50 20 42 59 20 6d 69 67 68 74 20 75 73 65 20 61  P BY might use a
36980 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
36990 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 75 73   index that caus
369a0 65 73 20 72 6f 77 73 20 74 6f 20 62 65 20 67 72  es rows to be gr
369b0 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 20 61  ouped together a
369c0 73 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 2a  s required.    *
369d0 2a 20 62 75 74 20 6e 6f 74 20 61 63 74 75 61 6c  * but not actual
369e0 6c 79 20 73 6f 72 74 65 64 2e 20 45 69 74 68 65  ly sorted. Eithe
369f0 72 20 77 61 79 2c 20 72 65 63 6f 72 64 20 74 68  r way, record th
36a00 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65 0a  e fact that the.
36a10 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20      ** ORDER BY 
36a20 61 6e 64 20 47 52 4f 55 50 20 42 59 20 63 6c 61  and GROUP BY cla
36a30 75 73 65 73 20 61 72 65 20 74 68 65 20 73 61 6d  uses are the sam
36a40 65 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  e by setting the
36a50 20 6f 72 64 65 72 42 79 47 72 70 0a 20 20 20 20   orderByGrp.    
36a60 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f  ** variable.  */
36a70 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
36a80 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
36a90 70 47 72 6f 75 70 42 79 2c 20 73 53 6f 72 74 2e  pGroupBy, sSort.
36aa0 70 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30  pOrderBy, -1)==0
36ab0 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 42   ){.      orderB
36ac0 79 47 72 70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  yGrp = 1;.    }.
36ad0 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20   .    /* Create 
36ae0 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  a label to jump 
36af0 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20  to when we want 
36b00 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75 65  to abort the que
36b10 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e  ry */.    addrEn
36b20 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
36b30 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
36b40 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f    /* Convert TK_
36b50 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74  COLUMN nodes int
36b60 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  o TK_AGG_COLUMN 
36b70 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73  and make entries
36b80 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49   in.    ** sAggI
36b90 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41  nfo for all TK_A
36ba0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65  GG_FUNCTION node
36bb0 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  s in expressions
36bc0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53   of the.    ** S
36bd0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
36be0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  .    */.    mems
36bf0 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
36c00 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e  of(sNC));.    sN
36c10 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
36c20 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  e;.    sNC.pSrcL
36c30 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
36c40 20 20 20 20 73 4e 43 2e 75 4e 43 2e 70 41 67 67      sNC.uNC.pAgg
36c50 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f  Info = &sAggInfo
36c60 3b 0a 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20  ;.    VVA_ONLY( 
36c70 73 4e 43 2e 6e 63 46 6c 61 67 73 20 3d 20 4e 43  sNC.ncFlags = NC
36c80 5f 55 41 67 67 49 6e 66 6f 3b 20 29 0a 20 20 20  _UAggInfo; ).   
36c90 20 73 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 20   sAggInfo.mnReg 
36ca0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
36cb0 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e  ;.    sAggInfo.n
36cc0 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20  SortingColumn = 
36cd0 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75  pGroupBy ? pGrou
36ce0 70 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  pBy->nExpr : 0;.
36cf0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72      sAggInfo.pGr
36d00 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
36d10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
36d20 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
36d30 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20  &sNC, pEList);. 
36d40 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
36d50 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
36d60 43 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  C, sSort.pOrderB
36d70 79 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76  y);.    if( pHav
36d80 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ing ){.      if(
36d90 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
36da0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 68       assert( pWh
36db0 65 72 65 3d 3d 70 2d 3e 70 57 68 65 72 65 20 29  ere==p->pWhere )
36dc0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
36dd0 28 20 70 48 61 76 69 6e 67 3d 3d 70 2d 3e 70 48  ( pHaving==p->pH
36de0 61 76 69 6e 67 20 29 3b 0a 20 20 20 20 20 20 20  aving );.       
36df0 20 61 73 73 65 72 74 28 20 70 47 72 6f 75 70 42   assert( pGroupB
36e00 79 3d 3d 70 2d 3e 70 47 72 6f 75 70 42 79 20 29  y==p->pGroupBy )
36e10 3b 0a 20 20 20 20 20 20 20 20 68 61 76 69 6e 67  ;.        having
36e20 54 6f 57 68 65 72 65 28 70 50 61 72 73 65 2c 20  ToWhere(pParse, 
36e30 70 29 3b 0a 20 20 20 20 20 20 20 20 70 57 68 65  p);.        pWhe
36e40 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  re = p->pWhere;.
36e50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
36e60 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
36e70 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c  Aggregates(&sNC,
36e80 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d   pHaving);.    }
36e90 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41  .    sAggInfo.nA
36ea0 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67  ccumulator = sAg
36eb0 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20  gInfo.nColumn;. 
36ec0 20 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70     if( p->pGroup
36ed0 42 79 3d 3d 30 20 26 26 20 70 2d 3e 70 48 61 76  By==0 && p->pHav
36ee0 69 6e 67 3d 3d 30 20 26 26 20 73 41 67 67 49 6e  ing==0 && sAggIn
36ef0 66 6f 2e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20  fo.nFunc==1 ){. 
36f00 20 20 20 20 20 6d 69 6e 4d 61 78 46 6c 61 67 20       minMaxFlag 
36f10 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 64 62  = minMaxQuery(db
36f20 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
36f30 5b 30 5d 2e 70 45 78 70 72 2c 20 26 70 4d 69 6e  [0].pExpr, &pMin
36f40 4d 61 78 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  MaxOrderBy);.   
36f50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 69   }else{.      mi
36f60 6e 4d 61 78 46 6c 61 67 20 3d 20 57 48 45 52 45  nMaxFlag = WHERE
36f70 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b  _ORDERBY_NORMAL;
36f80 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
36f90 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
36fa0 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Func; i++){.    
36fb0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
36fc0 61 73 50 72 6f 70 65 72 74 79 28 73 41 67 67 49  asProperty(sAggI
36fd0 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78  nfo.aFunc[i].pEx
36fe0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
36ff0 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e  ) );.      sNC.n
37000 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41  cFlags |= NC_InA
37010 67 67 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71  ggFunc;.      sq
37020 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
37030 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41  AggList(&sNC, sA
37040 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e  ggInfo.aFunc[i].
37050 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b  pExpr->x.pList);
37060 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61  .      sNC.ncFla
37070 67 73 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46  gs &= ~NC_InAggF
37080 75 6e 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  unc;.    }.    s
37090 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 3d 20  AggInfo.mxReg = 
370a0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
370b0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
370c0 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65  Failed ) goto se
370d0 6c 65 63 74 5f 65 6e 64 3b 0a 23 69 66 20 53 45  lect_end;.#if SE
370e0 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
370f0 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  D.    if( sqlite
37100 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
37110 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  x400 ){.      in
37120 74 20 69 69 3b 0a 20 20 20 20 20 20 53 45 4c 45  t ii;.      SELE
37130 43 54 54 52 41 43 45 28 30 78 34 30 30 2c 70 50  CTTRACE(0x400,pP
37140 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 61  arse,p,("After a
37150 67 67 72 65 67 61 74 65 20 61 6e 61 6c 79 73 69  ggregate analysi
37160 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 73  s:\n"));.      s
37170 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
37180 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
37190 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
371a0 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  i<sAggInfo.nColu
371b0 6d 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  mn; ii++){.     
371c0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
371d0 72 69 6e 74 66 28 22 61 67 67 2d 63 6f 6c 75 6d  rintf("agg-colum
371e0 6e 5b 25 64 5d 20 69 4d 65 6d 3d 25 64 5c 6e 22  n[%d] iMem=%d\n"
371f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 69  ,.            ii
37200 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b  , sAggInfo.aCol[
37210 69 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20  ii].iMem);.     
37220 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
37230 65 77 45 78 70 72 28 30 2c 20 73 41 67 67 49 6e  ewExpr(0, sAggIn
37240 66 6f 2e 61 43 6f 6c 5b 69 69 5d 2e 70 45 78 70  fo.aCol[ii].pExp
37250 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r, 0);.      }. 
37260 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
37270 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63  i<sAggInfo.nFunc
37280 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
37290 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
372a0 6e 74 66 28 22 61 67 67 2d 66 75 6e 63 5b 25 64  ntf("agg-func[%d
372b0 5d 3a 20 69 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20  ]: iMem=%d\n",. 
372c0 20 20 20 20 20 20 20 20 20 20 20 69 69 2c 20 73             ii, s
372d0 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 69  AggInfo.aFunc[ii
372e0 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  ].iMem);.       
372f0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
37300 45 78 70 72 28 30 2c 20 73 41 67 67 49 6e 66 6f  Expr(0, sAggInfo
37310 2e 61 46 75 6e 63 5b 69 69 5d 2e 70 45 78 70 72  .aFunc[ii].pExpr
37320 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
37330 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 20    }.#endif...   
37340 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66   /* Processing f
37350 6f 72 20 61 67 67 72 65 67 61 74 65 73 20 77 69  or aggregates wi
37360 74 68 20 47 52 4f 55 50 20 42 59 20 69 73 20 76  th GROUP BY is v
37370 65 72 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e  ery different an
37380 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f  d.    ** much mo
37390 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20  re complex than 
373a0 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68 6f  aggregates witho
373b0 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20  ut a GROUP BY.. 
373c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
373d0 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
373e0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
373f0 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e  o;  /* Keying in
37400 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
37410 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73  e group by claus
37420 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  e */.      int a
37430 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 2f  ddr1;          /
37440 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69  * A-vs-B compari
37450 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20  sion jump */.   
37460 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75     int addrOutpu
37470 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20  tRow;  /* Start 
37480 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68  of subroutine th
37490 61 74 20 6f 75 74 70 75 74 73 20 61 20 72 65 73  at outputs a res
374a0 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20  ult row */.     
374b0 20 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f   int regOutputRo
374c0 77 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61  w;   /* Return a
374d0 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
374e0 66 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f  for output subro
374f0 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69  utine */.      i
37500 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b  nt addrSetAbort;
37510 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62     /* Set the ab
37520 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74  ort flag and ret
37530 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  urn */.      int
37540 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20   addrTopOfLoop; 
37550 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
37560 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  nput loop */.   
37570 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69     int addrSorti
37580 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50  ngIdx; /* The OP
37590 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66  _OpenEphemeral f
375a0 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  or the sorting i
375b0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ndex */.      in
375c0 74 20 61 64 64 72 52 65 73 65 74 3b 20 20 20 20  t addrReset;    
375d0 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20    /* Subroutine 
375e0 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74 68  for resetting th
375f0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f  e accumulator */
37600 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65  .      int regRe
37610 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  set;       /* Re
37620 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
37630 69 73 74 65 72 20 66 6f 72 20 72 65 73 65 74 20  ister for reset 
37640 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20  subroutine */.. 
37650 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
37660 20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20 63   is a GROUP BY c
37670 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e  lause we might n
37680 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e  eed a sorting in
37690 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  dex to.      ** 
376a0 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41  implement it.  A
376b0 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72  llocate that sor
376c0 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20  ting index now. 
376d0 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74   If it turns out
376e0 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
376f0 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74  e do not need it
37700 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20   after all, the 
37710 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e  OP_SorterOpen in
37720 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20  struction.      
37730 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65  ** will be conve
37740 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70  rted into a Noop
37750 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  .  .      */.   
37760 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
37770 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d  ingIdx = pParse-
37780 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70  >nTab++;.      p
37790 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
377a0 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  3KeyInfoFromExpr
377b0 4c 69 73 74 28 70 50 61 72 73 65 2c 70 47 72 6f  List(pParse,pGro
377c0 75 70 42 79 2c 30 2c 73 41 67 67 49 6e 66 6f 2e  upBy,0,sAggInfo.
377d0 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
377e0 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d  addrSortingIdx =
377f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
37800 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f  p4(v, OP_SorterO
37810 70 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  pen, .          
37820 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
37830 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53  Idx, sAggInfo.nS
37840 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20  ortingColumn, . 
37850 20 20 20 20 20 20 20 20 20 30 2c 20 28 63 68 61           0, (cha
37860 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
37870 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20 20 20  KEYINFO);..     
37880 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d   /* Initialize m
37890 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20  emory locations 
378a0 75 73 65 64 20 62 79 20 47 52 4f 55 50 20 42 59  used by GROUP BY
378b0 20 61 67 67 72 65 67 61 74 65 20 70 72 6f 63 65   aggregate proce
378c0 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20  ssing.      */. 
378d0 20 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20       iUseFlag = 
378e0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
378f0 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67        iAbortFlag
37900 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
37910 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74 70  m;.      regOutp
37920 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65  utRow = ++pParse
37930 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64  ->nMem;.      ad
37940 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71  drOutputRow = sq
37950 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
37960 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72 65 67  el(v);.      reg
37970 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65  Reset = ++pParse
37980 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64  ->nMem;.      ad
37990 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65  drReset = sqlite
379a0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
379b0 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d  );.      iAMem =
379c0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
379d0 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;.      pParse-
379e0 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42  >nMem += pGroupB
379f0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
37a00 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  iBMem = pParse->
37a10 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20  nMem + 1;.      
37a20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
37a30 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
37a40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
37a50 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
37a60 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f 72  nteger, 0, iAbor
37a70 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  tFlag);.      Vd
37a80 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63  beComment((v, "c
37a90 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22  lear abort flag"
37aa0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
37ab0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
37ac0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d  P_Null, 0, iAMem
37ad0 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79  , iAMem+pGroupBy
37ae0 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20  ->nExpr-1);..   
37af0 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f     /* Begin a lo
37b00 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74  op that will ext
37b10 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20  ract all source 
37b20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59  rows in GROUP BY
37b30 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a   order..      **
37b40 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f   This might invo
37b50 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74 65  lve two separate
37b60 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f   loops with an O
37b70 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65  P_Sort in betwee
37b80 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69  n, or.      ** i
37b90 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e  t might be a sin
37ba0 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73  gle loop that us
37bb0 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65  es an index to e
37bc0 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69  xtract informati
37bd0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  on.      ** in t
37be0 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20 74  he right order t
37bf0 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20  o begin with..  
37c00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
37c10 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
37c20 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
37c30 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29  eset, addrReset)
37c40 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  ;.      SELECTTR
37c50 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28  ACE(1,pParse,p,(
37c60 22 57 68 65 72 65 42 65 67 69 6e 5c 6e 22 29 29  "WhereBegin\n"))
37c70 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d  ;.      pWInfo =
37c80 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
37c90 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
37ca0 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 47 72  ist, pWhere, pGr
37cb0 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20 20 20 20  oupBy, 0,.      
37cc0 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55 50 42      WHERE_GROUPB
37cd0 59 20 7c 20 28 6f 72 64 65 72 42 79 47 72 70 20  Y | (orderByGrp 
37ce0 3f 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52  ? WHERE_SORTBYGR
37cf0 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20 20 20 20  OUP : 0), 0.    
37d00 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70    );.      if( p
37d10 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
37d20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
37d30 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
37d40 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
37d50 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e  fo)==pGroupBy->n
37d60 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
37d70 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72  /* The optimizer
37d80 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69   is able to deli
37d90 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75  ver rows in grou
37da0 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20  p by order so.  
37db0 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e        ** we do n
37dc0 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e  ot have to sort.
37dd0 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68    The OP_OpenEph
37de0 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c  emeral table wil
37df0 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
37e00 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20  cancelled later 
37e10 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c  because we still
37e20 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65   need to use the
37e30 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20   pKeyInfo.      
37e40 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f    */.        gro
37e50 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20  upBySort = 0;.  
37e60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
37e70 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63     /* Rows are c
37e80 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64  oming out in und
37e90 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e  etermined order.
37ea0 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73    We have to pus
37eb0 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63  h.        ** eac
37ec0 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72  h row into a sor
37ed0 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d  ting index, term
37ee0 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20  inate the first 
37ef0 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a  loop,.        **
37f00 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20   then loop over 
37f10 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
37f20 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  x in order to ge
37f30 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20  t the output.   
37f40 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65       ** in sorte
37f50 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20  d order.        
37f60 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  */.        int r
37f70 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  egBase;.        
37f80 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20  int regRecord;. 
37f90 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b         int nCol;
37fa0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72  .        int nGr
37fb0 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20  oupBy;..        
37fc0 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
37fd0 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
37fe0 20 20 20 20 20 20 28 73 44 69 73 74 69 6e 63 74        (sDistinct
37ff0 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d 3e 73  .isTnct && (p->s
38000 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73 74 69  elFlags&SF_Disti
38010 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20  nct)==0) ?.     
38020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
38030 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47 52 4f  DISTINCT" : "GRO
38040 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20 20  UP BY");..      
38050 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
38060 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75  1;.        nGrou
38070 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e  pBy = pGroupBy->
38080 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e  nExpr;.        n
38090 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a  Col = nGroupBy;.
380a0 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f          j = nGro
380b0 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f  upBy;.        fo
380c0 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
380d0 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  o.nColumn; i++){
380e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
380f0 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e  AggInfo.aCol[i].
38100 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a  iSorterColumn>=j
38110 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
38120 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nCol++;.        
38130 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
38140 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
38150 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d         regBase =
38160 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
38170 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f  ange(pParse, nCo
38180 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
38190 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
381a0 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ist(pParse, pGro
381b0 75 70 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30  upBy, regBase, 0
381c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6a 20  , 0);.        j 
381d0 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  = nGroupBy;.    
381e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
381f0 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
38200 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
38210 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
38220 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67  col *pCol = &sAg
38230 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20  gInfo.aCol[i];. 
38240 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
38250 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
38260 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=j ){.         
38270 20 20 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20     int r1 = j + 
38280 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20  regBase;.       
38290 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
382a0 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
382b0 61 62 6c 65 28 76 2c 0a 20 20 20 20 20 20 20 20  able(v,.        
382c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
382d0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61         pCol->pTa
382e0 62 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c  b, pCol->iTable,
382f0 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20   pCol->iColumn, 
38300 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r1);.           
38310 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   j++;.          
38320 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
38330 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20      regRecord = 
38340 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
38350 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
38360 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
38370 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
38380 65 63 6f 72 64 2c 20