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

Artifact c998f694759e37799929e28df8a2649747f8774d4fc233529ab6bda689388e15:


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 70 50 61 72 73  eMakeLabel(pPars
5710: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  e);.  sqlite3Exp
5720: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
5730: 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72  arse, pSort->pOr
5740: 64 65 72 42 79 2c 20 72 65 67 42 61 73 65 2c 20  derBy, regBase, 
5750: 72 65 67 4f 72 69 67 44 61 74 61 2c 0a 20 20 20  regOrigData,.   
5760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5770: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43         SQLITE_EC
5780: 45 4c 5f 44 55 50 20 7c 20 28 72 65 67 4f 72 69  EL_DUP | (regOri
5790: 67 44 61 74 61 3f 20 53 51 4c 49 54 45 5f 45 43  gData? SQLITE_EC
57a0: 45 4c 5f 52 45 46 20 3a 20 30 29 29 3b 0a 20 20  EL_REF : 0));.  
57b0: 69 66 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20  if( bSeq ){.    
57c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
57d0: 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  2(v, OP_Sequence
57e0: 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  , pSort->iECurso
57f0: 72 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  r, regBase+nExpr
5800: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 72  );.  }.  if( nPr
5810: 65 66 69 78 52 65 67 3d 3d 30 20 26 26 20 6e 44  efixReg==0 && nD
5820: 61 74 61 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  ata>0 ){.    sql
5830: 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
5840: 28 70 50 61 72 73 65 2c 20 72 65 67 44 61 74 61  (pParse, regData
5850: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2b  , regBase+nExpr+
5860: 62 53 65 71 2c 20 6e 44 61 74 61 29 3b 0a 20 20  bSeq, nData);.  
5870: 7d 0a 20 20 69 66 28 20 6e 4f 42 53 61 74 3e 30  }.  if( nOBSat>0
5880: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 50   ){.    int regP
5890: 72 65 76 4b 65 79 3b 20 20 20 2f 2a 20 54 68 65  revKey;   /* The
58a0: 20 66 69 72 73 74 20 6e 4f 42 53 61 74 20 63 6f   first nOBSat co
58b0: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 70 72 65  lumns of the pre
58c0: 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20  vious row */.   
58d0: 20 69 6e 74 20 61 64 64 72 46 69 72 73 74 3b 20   int addrFirst; 
58e0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
58f0: 20 74 68 65 20 4f 50 5f 49 66 4e 6f 74 20 6f 70   the OP_IfNot op
5900: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  code */.    int 
5910: 61 64 64 72 4a 6d 70 3b 20 20 20 20 20 20 2f 2a  addrJmp;      /*
5920: 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
5930: 4f 50 5f 4a 75 6d 70 20 6f 70 63 6f 64 65 20 2a  OP_Jump opcode *
5940: 2f 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f  /.    VdbeOp *pO
5950: 70 3b 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64  p;      /* Opcod
5960: 65 20 74 68 61 74 20 6f 70 65 6e 73 20 74 68 65  e that opens the
5970: 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20 69   sorter */.    i
5980: 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20  nt nKey;        
5990: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6f   /* Number of so
59a0: 72 74 69 6e 67 20 6b 65 79 20 63 6f 6c 75 6d 6e  rting key column
59b0: 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 4f 50 5f  s, including OP_
59c0: 53 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20  Sequence */.    
59d0: 4b 65 79 49 6e 66 6f 20 2a 70 4b 49 3b 20 20 20  KeyInfo *pKI;   
59e0: 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 4b 65    /* Original Ke
59f0: 79 49 6e 66 6f 20 6f 6e 20 74 68 65 20 73 6f 72  yInfo on the sor
5a00: 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20  ter table */..  
5a10: 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 6d 61    regRecord = ma
5a20: 6b 65 53 6f 72 74 65 72 52 65 63 6f 72 64 28 70  keSorterRecord(p
5a30: 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 53  Parse, pSort, pS
5a40: 65 6c 65 63 74 2c 20 72 65 67 42 61 73 65 2c 20  elect, regBase, 
5a50: 6e 42 61 73 65 29 3b 0a 20 20 20 20 72 65 67 50  nBase);.    regP
5a60: 72 65 76 4b 65 79 20 3d 20 70 50 61 72 73 65 2d  revKey = pParse-
5a70: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
5a80: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f  rse->nMem += pSo
5a90: 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20  rt->nOBSat;.    
5aa0: 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20 2d 20 70  nKey = nExpr - p
5ab0: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20 2b 20 62  Sort->nOBSat + b
5ac0: 53 65 71 3b 0a 20 20 20 20 69 66 28 20 62 53 65  Seq;.    if( bSe
5ad0: 71 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 46  q ){.      addrF
5ae0: 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  irst = sqlite3Vd
5af0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
5b00: 66 4e 6f 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  fNot, regBase+nE
5b10: 78 70 72 29 3b 20 0a 20 20 20 20 7d 65 6c 73 65  xpr); .    }else
5b20: 7b 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73  {.      addrFirs
5b30: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
5b40: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65 71 75  ddOp1(v, OP_Sequ
5b50: 65 6e 63 65 54 65 73 74 2c 20 70 53 6f 72 74 2d  enceTest, pSort-
5b60: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  >iECursor);.    
5b70: 7d 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  }.    VdbeCovera
5b80: 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
5b90: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5ba0: 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 50  OP_Compare, regP
5bb0: 72 65 76 4b 65 79 2c 20 72 65 67 42 61 73 65 2c  revKey, regBase,
5bc0: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b   pSort->nOBSat);
5bd0: 0a 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74  .    pOp = sqlit
5be0: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
5bf0: 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e  Sort->addrSortIn
5c00: 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 50  dex);.    if( pP
5c10: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
5c20: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
5c30: 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6e  .    pOp->p2 = n
5c40: 4b 65 79 20 2b 20 6e 44 61 74 61 3b 0a 20 20 20  Key + nData;.   
5c50: 20 70 4b 49 20 3d 20 70 4f 70 2d 3e 70 34 2e 70   pKI = pOp->p4.p
5c60: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d  KeyInfo;.    mem
5c70: 73 65 74 28 70 4b 49 2d 3e 61 53 6f 72 74 4f 72  set(pKI->aSortOr
5c80: 64 65 72 2c 20 30 2c 20 70 4b 49 2d 3e 6e 4b 65  der, 0, pKI->nKe
5c90: 79 46 69 65 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65  yField); /* Make
5ca0: 73 20 4f 50 5f 4a 75 6d 70 20 74 65 73 74 61 62  s OP_Jump testab
5cb0: 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  le */.    sqlite
5cc0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
5cd0: 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 4b 49 2c   -1, (char*)pKI,
5ce0: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
5cf0: 20 20 74 65 73 74 63 61 73 65 28 20 70 4b 49 2d    testcase( pKI-
5d00: 3e 6e 41 6c 6c 46 69 65 6c 64 20 3e 20 70 4b 49  >nAllField > pKI
5d10: 2d 3e 6e 4b 65 79 46 69 65 6c 64 2b 32 20 29 3b  ->nKeyField+2 );
5d20: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65  .    pOp->p4.pKe
5d30: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
5d40: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
5d50: 73 74 28 70 50 61 72 73 65 2c 70 53 6f 72 74 2d  st(pParse,pSort-
5d60: 3e 70 4f 72 64 65 72 42 79 2c 6e 4f 42 53 61 74  >pOrderBy,nOBSat
5d70: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4b 49               pKI
5da0: 2d 3e 6e 41 6c 6c 46 69 65 6c 64 2d 70 4b 49 2d  ->nAllField-pKI-
5db0: 3e 6e 4b 65 79 46 69 65 6c 64 2d 31 29 3b 0a 20  >nKeyField-1);. 
5dc0: 20 20 20 61 64 64 72 4a 6d 70 20 3d 20 73 71 6c     addrJmp = sql
5dd0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
5de0: 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ddr(v);.    sqli
5df0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
5e00: 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 4a 6d   OP_Jump, addrJm
5e10: 70 2b 31 2c 20 30 2c 20 61 64 64 72 4a 6d 70 2b  p+1, 0, addrJmp+
5e20: 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
5e30: 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e  (v);.    pSort->
5e40: 6c 61 62 65 6c 42 6b 4f 75 74 20 3d 20 73 71 6c  labelBkOut = sql
5e50: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
5e60: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70  l(pParse);.    p
5e70: 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 20  Sort->regReturn 
5e80: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
5e90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5ea0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
5eb0: 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52  sub, pSort->regR
5ec0: 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61  eturn, pSort->la
5ed0: 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73  belBkOut);.    s
5ee0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
5ef0: 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74  (v, OP_ResetSort
5f00: 65 72 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  er, pSort->iECur
5f10: 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 69 4c  sor);.    if( iL
5f20: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 73 71  imit ){.      sq
5f30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5f40: 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69  v, OP_IfNot, iLi
5f50: 6d 69 74 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65  mit, pSort->labe
5f60: 6c 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64  lDone);.      Vd
5f70: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
5f80: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
5f90: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
5fa0: 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20  addrFirst);.    
5fb0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
5fc0: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  ove(pParse, regB
5fd0: 61 73 65 2c 20 72 65 67 50 72 65 76 4b 65 79 2c  ase, regPrevKey,
5fe0: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b   pSort->nOBSat);
5ff0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6000: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
6010: 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Jmp);.  }.  if( 
6020: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a  iLimit ){.    /*
6030: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
6040: 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68  he values for th
6050: 65 20 6e 65 77 20 73 6f 72 74 65 72 20 65 6e 74  e new sorter ent
6060: 72 79 20 61 72 65 20 73 74 6f 72 65 64 0a 20 20  ry are stored.  
6070: 20 20 2a 2a 20 69 6e 20 61 6e 20 61 72 72 61 79    ** in an array
6080: 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 54   of registers. T
6090: 68 65 79 20 6e 65 65 64 20 74 6f 20 62 65 20 63  hey need to be c
60a0: 6f 6d 70 6f 73 65 64 20 69 6e 74 6f 20 61 20 72  omposed into a r
60b0: 65 63 6f 72 64 0a 20 20 20 20 2a 2a 20 61 6e 64  ecord.    ** and
60c0: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74   inserted into t
60d0: 68 65 20 73 6f 72 74 65 72 20 69 66 20 65 69 74  he sorter if eit
60e0: 68 65 72 20 28 61 29 20 74 68 65 72 65 20 61 72  her (a) there ar
60f0: 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20  e currently.    
6100: 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 4c 49 4d  ** less than LIM
6110: 49 54 2b 4f 46 46 53 45 54 20 69 74 65 6d 73 20  IT+OFFSET items 
6120: 6f 72 20 28 62 29 20 74 68 65 20 6e 65 77 20 72  or (b) the new r
6130: 65 63 6f 72 64 20 69 73 20 73 6d 61 6c 6c 65 72  ecord is smaller
6140: 20 74 68 61 6e 20 0a 20 20 20 20 2a 2a 20 74 68   than .    ** th
6150: 65 20 6c 61 72 67 65 73 74 20 72 65 63 6f 72 64  e largest record
6160: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
6170: 65 20 73 6f 72 74 65 72 2e 20 49 66 20 28 62 29  e sorter. If (b)
6180: 20 69 73 20 74 72 75 65 20 61 6e 64 20 74 68 65   is true and the
6190: 72 65 0a 20 20 20 20 2a 2a 20 61 72 65 20 61 6c  re.    ** are al
61a0: 72 65 61 64 79 20 4c 49 4d 49 54 2b 4f 46 46 53  ready LIMIT+OFFS
61b0: 45 54 20 69 74 65 6d 73 20 69 6e 20 74 68 65 20  ET items in the 
61c0: 73 6f 72 74 65 72 2c 20 64 65 6c 65 74 65 20 74  sorter, delete t
61d0: 68 65 20 6c 61 72 67 65 73 74 0a 20 20 20 20 2a  he largest.    *
61e0: 2a 20 65 6e 74 72 79 20 62 65 66 6f 72 65 20 69  * entry before i
61f0: 6e 73 65 72 74 69 6e 67 20 74 68 65 20 6e 65 77  nserting the new
6200: 20 6f 6e 65 2e 20 54 68 69 73 20 77 61 79 20 74   one. This way t
6210: 68 65 72 65 20 61 72 65 20 6e 65 76 65 72 20 6d  here are never m
6220: 6f 72 65 20 0a 20 20 20 20 2a 2a 20 74 68 61 6e  ore .    ** than
6230: 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 69 74   LIMIT+OFFSET it
6240: 65 6d 73 20 69 6e 20 74 68 65 20 73 6f 72 74 65  ems in the sorte
6250: 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  r..    **.    **
6260: 20 49 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f   If the new reco
6270: 72 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  rd does not need
6280: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20   to be inserted 
6290: 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2c  into the sorter,
62a0: 0a 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20  .    ** jump to 
62b0: 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69  the next iterati
62c0: 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  on of the loop. 
62d0: 49 66 20 74 68 65 20 70 53 6f 72 74 2d 3e 6c 61  If the pSort->la
62e0: 62 65 6c 4f 42 4c 6f 70 74 0a 20 20 20 20 2a 2a  belOBLopt.    **
62f0: 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 7a 65   value is not ze
6300: 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61  ro, then it is a
6310: 20 6c 61 62 65 6c 20 6f 66 20 77 68 65 72 65 20   label of where 
6320: 74 6f 20 6a 75 6d 70 2e 20 20 4f 74 68 65 72 77  to jump.  Otherw
6330: 69 73 65 2c 0a 20 20 20 20 2a 2a 20 6a 75 73 74  ise,.    ** just
6340: 20 62 79 70 61 73 73 20 74 68 65 20 72 6f 77 20   bypass the row 
6350: 69 6e 73 65 72 74 20 6c 6f 67 69 63 2e 20 20 53  insert logic.  S
6360: 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f  ee the header co
6370: 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 0a 20 20 20  mment on the.   
6380: 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65   ** sqlite3Where
6390: 4f 72 64 65 72 42 79 4c 69 6d 69 74 4f 70 74 4c  OrderByLimitOptL
63a0: 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20  abel() function 
63b0: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
63c0: 6e 66 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nfo..    */.    
63d0: 69 6e 74 20 69 43 73 72 20 3d 20 70 53 6f 72 74  int iCsr = pSort
63e0: 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 20 20  ->iECursor;.    
63f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6400: 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65 72  2(v, OP_IfNotZer
6410: 6f 2c 20 69 4c 69 6d 69 74 2c 20 73 71 6c 69 74  o, iLimit, sqlit
6420: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
6430: 72 28 76 29 2b 34 29 3b 0a 20 20 20 20 56 64 62  r(v)+4);.    Vdb
6440: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
6450: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6460: 4f 70 32 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20  Op2(v, OP_Last, 
6470: 69 43 73 72 2c 20 30 29 3b 0a 20 20 20 20 69 53  iCsr, 0);.    iS
6480: 6b 69 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  kip = sqlite3Vdb
6490: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
64a0: 5f 49 64 78 4c 45 2c 0a 20 20 20 20 20 20 20 20  _IdxLE,.        
64b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64c0: 20 20 20 20 20 20 20 20 20 69 43 73 72 2c 20 30           iCsr, 0
64d0: 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53 61 74  , regBase+nOBSat
64e0: 2c 20 6e 45 78 70 72 2d 6e 4f 42 53 61 74 29 3b  , nExpr-nOBSat);
64f0: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
6500: 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
6510: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
6520: 50 5f 44 65 6c 65 74 65 2c 20 69 43 73 72 29 3b  P_Delete, iCsr);
6530: 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67 52 65  .  }.  if( regRe
6540: 63 6f 72 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72  cord==0 ){.    r
6550: 65 67 52 65 63 6f 72 64 20 3d 20 6d 61 6b 65 53  egRecord = makeS
6560: 6f 72 74 65 72 52 65 63 6f 72 64 28 70 50 61 72  orterRecord(pPar
6570: 73 65 2c 20 70 53 6f 72 74 2c 20 70 53 65 6c 65  se, pSort, pSele
6580: 63 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 42 61  ct, regBase, nBa
6590: 73 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  se);.  }.  if( p
65a0: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
65b0: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
65c0: 72 74 65 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d  rter ){.    op =
65d0: 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74   OP_SorterInsert
65e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
65f0: 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  p = OP_IdxInsert
6600: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
6610: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
6620: 6f 70 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  op, pSort->iECur
6630: 73 6f 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a  sor, regRecord,.
6640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6650: 20 20 20 20 20 20 20 72 65 67 42 61 73 65 2b 6e         regBase+n
6660: 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42  OBSat, nBase-nOB
6670: 53 61 74 29 3b 0a 20 20 69 66 28 20 69 53 6b 69  Sat);.  if( iSki
6680: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
6690: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
66a0: 69 53 6b 69 70 2c 0a 20 20 20 20 20 20 20 20 20  iSkip,.         
66b0: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 4f 42 4c 6f  pSort->labelOBLo
66c0: 70 74 20 3f 20 70 53 6f 72 74 2d 3e 6c 61 62 65  pt ? pSort->labe
66d0: 6c 4f 42 4c 6f 70 74 20 3a 20 73 71 6c 69 74 65  lOBLopt : sqlite
66e0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
66f0: 28 76 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  (v));.  }.}../*.
6700: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69  ** Add code to i
6710: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46  mplement the OFF
6720: 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  SET.*/.static vo
6730: 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28 0a 20  id codeOffset(. 
6740: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
6750: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
6760: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d  ode into this VM
6770: 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 73 65   */.  int iOffse
6780: 74 2c 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  t,      /* Regis
6790: 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ter holding the 
67a0: 6f 66 66 73 65 74 20 63 6f 75 6e 74 65 72 20 2a  offset counter *
67b0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  /.  int iContinu
67c0: 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65  e     /* Jump he
67d0: 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63  re to skip the c
67e0: 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f  urrent record */
67f0: 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66 66 73 65  .){.  if( iOffse
6800: 74 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  t>0 ){.    sqlit
6810: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6820: 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65  OP_IfPos, iOffse
6830: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 31 29  t, iContinue, 1)
6840: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
6850: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
6860: 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54 22 29  nt((v, "OFFSET")
6870: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6880: 41 64 64 20 63 6f 64 65 20 74 68 61 74 20 77 69  Add code that wi
6890: 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65  ll check to make
68a0: 20 73 75 72 65 20 74 68 65 20 4e 20 72 65 67 69   sure the N regi
68b0: 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  sters starting a
68c0: 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61  t iMem.** form a
68d0: 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72 79 2e   distinct entry.
68e0: 20 20 69 54 61 62 20 69 73 20 61 20 73 6f 72 74    iTab is a sort
68f0: 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 68  ing index that h
6900: 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a  olds previously.
6910: 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74  ** seen combinat
6920: 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61  ions of the N va
6930: 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74  lues.  A new ent
6940: 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54  ry is made in iT
6950: 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72  ab.** if the cur
6960: 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72  rent N values ar
6970: 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a  e new..**.** A j
6980: 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70 65 61  ump to addrRepea
6990: 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68  t is made and th
69a0: 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65  e N+1 values are
69b0: 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65   popped from the
69c0: 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65  .** stack if the
69d0: 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20   top N elements 
69e0: 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74  are not distinct
69f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6a00: 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20   codeDistinct(. 
6a10: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
6a20: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
6a30: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
6a40: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
6a50: 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20 20  int iTab,       
6a60: 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20     /* A sorting 
6a70: 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74 65  index used to te
6a80: 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e  st for distinctn
6a90: 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ess */.  int add
6aa0: 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a  rRepeat,    /* J
6ab0: 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e  ump to here if n
6ac0: 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  ot distinct */. 
6ad0: 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20   int N,         
6ae0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6af0: 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69   elements */.  i
6b00: 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20  nt iMem         
6b10: 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d 65    /* First eleme
6b20: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  nt */.){.  Vdbe 
6b30: 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20  *v;.  int r1;.. 
6b40: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
6b50: 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74  be;.  r1 = sqlit
6b60: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
6b70: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  rse);.  sqlite3V
6b80: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
6b90: 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20  OP_Found, iTab, 
6ba0: 61 64 64 72 52 65 70 65 61 74 2c 20 69 4d 65 6d  addrRepeat, iMem
6bb0: 2c 20 4e 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , N); VdbeCovera
6bc0: 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
6bd0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6be0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65  _MakeRecord, iMe
6bf0: 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c  m, N, r1);.  sql
6c00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
6c10: 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
6c20: 74 2c 20 69 54 61 62 2c 20 72 31 2c 20 69 4d 65  t, iTab, r1, iMe
6c30: 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33  m, N);.  sqlite3
6c40: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
6c50: 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
6c60: 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  SULT);.  sqlite3
6c70: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
6c80: 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 23  Parse, r1);.}..#
6c90: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
6ca0: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
6cb0: 45 4e 43 45 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ENCES./*.** This
6cc0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
6cd0: 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 69  led as part of i
6ce0: 6e 6e 65 72 2d 6c 6f 6f 70 20 67 65 6e 65 72 61  nner-loop genera
6cf0: 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43  tion for a SELEC
6d00: 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77  T.** statement w
6d10: 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ith an ORDER BY 
6d20: 74 68 61 74 20 69 73 20 6e 6f 74 20 6f 70 74 69  that is not opti
6d30: 6d 69 7a 65 64 20 62 79 20 61 6e 20 69 6e 64 65  mized by an inde
6d40: 78 2e 20 49 74 20 0a 2a 2a 20 64 65 74 65 72 6d  x. It .** determ
6d50: 69 6e 65 73 20 74 68 65 20 65 78 70 72 65 73 73  ines the express
6d60: 69 6f 6e 73 2c 20 69 66 20 61 6e 79 2c 20 74 68  ions, if any, th
6d70: 61 74 20 74 68 65 20 73 6f 72 74 65 72 2d 72 65  at the sorter-re
6d80: 66 65 72 65 6e 63 65 20 0a 2a 2a 20 6f 70 74 69  ference .** opti
6d90: 6d 69 7a 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20  mization should 
6da0: 62 65 20 75 73 65 64 20 66 6f 72 2e 20 54 68 65  be used for. The
6db0: 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e 63   sorter-referenc
6dc0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a  e optimization.*
6dd0: 2a 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45  * is used for SE
6de0: 4c 45 43 54 20 71 75 65 72 69 65 73 20 6c 69 6b  LECT queries lik
6df0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  e:.**.**   SELEC
6e00: 54 20 61 2c 20 62 69 67 62 6c 6f 62 20 46 52 4f  T a, bigblob FRO
6e10: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 20  M t1 ORDER BY a 
6e20: 4c 49 4d 49 54 20 31 30 0a 2a 2a 0a 2a 2a 20 49  LIMIT 10.**.** I
6e30: 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
6e40: 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 20 65  on is used for e
6e50: 78 70 72 65 73 73 69 6f 6e 20 22 62 69 67 62 6c  xpression "bigbl
6e60: 6f 62 22 2c 20 74 68 65 6e 20 69 6e 73 74 65 61  ob", then instea
6e70: 64 20 6f 66 0a 2a 2a 20 73 74 6f 72 69 6e 67 20  d of.** storing 
6e80: 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d  values read from
6e90: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 6e 20   that column in 
6ea0: 74 68 65 20 73 6f 72 74 65 72 20 72 65 63 6f 72  the sorter recor
6eb0: 64 73 2c 20 74 68 65 20 50 4b 20 6f 66 0a 2a 2a  ds, the PK of.**
6ec0: 20 74 68 65 20 72 6f 77 20 66 72 6f 6d 20 74 61   the row from ta
6ed0: 62 6c 65 20 74 31 20 69 73 20 73 74 6f 72 65 64  ble t1 is stored
6ee0: 20 69 6e 73 74 65 61 64 2e 20 54 68 65 6e 2c 20   instead. Then, 
6ef0: 61 73 20 72 65 63 6f 72 64 73 20 61 72 65 20 65  as records are e
6f00: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 0a 2a 2a  xtracted from.**
6f10: 20 74 68 65 20 73 6f 72 74 65 72 20 74 6f 20 72   the sorter to r
6f20: 65 74 75 72 6e 20 74 6f 20 74 68 65 20 75 73 65  eturn to the use
6f30: 72 2c 20 74 68 65 20 72 65 71 75 69 72 65 64 20  r, the required 
6f40: 76 61 6c 75 65 20 6f 66 20 62 69 67 62 6c 6f 62  value of bigblob
6f50: 20 69 73 0a 2a 2a 20 72 65 74 72 69 65 76 65 64   is.** retrieved
6f60: 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74   directly from t
6f70: 61 62 6c 65 20 74 31 2e 20 49 66 20 74 68 65 20  able t1. If the 
6f80: 76 61 6c 75 65 73 20 61 72 65 20 76 65 72 79 20  values are very 
6f90: 6c 61 72 67 65 2c 20 74 68 69 73 20 0a 2a 2a 20  large, this .** 
6fa0: 63 61 6e 20 62 65 20 6d 6f 72 65 20 65 66 66 69  can be more effi
6fb0: 63 69 65 6e 74 20 74 68 61 6e 20 73 74 6f 72 69  cient than stori
6fc0: 6e 67 20 74 68 65 6d 20 64 69 72 65 63 74 6c 79  ng them directly
6fd0: 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 20 72   in the sorter r
6fe0: 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ecords..**.** Th
6ff0: 65 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2e  e ExprList_item.
7000: 62 53 6f 72 74 65 72 52 65 66 20 66 6c 61 67 20  bSorterRef flag 
7010: 69 73 20 73 65 74 20 66 6f 72 20 65 61 63 68 20  is set for each 
7020: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 70 45  expression in pE
7030: 4c 69 73 74 20 0a 2a 2a 20 66 6f 72 20 77 68 69  List .** for whi
7040: 63 68 20 74 68 65 20 73 6f 72 74 65 72 2d 72 65  ch the sorter-re
7050: 66 65 72 65 6e 63 65 20 6f 70 74 69 6d 69 7a 61  ference optimiza
7060: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 65  tion should be e
7070: 6e 61 62 6c 65 64 2e 20 0a 2a 2a 20 41 64 64 69  nabled. .** Addi
7080: 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 70 53  tionally, the pS
7090: 6f 72 74 2d 3e 61 44 65 66 65 72 5b 5d 20 61 72  ort->aDefer[] ar
70a0: 72 61 79 20 69 73 20 70 6f 70 75 6c 61 74 65 64  ray is populated
70b0: 20 77 69 74 68 20 65 6e 74 72 69 65 73 0a 2a 2a   with entries.**
70c0: 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72 73   for all cursors
70d0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 65 76 61   required to eva
70e0: 6c 75 61 74 65 20 61 6c 6c 20 73 65 6c 65 63 74  luate all select
70f0: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  ed expressions. 
7100: 46 69 6e 61 6c 6c 79 2e 0a 2a 2a 20 6f 75 74 70  Finally..** outp
7110: 75 74 20 76 61 72 69 61 62 6c 65 20 28 2a 70 70  ut variable (*pp
7120: 45 78 74 72 61 29 20 69 73 20 73 65 74 20 74 6f  Extra) is set to
7130: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
7140: 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a  ist containing.*
7150: 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f  * expressions fo
7160: 72 20 61 6c 6c 20 65 78 74 72 61 20 50 4b 20 76  r all extra PK v
7170: 61 6c 75 65 73 20 74 68 61 74 20 73 68 6f 75 6c  alues that shoul
7180: 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  d be stored in t
7190: 68 65 0a 2a 2a 20 73 6f 72 74 65 72 20 72 65 63  he.** sorter rec
71a0: 6f 72 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ords..*/.static 
71b0: 76 6f 69 64 20 73 65 6c 65 63 74 45 78 70 72 44  void selectExprD
71c0: 65 66 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  efer(.  Parse *p
71d0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
71e0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65          /* Leave
71f0: 20 61 6e 79 20 65 72 72 6f 72 20 68 65 72 65 20   any error here 
7200: 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53  */.  SortCtx *pS
7210: 6f 72 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ort,            
7220: 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72 20 63       /* Sorter c
7230: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
7240: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20  List *pEList,   
7250: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
7260: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 73 74 69  xpressions desti
7270: 6e 65 64 20 66 6f 72 20 73 6f 72 74 65 72 20 2a  ned for sorter *
7280: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70  /.  ExprList **p
7290: 70 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  pExtra          
72a0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
72b0: 6e 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  ns to append to 
72c0: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f  sorter record */
72d0: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
72e0: 6e 74 20 6e 44 65 66 65 72 20 3d 20 30 3b 0a 20  nt nDefer = 0;. 
72f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 78 74 72   ExprList *pExtr
7300: 61 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  a = 0;.  for(i=0
7310: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
7320: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  r; i++){.    str
7330: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
7340: 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 45 4c 69  m *pItem = &pELi
7350: 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 69 66  st->a[i];.    if
7360: 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
7370: 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 7b 0a 20  derByCol==0 ){. 
7380: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
7390: 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
73a0: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
73b0: 61 62 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54  ab = pExpr->y.pT
73c0: 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  ab;.      if( pE
73d0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
73e0: 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  MN && pExpr->iCo
73f0: 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 54 61 62 20  lumn>=0 && pTab 
7400: 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  && !IsVirtual(pT
7410: 61 62 29 0a 20 20 20 20 20 20 20 26 26 20 28 70  ab).       && (p
7420: 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  Tab->aCol[pExpr-
7430: 3e 69 43 6f 6c 75 6d 6e 5d 2e 63 6f 6c 46 6c 61  >iColumn].colFla
7440: 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 53 4f 52  gs & COLFLAG_SOR
7450: 54 45 52 52 45 46 29 0a 20 20 20 20 20 20 29 7b  TERREF).      ){
7460: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
7470: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
7480: 20 6a 3c 6e 44 65 66 65 72 3b 20 6a 2b 2b 29 7b   j<nDefer; j++){
7490: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
74a0: 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6a 5d 2e  Sort->aDefer[j].
74b0: 69 43 73 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61  iCsr==pExpr->iTa
74c0: 62 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ble ) break;.   
74d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
74e0: 66 28 20 6a 3d 3d 6e 44 65 66 65 72 20 29 7b 0a  f( j==nDefer ){.
74f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 44            if( nD
7500: 65 66 65 72 3d 3d 41 72 72 61 79 53 69 7a 65 28  efer==ArraySize(
7510: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 29 20 29  pSort->aDefer) )
7520: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
7530: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
7540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7550: 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20       int nKey = 
7560: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  1;.            i
7570: 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt k;.          
7580: 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30    Index *pPk = 0
7590: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
75a0: 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
75b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
75c0: 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33     pPk = sqlite3
75d0: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
75e0: 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 20  pTab);.         
75f0: 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 50 6b 2d       nKey = pPk-
7600: 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20  >nKeyCol;.      
7610: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7620: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e      for(k=0; k<n
7630: 4b 65 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  Key; k++){.     
7640: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
7650: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78  New = sqlite3PEx
7660: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 43 4f  pr(pParse, TK_CO
7670: 4c 55 4d 4e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  LUMN, 0, 0);.   
7680: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
7690: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  New ){.         
76a0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 54 61         pNew->iTa
76b0: 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  ble = pExpr->iTa
76c0: 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ble;.           
76d0: 20 20 20 20 20 70 4e 65 77 2d 3e 79 2e 70 54 61       pNew->y.pTa
76e0: 62 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54 61  b = pExpr->y.pTa
76f0: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b;.             
7700: 20 20 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e     pNew->iColumn
7710: 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 61 69   = pPk ? pPk->ai
7720: 43 6f 6c 75 6d 6e 5b 6b 5d 20 3a 20 2d 31 3b 0a  Column[k] : -1;.
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 70 45 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33  pExtra = sqlite3
7750: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
7760: 50 61 72 73 65 2c 20 70 45 78 74 72 61 2c 20 70  Parse, pExtra, p
7770: 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20  New);.          
7780: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7790: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
77a0: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6e 44  pSort->aDefer[nD
77b0: 65 66 65 72 5d 2e 70 54 61 62 20 3d 20 70 45 78  efer].pTab = pEx
77c0: 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20  pr->y.pTab;.    
77d0: 20 20 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 61          pSort->a
77e0: 44 65 66 65 72 5b 6e 44 65 66 65 72 5d 2e 69 43  Defer[nDefer].iC
77f0: 73 72 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  sr = pExpr->iTab
7800: 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  le;.            
7810: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6e 44  pSort->aDefer[nD
7820: 65 66 65 72 5d 2e 6e 4b 65 79 20 3d 20 6e 4b 65  efer].nKey = nKe
7830: 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  y;.            n
7840: 44 65 66 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20  Defer++;.       
7850: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
7860: 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 62 53         pItem->bS
7870: 6f 72 74 65 72 52 65 66 20 3d 20 31 3b 0a 20 20  orterRef = 1;.  
7880: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7890: 20 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 20    pSort->nDefer 
78a0: 3d 20 28 75 38 29 6e 44 65 66 65 72 3b 0a 20 20  = (u8)nDefer;.  
78b0: 2a 70 70 45 78 74 72 61 20 3d 20 70 45 78 74 72  *ppExtra = pExtr
78c0: 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  a;.}.#endif../*.
78d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
78e0: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
78f0: 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64  de for the insid
7900: 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  e of the inner l
7910: 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45  oop.** of a SELE
7920: 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63  CT..**.** If src
7930: 54 61 62 20 69 73 20 6e 65 67 61 74 69 76 65 2c  Tab is negative,
7940: 20 74 68 65 6e 20 74 68 65 20 70 2d 3e 70 45 4c   then the p->pEL
7950: 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  ist expressions.
7960: 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ** are evaluated
7970: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
7980: 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   the data for th
7990: 69 73 20 72 6f 77 2e 20 20 49 66 20 73 72 63 54  is row.  If srcT
79a0: 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72  ab is.** zero or
79b0: 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64 61 74 61   more, then data
79c0: 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20   is pulled from 
79d0: 73 72 63 54 61 62 20 61 6e 64 20 70 2d 3e 70 45  srcTab and p->pE
79e0: 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c  List is used onl
79f0: 79 20 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65  y .** to get the
7a00: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
7a10: 6e 73 20 61 6e 64 20 74 68 65 20 63 6f 6c 6c 61  ns and the colla
7a20: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
7a30: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a  r each column..*
7a40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
7a50: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20  lectInnerLoop(. 
7a60: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
7a70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7a80: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
7a90: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
7aa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7ab0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65  he complete sele
7ac0: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  ct statement bei
7ad0: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  ng coded */.  in
7ae0: 74 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20  t srcTab,       
7af0: 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61        /* Pull da
7b00: 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62  ta from this tab
7b10: 6c 65 20 69 66 20 6e 6f 6e 2d 6e 65 67 61 74 69  le if non-negati
7b20: 76 65 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20  ve */.  SortCtx 
7b30: 2a 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20  *pSort,         
7b40: 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  /* If not NULL, 
7b50: 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70  info on how to p
7b60: 72 6f 63 65 73 73 20 4f 52 44 45 52 20 42 59 20  rocess ORDER BY 
7b70: 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78  */.  DistinctCtx
7b80: 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20   *pDistinct, /* 
7b90: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66  If not NULL, inf
7ba0: 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63  o on how to proc
7bb0: 65 73 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a  ess DISTINCT */.
7bc0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
7bd0: 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77  est,      /* How
7be0: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74   to dispose of t
7bf0: 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
7c00: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20  int iContinue,  
7c10: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
7c20: 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65  here to continue
7c30: 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a   with next row *
7c40: 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20  /.  int iBreak  
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
7c60: 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61  ump here to brea
7c70: 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e  k out of the inn
7c80: 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20  er loop */.){.  
7c90: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
7ca0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
7cb0: 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74 69  ;.  int hasDisti
7cc0: 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nct;            
7cd0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
7ce0: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
7cf0: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
7d00: 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73  int eDest = pDes
7d10: 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48  t->eDest;   /* H
7d20: 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
7d30: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
7d40: 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d  t iParm = pDest-
7d50: 3e 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72  >iSDParm; /* Fir
7d60: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64  st argument to d
7d70: 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a  isposal method *
7d80: 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43  /.  int nResultC
7d90: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
7da0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
7db0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ult columns */. 
7dc0: 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20   int nPrefixReg 
7dd0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
7de0: 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
7df0: 72 65 67 69 73 74 65 72 73 20 62 65 66 6f 72 65  registers before
7e00: 20 72 65 67 52 65 73 75 6c 74 20 2a 2f 0a 20 20   regResult */.  
7e10: 52 6f 77 4c 6f 61 64 49 6e 66 6f 20 73 52 6f 77  RowLoadInfo sRow
7e20: 4c 6f 61 64 49 6e 66 6f 3b 20 20 20 2f 2a 20 49  LoadInfo;   /* I
7e30: 6e 66 6f 20 66 6f 72 20 64 65 66 65 72 72 65 64  nfo for deferred
7e40: 20 72 6f 77 20 6c 6f 61 64 69 6e 67 20 2a 2f 0a   row loading */.
7e50: 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 2c 20 72  .  /* Usually, r
7e60: 65 67 52 65 73 75 6c 74 20 69 73 20 74 68 65 20  egResult is the 
7e70: 66 69 72 73 74 20 63 65 6c 6c 20 69 6e 20 61 6e  first cell in an
7e80: 20 61 72 72 61 79 20 6f 66 20 6d 65 6d 6f 72 79   array of memory
7e90: 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 63 6f 6e 74   cells.  ** cont
7ea0: 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65  aining the curre
7eb0: 6e 74 20 72 65 73 75 6c 74 20 72 6f 77 2e 20 49  nt result row. I
7ec0: 6e 20 74 68 69 73 20 63 61 73 65 20 72 65 67 4f  n this case regO
7ed0: 72 69 67 20 69 73 20 73 65 74 20 74 6f 20 74 68  rig is set to th
7ee0: 65 0a 20 20 2a 2a 20 73 61 6d 65 20 76 61 6c 75  e.  ** same valu
7ef0: 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  e. However, if t
7f00: 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 62  he results are b
7f10: 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 74 68 65  eing sent to the
7f20: 20 73 6f 72 74 65 72 2c 20 74 68 65 0a 20 20 2a   sorter, the.  *
7f30: 2a 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6e 79  * values for any
7f40: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
7f50: 74 20 61 72 65 20 61 6c 73 6f 20 70 61 72 74 20  t are also part 
7f60: 6f 66 20 74 68 65 20 73 6f 72 74 2d 6b 65 79 20  of the sort-key 
7f70: 61 72 65 20 6f 6d 69 74 74 65 64 0a 20 20 2a 2a  are omitted.  **
7f80: 20 66 72 6f 6d 20 74 68 69 73 20 61 72 72 61 79   from this array
7f90: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 72  . In this case r
7fa0: 65 67 4f 72 69 67 20 69 73 20 73 65 74 20 74 6f  egOrig is set to
7fb0: 20 7a 65 72 6f 2e 20 20 2a 2f 0a 20 20 69 6e 74   zero.  */.  int
7fc0: 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20   regResult;     
7fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72           /* Star
7fe0: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64  t of memory hold
7ff0: 69 6e 67 20 63 75 72 72 65 6e 74 20 72 65 73 75  ing current resu
8000: 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  lts */.  int reg
8010: 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20 20  Orig;           
8020: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
8030: 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20   memory holding 
8040: 66 75 6c 6c 20 72 65 73 75 6c 74 20 28 6f 72 20  full result (or 
8050: 30 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  0) */..  assert(
8060: 20 76 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20   v );.  assert( 
8070: 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  p->pEList!=0 );.
8080: 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20    hasDistinct = 
8090: 70 44 69 73 74 69 6e 63 74 20 3f 20 70 44 69 73  pDistinct ? pDis
80a0: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
80b0: 20 3a 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   : WHERE_DISTINC
80c0: 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53  T_NOOP;.  if( pS
80d0: 6f 72 74 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f  ort && pSort->pO
80e0: 72 64 65 72 42 79 3d 3d 30 20 29 20 70 53 6f 72  rderBy==0 ) pSor
80f0: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53 6f  t = 0;.  if( pSo
8100: 72 74 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73  rt==0 && !hasDis
8110: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73  tinct ){.    ass
8120: 65 72 74 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d  ert( iContinue!=
8130: 30 20 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  0 );.    codeOff
8140: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
8150: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  t, iContinue);. 
8160: 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68   }..  /* Pull th
8170: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75  e requested colu
8180: 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73  mns..  */.  nRes
8190: 75 6c 74 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69  ultCol = p->pELi
81a0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66  st->nExpr;..  if
81b0: 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d  ( pDest->iSdst==
81c0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 6f  0 ){.    if( pSo
81d0: 72 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 72 65  rt ){.      nPre
81e0: 66 69 78 52 65 67 20 3d 20 70 53 6f 72 74 2d 3e  fixReg = pSort->
81f0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
8200: 0a 20 20 20 20 20 20 69 66 28 20 21 28 70 53 6f  .      if( !(pSo
8210: 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20  rt->sortFlags & 
8220: 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
8230: 65 72 29 20 29 20 6e 50 72 65 66 69 78 52 65 67  er) ) nPrefixReg
8240: 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ++;.      pParse
8250: 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 72 65 66 69  ->nMem += nPrefi
8260: 78 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20  xReg;.    }.    
8270: 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 70  pDest->iSdst = p
8280: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
8290: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
82a0: 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20  += nResultCol;. 
82b0: 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65 73 74   }else if( pDest
82c0: 2d 3e 69 53 64 73 74 2b 6e 52 65 73 75 6c 74 43  ->iSdst+nResultC
82d0: 6f 6c 20 3e 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ol > pParse->nMe
82e0: 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  m ){.    /* This
82f0: 20 69 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 6e   is an error con
8300: 64 69 74 69 6f 6e 20 74 68 61 74 20 63 61 6e 20  dition that can 
8310: 72 65 73 75 6c 74 2c 20 66 6f 72 20 65 78 61 6d  result, for exam
8320: 70 6c 65 2c 20 77 68 65 6e 20 61 20 53 45 4c 45  ple, when a SELE
8330: 43 54 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  CT.    ** on the
8340: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
8350: 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 20 63 6f   of an INSERT co
8360: 6e 74 61 69 6e 73 20 6d 6f 72 65 20 72 65 73 75  ntains more resu
8370: 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a  lt columns than.
8380: 20 20 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65      ** there are
8390: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
83a0: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66  table on the lef
83b0: 74 2e 20 20 54 68 65 20 65 72 72 6f 72 20 77 69  t.  The error wi
83c0: 6c 6c 20 62 65 20 63 61 75 67 68 74 0a 20 20 20  ll be caught.   
83d0: 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72 74 65 64   ** and reported
83e0: 20 6c 61 74 65 72 2e 20 20 42 75 74 20 77 65 20   later.  But we 
83f0: 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  need to make sur
8400: 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20  e enough memory 
8410: 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20  is allocated.   
8420: 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 6f 74 68   ** to avoid oth
8430: 65 72 20 73 70 75 72 69 6f 75 73 20 65 72 72 6f  er spurious erro
8440: 72 73 20 69 6e 20 74 68 65 20 6d 65 61 6e 74 69  rs in the meanti
8450: 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 72 73  me. */.    pPars
8460: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75  e->nMem += nResu
8470: 6c 74 43 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44 65  ltCol;.  }.  pDe
8480: 73 74 2d 3e 6e 53 64 73 74 20 3d 20 6e 52 65 73  st->nSdst = nRes
8490: 75 6c 74 43 6f 6c 3b 0a 20 20 72 65 67 4f 72 69  ultCol;.  regOri
84a0: 67 20 3d 20 72 65 67 52 65 73 75 6c 74 20 3d 20  g = regResult = 
84b0: 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20  pDest->iSdst;.  
84c0: 69 66 28 20 73 72 63 54 61 62 3e 3d 30 20 29 7b  if( srcTab>=0 ){
84d0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
84e0: 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29  nResultCol; i++)
84f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
8500: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
8510: 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20  Column, srcTab, 
8520: 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b  i, regResult+i);
8530: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
8540: 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 2d 3e  nt((v, "%s", p->
8550: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
8560: 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  me));.    }.  }e
8570: 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53  lse if( eDest!=S
8580: 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 23 69 66  RT_Exists ){.#if
8590: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
85a0: 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
85b0: 43 45 53 0a 20 20 20 20 45 78 70 72 4c 69 73 74  CES.    ExprList
85c0: 20 2a 70 45 78 74 72 61 20 3d 20 30 3b 0a 23 65   *pExtra = 0;.#e
85d0: 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74  ndif.    /* If t
85e0: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  he destination i
85f0: 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29  s an EXISTS(...)
8600: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
8610: 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76   actual.    ** v
8620: 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20 62  alues returned b
8630: 79 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65  y the SELECT are
8640: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20   not required.. 
8650: 20 20 20 2a 2f 0a 20 20 20 20 75 38 20 65 63 65     */.    u8 ece
8660: 6c 46 6c 61 67 73 3b 20 20 20 20 2f 2a 20 22 65  lFlags;    /* "e
8670: 63 65 6c 22 20 69 73 20 61 6e 20 61 62 62 72 65  cel" is an abbre
8680: 76 69 61 74 69 6f 6e 20 6f 66 20 22 45 78 70 72  viation of "Expr
8690: 43 6f 64 65 45 78 70 72 4c 69 73 74 22 20 2a 2f  CodeExprList" */
86a0: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
86b0: 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 65  EList;.    if( e
86c0: 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c  Dest==SRT_Mem ||
86d0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
86e0: 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ut || eDest==SRT
86f0: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  _Coroutine ){.  
8700: 20 20 20 20 65 63 65 6c 46 6c 61 67 73 20 3d 20      ecelFlags = 
8710: 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 3b  SQLITE_ECEL_DUP;
8720: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8730: 20 20 65 63 65 6c 46 6c 61 67 73 20 3d 20 30 3b    ecelFlags = 0;
8740: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
8750: 53 6f 72 74 20 26 26 20 68 61 73 44 69 73 74 69  Sort && hasDisti
8760: 6e 63 74 3d 3d 30 20 26 26 20 65 44 65 73 74 21  nct==0 && eDest!
8770: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 26 26  =SRT_EphemTab &&
8780: 20 65 44 65 73 74 21 3d 53 52 54 5f 54 61 62 6c   eDest!=SRT_Tabl
8790: 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f  e ){.      /* Fo
87a0: 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  r each expressio
87b0: 6e 20 69 6e 20 70 2d 3e 70 45 4c 69 73 74 20 74  n in p->pEList t
87c0: 68 61 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66  hat is a copy of
87d0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
87e0: 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 4f  n.      ** the O
87f0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 28  RDER BY clause (
8800: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 29  pSort->pOrderBy)
8810: 2c 20 73 65 74 20 74 68 65 20 61 73 73 6f 63 69  , set the associ
8820: 61 74 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 69  ated .      ** i
8830: 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65  OrderByCol value
8840: 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61   to one more tha
8850: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  n the index of t
8860: 68 65 20 4f 52 44 45 52 20 42 59 20 0a 20 20 20  he ORDER BY .   
8870: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
8880: 20 77 69 74 68 69 6e 20 74 68 65 20 73 6f 72 74   within the sort
8890: 2d 6b 65 79 20 74 68 61 74 20 70 75 73 68 4f 6e  -key that pushOn
88a0: 74 6f 53 6f 72 74 65 72 28 29 20 77 69 6c 6c 20  toSorter() will 
88b0: 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 20 20  generate..      
88c0: 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74  ** This allows t
88d0: 68 65 20 70 2d 3e 70 45 4c 69 73 74 20 66 69 65  he p->pEList fie
88e0: 6c 64 20 74 6f 20 62 65 20 6f 6d 69 74 74 65 64  ld to be omitted
88f0: 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 64   from the sorted
8900: 20 72 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 2a   record,.      *
8910: 2a 20 73 61 76 69 6e 67 20 73 70 61 63 65 20 61  * saving space a
8920: 6e 64 20 43 50 55 20 63 79 63 6c 65 73 2e 20 20  nd CPU cycles.  
8930: 2a 2f 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61  */.      ecelFla
8940: 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 45 43  gs |= (SQLITE_EC
8950: 45 4c 5f 4f 4d 49 54 52 45 46 7c 53 51 4c 49 54  EL_OMITREF|SQLIT
8960: 45 5f 45 43 45 4c 5f 52 45 46 29 3b 0a 0a 20 20  E_ECEL_REF);..  
8970: 20 20 20 20 66 6f 72 28 69 3d 70 53 6f 72 74 2d      for(i=pSort-
8980: 3e 6e 4f 42 53 61 74 3b 20 69 3c 70 53 6f 72 74  >nOBSat; i<pSort
8990: 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
89a0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
89b0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
89c0: 69 66 28 20 28 6a 20 3d 20 70 53 6f 72 74 2d 3e  if( (j = pSort->
89d0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75  pOrderBy->a[i].u
89e0: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e  .x.iOrderByCol)>
89f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
8a00: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 2d 31 5d  ->pEList->a[j-1]
8a10: 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
8a20: 20 3d 20 69 2b 31 2d 70 53 6f 72 74 2d 3e 6e 4f   = i+1-pSort->nO
8a30: 42 53 61 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BSat;.        }.
8a40: 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
8a50: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52  QLITE_ENABLE_SOR
8a60: 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20  TER_REFERENCES. 
8a70: 20 20 20 20 20 73 65 6c 65 63 74 45 78 70 72 44       selectExprD
8a80: 65 66 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f  efer(pParse, pSo
8a90: 72 74 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 26  rt, p->pEList, &
8aa0: 70 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 69  pExtra);.      i
8ab0: 66 28 20 70 45 78 74 72 61 20 26 26 20 70 50 61  f( pExtra && pPa
8ac0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
8ad0: 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ailed==0 ){.    
8ae0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
8af0: 61 72 65 20 61 6e 79 20 65 78 74 72 61 20 50 4b  are any extra PK
8b00: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 61 64 64 20   columns to add 
8b10: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 20 72 65  to the sorter re
8b20: 63 6f 72 64 73 2c 0a 20 20 20 20 20 20 20 20 2a  cords,.        *
8b30: 2a 20 61 6c 6c 6f 63 61 74 65 20 65 78 74 72 61  * allocate extra
8b40: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e   memory cells an
8b50: 64 20 61 64 6a 75 73 74 20 74 68 65 20 4f 70 65  d adjust the Ope
8b60: 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20  nEphemeral .    
8b70: 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
8b80: 6f 6e 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f  on to account fo
8b90: 72 20 74 68 65 20 6c 61 72 67 65 72 20 72 65 63  r the larger rec
8ba0: 6f 72 64 73 2e 20 54 68 69 73 20 69 73 20 6f 6e  ords. This is on
8bb0: 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  ly.        ** re
8bc0: 71 75 69 72 65 64 20 69 66 20 74 68 65 72 65 20  quired if there 
8bd0: 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  are one or more 
8be0: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
8bf0: 62 6c 65 73 20 77 69 74 68 0a 20 20 20 20 20 20  bles with.      
8c00: 20 20 2a 2a 20 63 6f 6d 70 6f 73 69 74 65 20 70    ** composite p
8c10: 72 69 6d 61 72 79 20 6b 65 79 73 20 69 6e 20 74  rimary keys in t
8c20: 68 65 20 53 6f 72 74 43 74 78 2e 61 44 65 66 65  he SortCtx.aDefe
8c30: 72 5b 5d 20 61 72 72 61 79 2e 20 20 2a 2f 0a 20  r[] array.  */. 
8c40: 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70         VdbeOp *p
8c50: 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
8c60: 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d 3e  GetOp(v, pSort->
8c70: 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a  addrSortIndex);.
8c80: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
8c90: 2b 3d 20 28 70 45 78 74 72 61 2d 3e 6e 45 78 70  += (pExtra->nExp
8ca0: 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65  r - pSort->nDefe
8cb0: 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  r);.        pOp-
8cc0: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41  >p4.pKeyInfo->nA
8cd0: 6c 6c 46 69 65 6c 64 20 2b 3d 20 28 70 45 78 74  llField += (pExt
8ce0: 72 61 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72  ra->nExpr - pSor
8cf0: 74 2d 3e 6e 44 65 66 65 72 29 3b 0a 20 20 20 20  t->nDefer);.    
8d00: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
8d10: 20 2b 3d 20 70 45 78 74 72 61 2d 3e 6e 45 78 70   += pExtra->nExp
8d20: 72 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  r;.      }.#endi
8d30: 66 0a 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75  f..      /* Adju
8d40: 73 74 20 6e 52 65 73 75 6c 74 43 6f 6c 20 74 6f  st nResultCol to
8d50: 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 63 6f 6c   account for col
8d60: 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6f 6d  umns that are om
8d70: 69 74 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 66  itted.      ** f
8d80: 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 62  rom the sorter b
8d90: 79 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  y the optimizati
8da0: 6f 6e 73 20 69 6e 20 74 68 69 73 20 62 72 61 6e  ons in this bran
8db0: 63 68 20 2a 2f 0a 20 20 20 20 20 20 70 45 4c 69  ch */.      pELi
8dc0: 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
8dd0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
8de0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
8df0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
8e00: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 75  ( pEList->a[i].u
8e10: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30  .x.iOrderByCol>0
8e20: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
8e30: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
8e40: 45 52 45 4e 43 45 53 0a 20 20 20 20 20 20 20 20  ERENCES.        
8e50: 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d   || pEList->a[i]
8e60: 2e 62 53 6f 72 74 65 72 52 65 66 0a 23 65 6e 64  .bSorterRef.#end
8e70: 69 66 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  if.        ){.  
8e80: 20 20 20 20 20 20 20 20 6e 52 65 73 75 6c 74 43          nResultC
8e90: 6f 6c 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20  ol--;.          
8ea0: 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a 20 20 20  regOrig = 0;.   
8eb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
8ec0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
8ed0: 72 65 67 4f 72 69 67 20 29 3b 0a 20 20 20 20 20  regOrig );.     
8ee0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
8ef0: 3d 3d 53 52 54 5f 53 65 74 20 29 3b 0a 20 20 20  ==SRT_Set );.   
8f00: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
8f10: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 3b 0a 20  st==SRT_Mem );. 
8f20: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
8f30: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
8f40: 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ine );.      tes
8f50: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
8f60: 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
8f70: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
8f80: 3d 53 52 54 5f 53 65 74 20 7c 7c 20 65 44 65 73  =SRT_Set || eDes
8f90: 74 3d 3d 53 52 54 5f 4d 65 6d 20 0a 20 20 20 20  t==SRT_Mem .    
8fa0: 20 20 20 20 20 20 20 7c 7c 20 65 44 65 73 74 3d         || eDest=
8fb0: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 7c  =SRT_Coroutine |
8fc0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  | eDest==SRT_Out
8fd0: 70 75 74 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  put );.    }.   
8fe0: 20 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 2e 72 65   sRowLoadInfo.re
8ff0: 67 52 65 73 75 6c 74 20 3d 20 72 65 67 52 65 73  gResult = regRes
9000: 75 6c 74 3b 0a 20 20 20 20 73 52 6f 77 4c 6f 61  ult;.    sRowLoa
9010: 64 49 6e 66 6f 2e 65 63 65 6c 46 6c 61 67 73 20  dInfo.ecelFlags 
9020: 3d 20 65 63 65 6c 46 6c 61 67 73 3b 0a 23 69 66  = ecelFlags;.#if
9030: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
9040: 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
9050: 43 45 53 0a 20 20 20 20 73 52 6f 77 4c 6f 61 64  CES.    sRowLoad
9060: 49 6e 66 6f 2e 70 45 78 74 72 61 20 3d 20 70 45  Info.pExtra = pE
9070: 78 74 72 61 3b 0a 20 20 20 20 73 52 6f 77 4c 6f  xtra;.    sRowLo
9080: 61 64 49 6e 66 6f 2e 72 65 67 45 78 74 72 61 52  adInfo.regExtraR
9090: 65 73 75 6c 74 20 3d 20 72 65 67 52 65 73 75 6c  esult = regResul
90a0: 74 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a  t + nResultCol;.
90b0: 20 20 20 20 69 66 28 20 70 45 78 74 72 61 20 29      if( pExtra )
90c0: 20 6e 52 65 73 75 6c 74 43 6f 6c 20 2b 3d 20 70   nResultCol += p
90d0: 45 78 74 72 61 2d 3e 6e 45 78 70 72 3b 0a 23 65  Extra->nExpr;.#e
90e0: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 2d 3e  ndif.    if( p->
90f0: 69 4c 69 6d 69 74 0a 20 20 20 20 20 26 26 20 28  iLimit.     && (
9100: 65 63 65 6c 46 6c 61 67 73 20 26 20 53 51 4c 49  ecelFlags & SQLI
9110: 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 29  TE_ECEL_OMITREF)
9120: 21 3d 30 20 0a 20 20 20 20 20 26 26 20 6e 50 72  !=0 .     && nPr
9130: 65 66 69 78 52 65 67 3e 30 0a 20 20 20 20 29 7b  efixReg>0.    ){
9140: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9150: 53 6f 72 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Sort!=0 );.     
9160: 20 61 73 73 65 72 74 28 20 68 61 73 44 69 73 74   assert( hasDist
9170: 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  inct==0 );.     
9180: 20 70 53 6f 72 74 2d 3e 70 44 65 66 65 72 72 65   pSort->pDeferre
9190: 64 52 6f 77 4c 6f 61 64 20 3d 20 26 73 52 6f 77  dRowLoad = &sRow
91a0: 4c 6f 61 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20  LoadInfo;.      
91b0: 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a 20 20 20  regOrig = 0;.   
91c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
91d0: 6e 65 72 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28 70  nerLoopLoadRow(p
91e0: 50 61 72 73 65 2c 20 70 2c 20 26 73 52 6f 77 4c  Parse, p, &sRowL
91f0: 6f 61 64 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  oadInfo);.    }.
9200: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
9210: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
9220: 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e  d was present on
9230: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
9240: 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74  ement.  ** and t
9250: 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e  his row has been
9260: 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68   seen before, th
9270: 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74  en do not make t
9280: 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72  his row.  ** par
9290: 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e  t of the result.
92a0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44  .  */.  if( hasD
92b0: 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73  istinct ){.    s
92c0: 77 69 74 63 68 28 20 70 44 69 73 74 69 6e 63 74  witch( pDistinct
92d0: 2d 3e 65 54 6e 63 74 54 79 70 65 20 29 7b 0a 20  ->eTnctType ){. 
92e0: 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
92f0: 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
9300: 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  : {.        Vdbe
9310: 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20  Op *pOp;        
9320: 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72      /* No longer
9330: 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e 45 70   required OpenEp
9340: 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a  hemeral instr. *
9350: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a  /.        int iJ
9360: 75 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  ump;            
9370: 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e    /* Jump destin
9380: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ation */.       
9390: 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
93a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
93b0: 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74  ious row content
93c0: 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   */..        /* 
93d0: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
93e0: 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  or the previous 
93f0: 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  row */.        r
9400: 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d  egPrev = pParse-
9410: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20  >nMem+1;.       
9420: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
9430: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20   nResultCol;..  
9440: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20        /* Change 
9450: 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  the OP_OpenEphem
9460: 65 72 61 6c 20 63 6f 64 65 64 20 65 61 72 6c 69  eral coded earli
9470: 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c  er to an OP_Null
9480: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 73  .        ** sets
9490: 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64   the MEM_Cleared
94a0: 20 62 69 74 20 6f 6e 20 74 68 65 20 66 69 72 73   bit on the firs
94b0: 74 20 72 65 67 69 73 74 65 72 20 6f 66 20 74 68  t register of th
94c0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  e.        ** pre
94d0: 76 69 6f 75 73 20 76 61 6c 75 65 2e 20 20 54 68  vious value.  Th
94e0: 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  is will cause th
94f0: 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f  e OP_Ne below to
9500: 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20 20 20   always.        
9510: 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 66  ** fail on the f
9520: 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  irst iteration o
9530: 66 20 74 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20  f the loop even 
9540: 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  if the first.   
9550: 20 20 20 20 20 2a 2a 20 72 6f 77 20 69 73 20 61       ** row is a
9560: 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20  ll NULLs..      
9570: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c    */.        sql
9580: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
9590: 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63  Noop(v, pDistinc
95a0: 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20  t->addrTnct);.  
95b0: 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69        pOp = sqli
95c0: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
95d0: 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54  pDistinct->addrT
95e0: 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  nct);.        pO
95f0: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  p->opcode = OP_N
9600: 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ull;.        pOp
9610: 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20 20 20 20  ->p1 = 1;.      
9620: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50    pOp->p2 = regP
9630: 72 65 76 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a  rev;..        iJ
9640: 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ump = sqlite3Vdb
9650: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
9660: 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  + nResultCol;.  
9670: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
9680: 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b  <nResultCol; i++
9690: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c  ){.          Col
96a0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
96b0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
96c0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
96d0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
96e0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
96f0: 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20 29 7b  <nResultCol-1 ){
9700: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
9710: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
9720: 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73 75  , OP_Ne, regResu
9730: 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65 67  lt+i, iJump, reg
9740: 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20  Prev+i);.       
9750: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
9760: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
9770: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
9780: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9790: 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72  dOp3(v, OP_Eq, r
97a0: 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 43 6f 6e  egResult+i, iCon
97b0: 74 69 6e 75 65 2c 20 72 65 67 50 72 65 76 2b 69  tinue, regPrev+i
97c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
97d0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
97e0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
97f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9800: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
9810: 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  , (const char *)
9820: 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
9830: 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  Q);.          sq
9840: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
9850: 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  5(v, SQLITE_NULL
9860: 45 51 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  EQ);.        }. 
9870: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
9880: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
9890: 74 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d 70 20  tAddr(v)==iJump 
98a0: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
98b0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
98c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
98d0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
98e0: 6f 70 79 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  opy, regResult, 
98f0: 72 65 67 50 72 65 76 2c 20 6e 52 65 73 75 6c 74  regPrev, nResult
9900: 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Col-1);.        
9910: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
9920: 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
9930: 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
9940: 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
9950: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
9960: 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74  oop(v, pDistinct
9970: 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20  ->addrTnct);.   
9980: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9990: 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66 61 75    }..      defau
99a0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 61 73  lt: {.        as
99b0: 73 65 72 74 28 20 70 44 69 73 74 69 6e 63 74 2d  sert( pDistinct-
99c0: 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52  >eTnctType==WHER
99d0: 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44  E_DISTINCT_UNORD
99e0: 45 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20  ERED );.        
99f0: 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61  codeDistinct(pPa
9a00: 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  rse, pDistinct->
9a10: 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e 74 69 6e  tabTnct, iContin
9a20: 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a  ue, nResultCol,.
9a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a40: 20 20 20 20 20 72 65 67 52 65 73 75 6c 74 29 3b       regResult);
9a50: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
9a60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9a70: 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 29    if( pSort==0 )
9a80: 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73  {.      codeOffs
9a90: 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
9aa0: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
9ab0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63    }.  }..  switc
9ac0: 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
9ad0: 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c  /* In this mode,
9ae0: 20 77 72 69 74 65 20 65 61 63 68 20 71 75 65 72   write each quer
9af0: 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20  y result to the 
9b00: 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  key of the tempo
9b10: 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c  rary.    ** tabl
9b20: 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a  e iParm..    */.
9b30: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9b40: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
9b50: 45 43 54 0a 20 20 20 20 63 61 73 65 20 53 52 54  ECT.    case SRT
9b60: 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20  _Union: {.      
9b70: 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 72 31  int r1;.      r1
9b80: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
9b90: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
9ba0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9bb0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
9bc0: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
9bd0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72  t, nResultCol, r
9be0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
9bf0: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
9c00: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
9c10: 69 50 61 72 6d 2c 20 72 31 2c 20 72 65 67 52 65  iParm, r1, regRe
9c20: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
9c30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9c40: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
9c50: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
9c60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
9c70: 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74      /* Construct
9c80: 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74   a record from t
9c90: 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c  he query result,
9ca0: 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   but instead of.
9cb0: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68      ** saving th
9cc0: 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69  at record, use i
9cd0: 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65  t as a key to de
9ce0: 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72  lete elements fr
9cf0: 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65  om.    ** the te
9d00: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
9d10: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  arm..    */.    
9d20: 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a  case SRT_Except:
9d30: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
9d40: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
9d50: 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50 61 72  _IdxDelete, iPar
9d60: 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  m, regResult, nR
9d70: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
9d80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
9d90: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
9da0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
9db0: 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ECT */..    /* S
9dc0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
9dd0: 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
9de0: 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
9df0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
9e00: 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20 53  Fifo:.    case S
9e10: 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a 20 20 20  RT_DistFifo:.   
9e20: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
9e30: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
9e40: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
9e50: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
9e60: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
9e70: 72 73 65 2c 20 6e 50 72 65 66 69 78 52 65 67 2b  rse, nPrefixReg+
9e80: 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
9e90: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54  se( eDest==SRT_T
9ea0: 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65  able );.      te
9eb0: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
9ec0: 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20  RT_EphemTab );. 
9ed0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
9ee0: 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 20 29  Dest==SRT_Fifo )
9ef0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
9f00: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
9f10: 74 46 69 66 6f 20 29 3b 0a 20 20 20 20 20 20 73  tFifo );.      s
9f20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
9f30: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
9f40: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
9f50: 65 73 75 6c 74 43 6f 6c 2c 20 72 31 2b 6e 50 72  esultCol, r1+nPr
9f60: 65 66 69 78 52 65 67 29 3b 0a 23 69 66 6e 64 65  efixReg);.#ifnde
9f70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
9f80: 45 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  E.      if( eDes
9f90: 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
9fa0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
9fb0: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
9fc0: 20 69 73 20 44 69 73 74 46 69 66 6f 2c 20 74 68   is DistFifo, th
9fd0: 65 6e 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d  en cursor (iParm
9fe0: 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20  +1) is open.    
9ff0: 20 20 20 20 2a 2a 20 6f 6e 20 61 6e 20 65 70 68      ** on an eph
a000: 65 6d 65 72 61 6c 20 69 6e 64 65 78 2e 20 49 66  emeral index. If
a010: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
a020: 20 69 73 20 61 6c 72 65 61 64 79 20 70 72 65 73   is already pres
a030: 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ent.        ** i
a040: 6e 20 74 68 65 20 69 6e 64 65 78 2c 20 64 6f 20  n the index, do 
a050: 6e 6f 74 20 77 72 69 74 65 20 69 74 20 74 6f 20  not write it to 
a060: 74 68 65 20 6f 75 74 70 75 74 2e 20 49 66 20 6e  the output. If n
a070: 6f 74 2c 20 61 64 64 20 74 68 65 0a 20 20 20 20  ot, add the.    
a080: 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 72      ** current r
a090: 6f 77 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  ow to the index 
a0a0: 61 6e 64 20 70 72 6f 63 65 65 64 20 77 69 74 68  and proceed with
a0b0: 20 77 72 69 74 69 6e 67 20 69 74 20 74 6f 20 74   writing it to t
a0c0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  he.        ** ou
a0d0: 74 70 75 74 20 74 61 62 6c 65 20 61 73 20 77 65  tput table as we
a0e0: 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ll.  */.        
a0f0: 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74  int addr = sqlit
a100: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
a110: 72 28 76 29 20 2b 20 34 3b 0a 20 20 20 20 20 20  r(v) + 4;.      
a120: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a130: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
a140: 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 61 64 64  nd, iParm+1, add
a150: 72 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20  r, r1, 0);.     
a160: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
a170: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
a180: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
a190: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
a1a0: 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31 2c 72 65  , iParm+1, r1,re
a1b0: 67 52 65 73 75 6c 74 2c 6e 52 65 73 75 6c 74 43  gResult,nResultC
a1c0: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ol);.        ass
a1d0: 65 72 74 28 20 70 53 6f 72 74 3d 3d 30 20 29 3b  ert( pSort==0 );
a1e0: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
a1f0: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
a200: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
a210: 74 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 72 65  t( regResult==re
a220: 67 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20  gOrig );.       
a230: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
a240: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
a250: 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65 67 2c  , r1+nPrefixReg,
a260: 20 72 65 67 4f 72 69 67 2c 20 31 2c 20 6e 50 72   regOrig, 1, nPr
a270: 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20  efixReg);.      
a280: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
a290: 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47  nt r2 = sqlite3G
a2a0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
a2b0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
a2c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a2d0: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61  OP_NewRowid, iPa
a2e0: 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20  rm, r2);.       
a2f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a300: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
a310: 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b   iParm, r1, r2);
a320: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a330: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
a340: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
a350: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
a360: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
a370: 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  arse, r2);.     
a380: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
a390: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
a3a0: 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 50 72  (pParse, r1, nPr
a3b0: 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20 20 20  efixReg+1);.    
a3c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
a3d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a3e0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
a3f0: 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72   /* If we are cr
a400: 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72  eating a set for
a410: 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45   an "expr IN (SE
a420: 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74  LECT ...)" const
a430: 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ruct,.    ** the
a440: 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62  n there should b
a450: 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20  e a single item 
a460: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57  on the stack.  W
a470: 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  rite this.    **
a480: 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73   item into the s
a490: 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f  et table with bo
a4a0: 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f  gus data..    */
a4b0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
a4c0: 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t: {.      if( p
a4d0: 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
a4e0: 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e  /* At first glan
a4f0: 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69  ce you would thi
a500: 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69  nk we could opti
a510: 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20  mize out the.   
a520: 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59       ** ORDER BY
a530: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 73 69   in this case si
a540: 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66  nce the order of
a550: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
a560: 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  set.        ** d
a570: 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20  oes not matter. 
a580: 20 42 75 74 20 74 68 65 72 65 20 6d 69 67 68 74   But there might
a590: 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75   be a LIMIT clau
a5a0: 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20  se, in which.   
a5b0: 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65       ** case the
a5c0: 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74   order does matt
a5d0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75  er */.        pu
a5e0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
a5f0: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
a600: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
a610: 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20  esult, regOrig, 
a620: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65  nResultCol, nPre
a630: 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  fixReg);.      }
a640: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
a650: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
a660: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
a670: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
a680: 28 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ( sqlite3Strlen3
a690: 30 28 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73  0(pDest->zAffSds
a6a0: 74 29 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c 20 29  t)==nResultCol )
a6b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a6c0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
a6d0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
a6e0: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
a6f0: 43 6f 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Col, .          
a700: 20 20 72 31 2c 20 70 44 65 73 74 2d 3e 7a 41 66    r1, pDest->zAf
a710: 66 53 64 73 74 2c 20 6e 52 65 73 75 6c 74 43 6f  fSdst, nResultCo
a720: 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
a730: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
a740: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
a750: 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 65 67  , iParm, r1, reg
a760: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
a770: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
a780: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
a790: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
a7a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
a7b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
a7c0: 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78  /* If any row ex
a7d0: 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ist in the resul
a7e0: 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68  t set, record th
a7f0: 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72  at fact and abor
a800: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  t..    */.    ca
a810: 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b  se SRT_Exists: {
a820: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a830: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
a840: 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72 6d  nteger, 1, iParm
a850: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
a860: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
a870: 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  l terminate the 
a880: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
a890: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a8a0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
a8b0: 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65  s is a scalar se
a8c0: 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72  lect that is par
a8d0: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
a8e0: 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
a8f0: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
a900: 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72  s in the appropr
a910: 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iate memory cell
a920: 20 6f 72 20 61 72 72 61 79 20 6f 66 20 0a 20 20   or array of .  
a930: 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 63 65 6c 6c    ** memory cell
a940: 73 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 20  s and break out 
a950: 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70  of the scan loop
a960: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
a970: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
a980: 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a     if( pSort ){.
a990: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a9a0: 6e 52 65 73 75 6c 74 43 6f 6c 3c 3d 70 44 65 73  nResultCol<=pDes
a9b0: 74 2d 3e 6e 53 64 73 74 20 29 3b 0a 20 20 20 20  t->nSdst );.    
a9c0: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
a9d0: 65 72 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  er(.            
a9e0: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
a9f0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67  , regResult, reg
aa00: 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  Orig, nResultCol
aa10: 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20  , nPrefixReg);. 
aa20: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
aa30: 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
aa40: 75 6c 74 43 6f 6c 3d 3d 70 44 65 73 74 2d 3e 6e  ultCol==pDest->n
aa50: 53 64 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Sdst );.        
aa60: 61 73 73 65 72 74 28 20 72 65 67 52 65 73 75 6c  assert( regResul
aa70: 74 3d 3d 69 50 61 72 6d 20 29 3b 0a 20 20 20 20  t==iParm );.    
aa80: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
aa90: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
aaa0: 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
aab0: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
aac0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
aad0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
aae0: 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
aaf0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
ab00: 0a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  ..    case SRT_C
ab10: 6f 72 6f 75 74 69 6e 65 3a 20 20 20 20 20 20 20  oroutine:       
ab20: 2f 2a 20 53 65 6e 64 20 64 61 74 61 20 74 6f 20  /* Send data to 
ab30: 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a  a co-routine */.
ab40: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74      case SRT_Out
ab50: 70 75 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  put: {        /*
ab60: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
ab70: 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  lts */.      tes
ab80: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
ab90: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20  T_Coroutine );. 
aba0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
abb0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
abc0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   );.      if( pS
abd0: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ort ){.        p
abe0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
abf0: 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20  arse, pSort, p, 
ac00: 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72  regResult, regOr
ac10: 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a  ig, nResultCol,.
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac30: 20 20 20 20 20 20 20 6e 50 72 65 66 69 78 52 65         nPrefixRe
ac40: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  g);.      }else 
ac50: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
ac60: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
ac70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ac80: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
ac90: 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
aca0: 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
acb0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
acc0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
acd0: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52  _ResultRow, regR
ace0: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
acf0: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
ad00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
ad10: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ad20: 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20 57  MIT_CTE.    /* W
ad30: 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
ad40: 20 69 6e 74 6f 20 61 20 70 72 69 6f 72 69 74 79   into a priority
ad50: 20 71 75 65 75 65 20 74 68 61 74 20 69 73 20 6f   queue that is o
ad60: 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74  rder according t
ad70: 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73 74 2d 3e  o.    ** pDest->
ad80: 70 4f 72 64 65 72 42 79 20 28 69 6e 20 70 53 4f  pOrderBy (in pSO
ad90: 29 2e 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ).  pDest->iSDPa
ada0: 72 6d 20 28 69 6e 20 69 50 61 72 6d 29 20 69 73  rm (in iParm) is
adb0: 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20   the cursor for 
adc0: 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20  an.    ** index 
add0: 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72 2b  with pSO->nExpr+
ade0: 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69 6c  2 columns.  Buil
adf0: 64 20 61 20 6b 65 79 20 75 73 69 6e 67 20 70 53  d a key using pS
ae00: 4f 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 0a  O for the first.
ae10: 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70      ** pSO->nExp
ae20: 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  r columns, then 
ae30: 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b 65  make sure all ke
ae40: 79 73 20 61 72 65 20 75 6e 69 71 75 65 20 62 79  ys are unique by
ae50: 20 61 64 64 69 6e 67 20 61 0a 20 20 20 20 2a 2a   adding a.    **
ae60: 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65 6e   final OP_Sequen
ae70: 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  ce column.  The 
ae80: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 74  last column is t
ae90: 68 65 20 72 65 63 6f 72 64 20 61 73 20 61 20 62  he record as a b
aea0: 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lob..    */.    
aeb0: 63 61 73 65 20 53 52 54 5f 44 69 73 74 51 75 65  case SRT_DistQue
aec0: 75 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ue:.    case SRT
aed0: 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20 20 20 20  _Queue: {.      
aee0: 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20  int nKey;.      
aef0: 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a  int r1, r2, r3;.
af00: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 65        int addrTe
af10: 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78  st = 0;.      Ex
af20: 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20 20  prList *pSO;.   
af30: 20 20 20 70 53 4f 20 3d 20 70 44 65 73 74 2d 3e     pSO = pDest->
af40: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
af50: 61 73 73 65 72 74 28 20 70 53 4f 20 29 3b 0a 20  assert( pSO );. 
af60: 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f 2d       nKey = pSO-
af70: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 31  >nExpr;.      r1
af80: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
af90: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
afa0: 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
afb0: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
afc0: 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20  rse, nKey+2);.  
afd0: 20 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65 79      r3 = r2+nKey
afe0: 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44  +1;.      if( eD
aff0: 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65  est==SRT_DistQue
b000: 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ue ){.        /*
b010: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
b020: 69 6f 6e 20 69 73 20 44 69 73 74 51 75 65 75 65  ion is DistQueue
b030: 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69  , then cursor (i
b040: 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a  Parm+1) is open.
b050: 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20          ** on a 
b060: 73 65 63 6f 6e 64 20 65 70 68 65 6d 65 72 61 6c  second ephemeral
b070: 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64   index that hold
b080: 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 65 76 65  s all values eve
b090: 72 79 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20  ry previously.  
b0a0: 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74        ** added t
b0b0: 6f 20 74 68 65 20 71 75 65 75 65 2e 20 2a 2f 0a  o the queue. */.
b0c0: 20 20 20 20 20 20 20 20 61 64 64 72 54 65 73 74          addrTest
b0d0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
b0e0: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
b0f0: 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30 2c  und, iParm+1, 0,
b100: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
b110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b120: 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73            regRes
b130: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  ult, nResultCol)
b140: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
b150: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
b160: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
b170: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b180: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
b190: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
b1a0: 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 69  ol, r3);.      i
b1b0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  f( eDest==SRT_Di
b1c0: 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20  stQueue ){.     
b1d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b1e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
b1f0: 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72  sert, iParm+1, r
b200: 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  3);.        sqli
b210: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
b220: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
b230: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20  KRESULT);.      
b240: 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
b250: 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20   i<nKey; i++){. 
b260: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b270: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
b280: 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20  Copy,.          
b290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2a0: 72 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f 2d  regResult + pSO-
b2b0: 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  >a[i].u.x.iOrder
b2c0: 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20 20  ByCol - 1,.     
b2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2e0: 20 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20 20       r2+i);.    
b2f0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
b300: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b310: 50 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61 72  P_Sequence, iPar
b320: 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20 20  m, r2+nKey);.   
b330: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b340: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
b350: 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79 2b  ecord, r2, nKey+
b360: 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  2, r1);.      sq
b370: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
b380: 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  nt(v, OP_IdxInse
b390: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72  rt, iParm, r1, r
b3a0: 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20  2, nKey+2);.    
b3b0: 20 20 69 66 28 20 61 64 64 72 54 65 73 74 20 29    if( addrTest )
b3c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
b3d0: 48 65 72 65 28 76 2c 20 61 64 64 72 54 65 73 74  Here(v, addrTest
b3e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b3f0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
b400: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
b410: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
b420: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
b430: 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20  , r2, nKey+2);. 
b440: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b450: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
b460: 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a  TE_OMIT_CTE */..
b470: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
b480: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
b490: 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61  ER).    /* Disca
b4a0: 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  rd the results. 
b4b0: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
b4c0: 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  r SELECT stateme
b4d0: 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a  nts inside.    *
b4e0: 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20  * the body of a 
b4f0: 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75  TRIGGER.  The pu
b500: 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65  rpose of such se
b510: 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c  lects is to call
b520: 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66  .    ** user-def
b530: 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74  ined functions t
b540: 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66  hat have side ef
b550: 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f  fects.  We do no
b560: 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62  t care.    ** ab
b570: 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72  out the actual r
b580: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
b590: 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lect..    */.   
b5a0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
b5b0: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
b5c0: 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a  =SRT_Discard );.
b5d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b5e0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
b5f0: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
b600: 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  end of the loop 
b610: 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20  if the LIMIT is 
b620: 72 65 61 63 68 65 64 2e 20 20 45 78 63 65 70 74  reached.  Except
b630: 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65 20  , if.  ** there 
b640: 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e 20  is a sorter, in 
b650: 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20 73  which case the s
b660: 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65 61 64  orter has alread
b670: 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74  y limited.  ** t
b680: 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75 73  he output for us
b690: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 6f  ..  */.  if( pSo
b6a0: 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69 6d  rt==0 && p->iLim
b6b0: 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
b6c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b6d0: 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20  P_DecrJumpZero, 
b6e0: 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  p->iLimit, iBrea
b6f0: 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
b700: 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (v);.  }.}../*.*
b710: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79  * Allocate a Key
b720: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66 66  Info object suff
b730: 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e  icient for an in
b740: 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f 6c  dex of N key col
b750: 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65 78  umns and.** X ex
b760: 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a  tra columns..*/.
b770: 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  KeyInfo *sqlite3
b780: 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71 6c  KeyInfoAlloc(sql
b790: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 2c  ite3 *db, int N,
b7a0: 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e 74 20 6e   int X){.  int n
b7b0: 45 78 74 72 61 20 3d 20 28 4e 2b 58 29 2a 28 73  Extra = (N+X)*(s
b7c0: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b  izeof(CollSeq*)+
b7d0: 31 29 20 2d 20 73 69 7a 65 6f 66 28 43 6f 6c 6c  1) - sizeof(Coll
b7e0: 53 65 71 2a 29 3b 0a 20 20 4b 65 79 49 6e 66 6f  Seq*);.  KeyInfo
b7f0: 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d   *p = sqlite3DbM
b800: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
b810: 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b  izeof(KeyInfo) +
b820: 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20   nExtra);.  if( 
b830: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72  p ){.    p->aSor
b840: 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70  tOrder = (u8*)&p
b850: 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20  ->aColl[N+X];.  
b860: 20 20 70 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 3d    p->nKeyField =
b870: 20 28 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e   (u16)N;.    p->
b880: 6e 41 6c 6c 46 69 65 6c 64 20 3d 20 28 75 31 36  nAllField = (u16
b890: 29 28 4e 2b 58 29 3b 0a 20 20 20 20 70 2d 3e 65  )(N+X);.    p->e
b8a0: 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20  nc = ENC(db);.  
b8b0: 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20    p->db = db;.  
b8c0: 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20    p->nRef = 1;. 
b8d0: 20 20 20 6d 65 6d 73 65 74 28 26 70 5b 31 5d 2c     memset(&p[1],
b8e0: 20 30 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 7d   0, nExtra);.  }
b8f0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
b900: 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
b910: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
b920: 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
b930: 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  te a KeyInfo obj
b940: 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ect.*/.void sqli
b950: 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
b960: 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  KeyInfo *p){.  i
b970: 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65  f( p ){.    asse
b980: 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b  rt( p->nRef>0 );
b990: 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a  .    p->nRef--;.
b9a0: 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d      if( p->nRef=
b9b0: 3d 30 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  =0 ) sqlite3DbFr
b9c0: 65 65 4e 4e 28 70 2d 3e 64 62 2c 20 70 29 3b 0a  eeNN(p->db, p);.
b9d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
b9e0: 65 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20  e a new pointer 
b9f0: 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  to a KeyInfo obj
ba00: 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a  ect.*/.KeyInfo *
ba10: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
ba20: 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20  f(KeyInfo *p){. 
ba30: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73   if( p ){.    as
ba40: 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20  sert( p->nRef>0 
ba50: 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b  );.    p->nRef++
ba60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
ba70: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
ba80: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  TE_DEBUG./*.** R
ba90: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 20  eturn TRUE if a 
baa0: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63  KeyInfo object c
bab0: 61 6e 20 62 65 20 63 68 61 6e 67 65 2e 20 20 54  an be change.  T
bac0: 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63  he KeyInfo objec
bad0: 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20 62 65  t.** can only be
bae0: 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 69 73   changed if this
baf0: 20 69 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c   is just a singl
bb00: 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
bb10: 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  he object..**.**
bb20: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
bb30: 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e 73 69 64   used only insid
bb40: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  e of assert() st
bb50: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74  atements..*/.int
bb60: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
bb70: 73 57 72 69 74 65 61 62 6c 65 28 4b 65 79 49 6e  sWriteable(KeyIn
bb80: 66 6f 20 2a 70 29 7b 20 72 65 74 75 72 6e 20 70  fo *p){ return p
bb90: 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23 65 6e  ->nRef==1; }.#en
bba0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
bbb0: 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69  BUG */../*.** Gi
bbc0: 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ven an expressio
bbd0: 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74 65  n list, generate
bbe0: 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
bbf0: 74 75 72 65 20 74 68 61 74 20 72 65 63 6f 72 64  ture that record
bc00: 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69  s.** the collati
bc10: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
bc20: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
bc30: 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69  in that expressi
bc40: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  on list..**.** I
bc50: 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69  f the ExprList i
bc60: 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72  s an ORDER BY or
bc70: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
bc80: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
bc90: 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73  ing.** KeyInfo s
bca0: 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72  tructure is appr
bcb0: 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74  opriate for init
bcc0: 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75  ializing a virtu
bcd0: 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69  al index to.** i
bce0: 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63 6c  mplement that cl
bcf0: 61 75 73 65 2e 20 20 49 66 20 74 68 65 20 45 78  ause.  If the Ex
bd00: 70 72 4c 69 73 74 20 69 73 20 74 68 65 20 72 65  prList is the re
bd10: 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45  sult set of a SE
bd20: 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65  LECT.** then the
bd30: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
bd40: 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  re is appropriat
bd50: 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69  e for initializi
bd60: 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20  ng a virtual.** 
bd70: 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65  index to impleme
bd80: 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20 74 65  nt a DISTINCT te
bd90: 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  st..**.** Space 
bda0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49  to hold the KeyI
bdb0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
bdc0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
bdd0: 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c  alloc.  The call
bde0: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ing.** function 
bdf0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
be00: 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20 74  or seeing that t
be10: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
be20: 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66   eventually.** f
be30: 72 65 65 64 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f  reed..*/.KeyInfo
be40: 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f   *sqlite3KeyInfo
be50: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20  FromExprList(.  
be60: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
be70: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
be80: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
be90: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
bea0: 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65    /* Form the Ke
beb0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f  yInfo object fro
bec0: 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74 20  m this ExprList 
bed0: 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c  */.  int iStart,
bee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
bef0: 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f 6c  in with this col
bf00: 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a  umn of pList */.
bf10: 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20    int nExtra    
bf20: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
bf30: 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63 6f  is many extra co
bf40: 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e 64  lumns to the end
bf50: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 78   */.){.  int nEx
bf60: 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  pr;.  KeyInfo *p
bf70: 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45  Info;.  struct E
bf80: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
bf90: 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  tem;.  sqlite3 *
bfa0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
bfb0: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78  .  int i;..  nEx
bfc0: 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  pr = pList->nExp
bfd0: 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c  r;.  pInfo = sql
bfe0: 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
bff0: 28 64 62 2c 20 6e 45 78 70 72 2d 69 53 74 61 72  (db, nExpr-iStar
c000: 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b 0a 20 20  t, nExtra+1);.  
c010: 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20  if( pInfo ){.   
c020: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c030: 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
c040: 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20  le(pInfo) );.   
c050: 20 66 6f 72 28 69 3d 69 53 74 61 72 74 2c 20 70   for(i=iStart, p
c060: 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69 53  Item=pList->a+iS
c070: 74 61 72 74 3b 20 69 3c 6e 45 78 70 72 3b 20 69  tart; i<nExpr; i
c080: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
c090: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c      pInfo->aColl
c0a0: 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 73 71 6c  [i-iStart] = sql
c0b0: 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65  ite3ExprNNCollSe
c0c0: 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
c0d0: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70  >pExpr);.      p
c0e0: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
c0f0: 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 70 49 74  [i-iStart] = pIt
c100: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  em->sortOrder;. 
c110: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
c120: 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pInfo;.}../*.*
c130: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
c140: 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f  nnection operato
c150: 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f  r, used for erro
c160: 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73  r messages..*/.s
c170: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
c180: 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69   *selectOpName(i
c190: 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a  nt id){.  char *
c1a0: 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20  z;.  switch( id 
c1b0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
c1c0: 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55  LL:       z = "U
c1d0: 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65  NION ALL";   bre
c1e0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
c1f0: 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22  INTERSECT: z = "
c200: 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72  INTERSECT";   br
c210: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
c220: 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20  _EXCEPT:    z = 
c230: 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62  "EXCEPT";      b
c240: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
c250: 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  t:           z =
c260: 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20   "UNION";       
c270: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
c280: 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65  urn z;.}..#ifnde
c290: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
c2a0: 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65  PLAIN./*.** Unle
c2b0: 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51  ss an "EXPLAIN Q
c2c0: 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61  UERY PLAN" comma
c2d0: 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63  nd is being proc
c2e0: 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63  essed, this func
c2f0: 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  tion.** is a no-
c300: 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  op. Otherwise, i
c310: 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20  t adds a single 
c320: 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f  row of output to
c330: 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c   the EQP result,
c340: 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61  .** where the ca
c350: 70 74 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ption is of the 
c360: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55  form:.**.**   "U
c370: 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46  SE TEMP B-TREE F
c380: 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68  OR xxx".**.** wh
c390: 65 72 65 20 78 78 78 20 69 73 20 6f 6e 65 20 6f  ere xxx is one o
c3a0: 66 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22 4f  f "DISTINCT", "O
c3b0: 52 44 45 52 20 42 59 22 20 6f 72 20 22 47 52 4f  RDER BY" or "GRO
c3c0: 55 50 20 42 59 22 2e 20 45 78 61 63 74 6c 79 20  UP BY". Exactly 
c3d0: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 65 74 65  which.** is dete
c3e0: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 7a 55  rmined by the zU
c3f0: 73 61 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  sage argument..*
c400: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
c410: 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 50  plainTempTable(P
c420: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
c430: 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67 65  nst char *zUsage
c440: 29 7b 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72  ){.  ExplainQuer
c450: 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30  yPlan((pParse, 0
c460: 2c 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52  , "USE TEMP B-TR
c470: 45 45 20 46 4f 52 20 25 73 22 2c 20 7a 55 73 61  EE FOR %s", zUsa
c480: 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ge));.}../*.** A
c490: 73 73 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e  ssign expression
c4a0: 20 62 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20   b to lvalue a. 
c4b0: 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c  A second, no-op,
c4c0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73   version of this
c4d0: 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f   macro.** is pro
c4e0: 76 69 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54  vided when SQLIT
c4f0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69  E_OMIT_EXPLAIN i
c500: 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20  s defined. This 
c510: 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a  allows the code.
c520: 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c  ** in sqlite3Sel
c530: 65 63 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20  ect() to assign 
c540: 76 61 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74  values to struct
c550: 75 72 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61  ure member varia
c560: 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c  bles that.** onl
c570: 79 20 65 78 69 73 74 20 69 66 20 53 51 4c 49 54  y exist if SQLIT
c580: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69  E_OMIT_EXPLAIN i
c590: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69  s not defined wi
c5a0: 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20  thout polluting 
c5b0: 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68  the.** code with
c5c0: 20 23 69 66 6e 64 65 66 20 64 69 72 65 63 74 69   #ifndef directi
c5d0: 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65  ves..*/.# define
c5e0: 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
c5f0: 65 72 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a  er(a, b) a = b..
c600: 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76  #else./* No-op v
c610: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65  ersions of the e
c620: 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63  xplainXXX() func
c630: 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73  tions and macros
c640: 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78  . */.# define ex
c650: 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79  plainTempTable(y
c660: 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70  ,z).# define exp
c670: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79  lainSetInteger(y
c680: 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ,z).#endif.../*.
c690: 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20  ** If the inner 
c6a0: 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74  loop was generat
c6b0: 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e  ed using a non-n
c6c0: 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67  ull pOrderBy arg
c6d0: 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74  ument,.** then t
c6e0: 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20  he results were 
c6f0: 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74  placed in a sort
c700: 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c  er.  After the l
c710: 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65  oop is terminate
c720: 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20  d.** we need to 
c730: 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61  run the sorter a
c740: 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65  nd output the re
c750: 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c  sults.  The foll
c760: 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65  owing.** routine
c770: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
c780: 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f  ode needed to do
c790: 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   that..*/.static
c7a0: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f   void generateSo
c7b0: 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20  rtTail(.  Parse 
c7c0: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
c7d0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
c7e0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
c7f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
c800: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
c810: 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72  .  SortCtx *pSor
c820: 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74  t,   /* Informat
c830: 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52  ion on the ORDER
c840: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
c850: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
c860: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
c870: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a  olumns of data *
c880: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
c890: 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74  pDest /* Write t
c8a0: 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74  he sorted result
c8b0: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56  s here */.){.  V
c8c0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
c8d0: 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20 20 20  >pVdbe;         
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
c8f0: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
c900: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61  ement */.  int a
c910: 64 64 72 42 72 65 61 6b 20 3d 20 70 53 6f 72 74  ddrBreak = pSort
c920: 2d 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20  ->labelDone;    
c930: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
c940: 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f  here to exit loo
c950: 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
c960: 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
c970: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
c980: 50 61 72 73 65 29 3b 2f 2a 20 4a 75 6d 70 20 68  Parse);/* Jump h
c990: 65 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63  ere for next cyc
c9a0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  le */.  int addr
c9b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c9c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
c9d0: 66 20 6f 75 74 70 75 74 20 6c 6f 6f 70 2e 20 4a  f output loop. J
c9e0: 75 6d 70 20 66 6f 72 20 4e 65 78 74 2e 20 2a 2f  ump for Next. */
c9f0: 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20  .  int addrOnce 
ca00: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b  = 0;.  int iTab;
ca10: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
ca20: 64 65 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70  derBy = pSort->p
ca30: 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 65  OrderBy;.  int e
ca40: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
ca50: 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d  est;.  int iParm
ca60: 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72   = pDest->iSDPar
ca70: 6d 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b  m;.  int regRow;
ca80: 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b  .  int regRowid;
ca90: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69  .  int iCol;.  i
caa0: 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20  nt nKey;        
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cac0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79 20  * Number of key 
cad0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 73 6f 72 74 65  columns in sorte
cae0: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
caf0: 74 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20 20  t iSortTab;     
cb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cb10: 20 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20 74   Sorter cursor t
cb20: 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
cb30: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 53   int i;.  int bS
cb40: 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eq;             
cb50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
cb60: 65 20 69 66 20 73 6f 72 74 65 72 20 72 65 63 6f  e if sorter reco
cb70: 72 64 20 69 6e 63 6c 75 64 65 73 20 73 65 71 2e  rd includes seq.
cb80: 20 6e 6f 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 52   no. */.  int nR
cb90: 65 66 4b 65 79 20 3d 20 30 3b 0a 20 20 73 74 72  efKey = 0;.  str
cba0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
cbb0: 6d 20 2a 61 4f 75 74 45 78 20 3d 20 70 2d 3e 70  m *aOutEx = p->p
cbc0: 45 4c 69 73 74 2d 3e 61 3b 0a 0a 20 20 61 73 73  EList->a;..  ass
cbd0: 65 72 74 28 20 61 64 64 72 42 72 65 61 6b 3c 30  ert( addrBreak<0
cbe0: 20 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d   );.  if( pSort-
cbf0: 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20  >labelBkOut ){. 
cc00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cc10: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
cc20: 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  , pSort->regRetu
cc30: 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  rn, pSort->label
cc40: 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69  BkOut);.    sqli
cc50: 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
cc60: 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 73  ddrBreak);.    s
cc70: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
cc80: 65 4c 61 62 65 6c 28 76 2c 20 70 53 6f 72 74 2d  eLabel(v, pSort-
cc90: 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20  >labelBkOut);.  
cca0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
ccb0: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
ccc0: 45 46 45 52 45 4e 43 45 53 0a 20 20 2f 2a 20 4f  EFERENCES.  /* O
ccd0: 70 65 6e 20 61 6e 79 20 63 75 72 73 6f 72 73 20  pen any cursors 
cce0: 6e 65 65 64 65 64 20 66 6f 72 20 73 6f 72 74 65  needed for sorte
ccf0: 72 2d 72 65 66 65 72 65 6e 63 65 20 65 78 70 72  r-reference expr
cd00: 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72  essions */.  for
cd10: 28 69 3d 30 3b 20 69 3c 70 53 6f 72 74 2d 3e 6e  (i=0; i<pSort->n
cd20: 44 65 66 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  Defer; i++){.   
cd30: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
cd40: 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e  Sort->aDefer[i].
cd50: 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 44  pTab;.    int iD
cd60: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
cd70: 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
cd80: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
cd90: 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ma);.    sqlite3
cda0: 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
cdb0: 2c 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b  , pSort->aDefer[
cdc0: 69 5d 2e 69 43 73 72 2c 20 69 44 62 2c 20 70 54  i].iCsr, iDb, pT
cdd0: 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
cde0: 3b 0a 20 20 20 20 6e 52 65 66 4b 65 79 20 3d 20  ;.    nRefKey = 
cdf0: 4d 41 58 28 6e 52 65 66 4b 65 79 2c 20 70 53 6f  MAX(nRefKey, pSo
ce00: 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 6e 4b  rt->aDefer[i].nK
ce10: 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ey);.  }.#endif.
ce20: 0a 20 20 69 54 61 62 20 3d 20 70 53 6f 72 74 2d  .  iTab = pSort-
ce30: 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  >iECursor;.  if(
ce40: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
ce50: 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ut || eDest==SRT
ce60: 5f 43 6f 72 6f 75 74 69 6e 65 20 7c 7c 20 65 44  _Coroutine || eD
ce70: 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a  est==SRT_Mem ){.
ce80: 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 30      regRowid = 0
ce90: 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20 70  ;.    regRow = p
cea0: 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 7d  Dest->iSdst;.  }
ceb0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77  else{.    regRow
cec0: 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  id = sqlite3GetT
ced0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
cee0: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
cef0: 52 54 5f 45 70 68 65 6d 54 61 62 20 7c 7c 20 65  RT_EphemTab || e
cf00: 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20  Dest==SRT_Table 
cf10: 29 7b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 20  ){.      regRow 
cf20: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
cf30: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
cf40: 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a     nColumn = 0;.
cf50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cf60: 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65   regRow = sqlite
cf70: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
cf80: 61 72 73 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  arse, nColumn);.
cf90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e 4b 65 79      }.  }.  nKey
cfa0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
cfb0: 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53  pr - pSort->nOBS
cfc0: 61 74 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d  at;.  if( pSort-
cfd0: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
cfe0: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20  TFLAG_UseSorter 
cff0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 53 6f  ){.    int regSo
d000: 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73 65  rtOut = ++pParse
d010: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 53 6f 72  ->nMem;.    iSor
d020: 74 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tTab = pParse->n
d030: 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  Tab++;.    if( p
d040: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
d050: 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4f 6e   ){.      addrOn
d060: 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ce = sqlite3Vdbe
d070: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp0(v, OP_Onc
d080: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
d090: 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  (v);.    }.    s
d0a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d0b0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
d0c0: 6f 2c 20 69 53 6f 72 74 54 61 62 2c 20 72 65 67  o, iSortTab, reg
d0d0: 53 6f 72 74 4f 75 74 2c 20 0a 20 20 20 20 20 20  SortOut, .      
d0e0: 20 20 6e 4b 65 79 2b 31 2b 6e 43 6f 6c 75 6d 6e    nKey+1+nColumn
d0f0: 2b 6e 52 65 66 4b 65 79 29 3b 0a 20 20 20 20 69  +nRefKey);.    i
d100: 66 28 20 61 64 64 72 4f 6e 63 65 20 29 20 73 71  f( addrOnce ) sq
d110: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
d120: 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a  e(v, addrOnce);.
d130: 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73      addr = 1 + s
d140: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d150: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72  (v, OP_SorterSor
d160: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65  t, iTab, addrBre
d170: 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ak);.    VdbeCov
d180: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f  erage(v);.    co
d190: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
d1a0: 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74  Offset, addrCont
d1b0: 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  inue);.    sqlit
d1c0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d1d0: 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69  OP_SorterData, i
d1e0: 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c  Tab, regSortOut,
d1f0: 20 69 53 6f 72 74 54 61 62 29 3b 0a 20 20 20 20   iSortTab);.    
d200: 62 53 65 71 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  bSeq = 0;.  }els
d210: 65 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20  e{.    addr = 1 
d220: 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
d230: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20  Op2(v, OP_Sort, 
d240: 69 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29  iTab, addrBreak)
d250: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
d260: 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  );.    codeOffse
d270: 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
d280: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
d290: 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 69      iSortTab = i
d2a0: 54 61 62 3b 0a 20 20 20 20 62 53 65 71 20 3d 20  Tab;.    bSeq = 
d2b0: 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  1;.  }.  for(i=0
d2c0: 2c 20 69 43 6f 6c 3d 6e 4b 65 79 2b 62 53 65 71  , iCol=nKey+bSeq
d2d0: 2d 31 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69  -1; i<nColumn; i
d2e0: 2b 2b 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ++){.#ifdef SQLI
d2f0: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
d300: 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20  _REFERENCES.    
d310: 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 62 53  if( aOutEx[i].bS
d320: 6f 72 74 65 72 52 65 66 20 29 20 63 6f 6e 74 69  orterRef ) conti
d330: 6e 75 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  nue;.#endif.    
d340: 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e  if( aOutEx[i].u.
d350: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30  x.iOrderByCol==0
d360: 20 29 20 69 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 23   ) iCol++;.  }.#
d370: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
d380: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
d390: 45 4e 43 45 53 0a 20 20 69 66 28 20 70 53 6f 72  ENCES.  if( pSor
d3a0: 74 2d 3e 6e 44 65 66 65 72 20 29 7b 0a 20 20 20  t->nDefer ){.   
d3b0: 20 69 6e 74 20 69 4b 65 79 20 3d 20 69 43 6f 6c   int iKey = iCol
d3c0: 2b 31 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 4b  +1;.    int regK
d3d0: 65 79 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ey = sqlite3GetT
d3e0: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
d3f0: 20 6e 52 65 66 4b 65 79 29 3b 0a 0a 20 20 20 20   nRefKey);..    
d400: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 6f 72 74  for(i=0; i<pSort
d410: 2d 3e 6e 44 65 66 65 72 3b 20 69 2b 2b 29 7b 0a  ->nDefer; i++){.
d420: 20 20 20 20 20 20 69 6e 74 20 69 43 73 72 20 3d        int iCsr =
d430: 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69   pSort->aDefer[i
d440: 5d 2e 69 43 73 72 3b 0a 20 20 20 20 20 20 54 61  ].iCsr;.      Ta
d450: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 53 6f 72  ble *pTab = pSor
d460: 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 70 54 61  t->aDefer[i].pTa
d470: 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65  b;.      int nKe
d480: 79 20 3d 20 70 53 6f 72 74 2d 3e 61 44 65 66 65  y = pSort->aDefe
d490: 72 5b 69 5d 2e 6e 4b 65 79 3b 0a 0a 20 20 20 20  r[i].nKey;..    
d4a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d4b0: 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
d4c0: 77 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20  w, iCsr);.      
d4d0: 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
d4e0: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  b) ){.        sq
d4f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
d500: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53  v, OP_Column, iS
d510: 6f 72 74 54 61 62 2c 20 69 4b 65 79 2b 2b 2c 20  ortTab, iKey++, 
d520: 72 65 67 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  regKey);.       
d530: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d540: 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77  p3(v, OP_SeekRow
d550: 69 64 2c 20 69 43 73 72 2c 20 0a 20 20 20 20 20  id, iCsr, .     
d560: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d570: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
d580: 2b 31 2c 20 72 65 67 4b 65 79 29 3b 0a 20 20 20  +1, regKey);.   
d590: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d5a0: 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
d5b0: 20 69 6e 74 20 69 4a 6d 70 3b 0a 20 20 20 20 20   int iJmp;.     
d5c0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
d5d0: 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
d5e0: 78 28 70 54 61 62 29 2d 3e 6e 4b 65 79 43 6f 6c  x(pTab)->nKeyCol
d5f0: 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  ==nKey );.      
d600: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 4b 65    for(k=0; k<nKe
d610: 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; k++){.       
d620: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d630: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
d640: 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 69 4b 65  n, iSortTab, iKe
d650: 79 2b 2b 2c 20 72 65 67 4b 65 79 2b 6b 29 3b 0a  y++, regKey+k);.
d660: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d670: 20 20 69 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33    iJmp = sqlite3
d680: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
d690: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
d6a0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
d6b0: 28 76 2c 20 4f 50 5f 53 65 65 6b 47 45 2c 20 69  (v, OP_SeekGE, i
d6c0: 43 73 72 2c 20 69 4a 6d 70 2b 32 2c 20 72 65 67  Csr, iJmp+2, reg
d6d0: 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20  Key, nKey);.    
d6e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d6f0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
d700: 64 78 4c 45 2c 20 69 43 73 72 2c 20 69 4a 6d 70  dxLE, iCsr, iJmp
d710: 2b 33 2c 20 72 65 67 4b 65 79 2c 20 6e 4b 65 79  +3, regKey, nKey
d720: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d730: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
d740: 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 73 72  OP_NullRow, iCsr
d750: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
d760: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
d770: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
d780: 72 73 65 2c 20 72 65 67 4b 65 79 2c 20 6e 52 65  rse, regKey, nRe
d790: 66 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  fKey);.  }.#endi
d7a0: 66 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 6c 75 6d  f.  for(i=nColum
d7b0: 6e 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  n-1; i>=0; i--){
d7c0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d7d0: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
d7e0: 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20  ERENCES.    if( 
d7f0: 61 4f 75 74 45 78 5b 69 5d 2e 62 53 6f 72 74 65  aOutEx[i].bSorte
d800: 72 52 65 66 20 29 7b 0a 20 20 20 20 20 20 73 71  rRef ){.      sq
d810: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
d820: 61 72 73 65 2c 20 61 4f 75 74 45 78 5b 69 5d 2e  arse, aOutEx[i].
d830: 70 45 78 70 72 2c 20 72 65 67 52 6f 77 2b 69 29  pExpr, regRow+i)
d840: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
d850: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69  if.    {.      i
d860: 6e 74 20 69 52 65 61 64 3b 0a 20 20 20 20 20 20  nt iRead;.      
d870: 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e  if( aOutEx[i].u.
d880: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 29 7b  x.iOrderByCol ){
d890: 0a 20 20 20 20 20 20 20 20 69 52 65 61 64 20 3d  .        iRead =
d8a0: 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69   aOutEx[i].u.x.i
d8b0: 4f 72 64 65 72 42 79 43 6f 6c 2d 31 3b 0a 20 20  OrderByCol-1;.  
d8c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d8d0: 20 20 20 69 52 65 61 64 20 3d 20 69 43 6f 6c 2d     iRead = iCol-
d8e0: 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
d8f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d900: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
d910: 20 69 53 6f 72 74 54 61 62 2c 20 69 52 65 61 64   iSortTab, iRead
d920: 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20  , regRow+i);.   
d930: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
d940: 76 2c 20 22 25 73 22 2c 20 61 4f 75 74 45 78 5b  v, "%s", aOutEx[
d950: 69 5d 2e 7a 4e 61 6d 65 3f 61 4f 75 74 45 78 5b  i].zName?aOutEx[
d960: 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45  i].zName : aOutE
d970: 78 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20  x[i].zSpan));.  
d980: 20 20 7d 0a 20 20 7d 0a 20 20 73 77 69 74 63 68    }.  }.  switch
d990: 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63  ( eDest ){.    c
d9a0: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
d9b0: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
d9c0: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73 71  mTab: {.      sq
d9d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
d9e0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53  v, OP_Column, iS
d9f0: 6f 72 74 54 61 62 2c 20 6e 4b 65 79 2b 62 53 65  ortTab, nKey+bSe
da00: 71 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20  q, regRow);.    
da10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
da20: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
da30: 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  id, iParm, regRo
da40: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
da50: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
da60: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
da70: 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f  m, regRow, regRo
da80: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
da90: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
daa0: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
dab0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
dac0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
dad0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
dae0: 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  RY.    case SRT_
daf0: 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Set: {.      ass
db00: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 73 71  ert( nColumn==sq
db10: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44  lite3Strlen30(pD
db20: 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 29 20 29  est->zAffSdst) )
db30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
db40: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
db50: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
db60: 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67  ow, nColumn, reg
db70: 52 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20  Rowid,.         
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
db90: 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20  Dest->zAffSdst, 
dba0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
dbb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dbc0: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
dbd0: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67  sert, iParm, reg
dbe0: 52 6f 77 69 64 2c 20 72 65 67 52 6f 77 2c 20 6e  Rowid, regRow, n
dbf0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62  Column);.      b
dc00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
dc10: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
dc20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
dc30: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
dc40: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
dc50: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
dc60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
dc70: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
dc80: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
dc90: 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t( eDest==SRT_Ou
dca0: 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tput || eDest==S
dcb0: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20  RT_Coroutine ); 
dcc0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
dcd0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
dce0: 75 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ut );.      test
dcf0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
dd00: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20  _Coroutine );.  
dd10: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
dd20: 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
dd30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dd40: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
dd50: 75 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69  ultRow, pDest->i
dd60: 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  Sdst, nColumn);.
dd70: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
dd80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dd90: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
dda0: 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ld, pDest->iSDPa
ddb0: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
ddc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ddd0: 20 20 7d 0a 20 20 69 66 28 20 72 65 67 52 6f 77    }.  if( regRow
dde0: 69 64 20 29 7b 0a 20 20 20 20 69 66 28 20 65 44  id ){.    if( eD
ddf0: 65 73 74 3d 3d 53 52 54 5f 53 65 74 20 29 7b 0a  est==SRT_Set ){.
de00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
de10: 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
de20: 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43  arse, regRow, nC
de30: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  olumn);.    }els
de40: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
de50: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
de60: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a  Parse, regRow);.
de70: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
de80: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
de90: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64  pParse, regRowid
dea0: 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20  );.  }.  /* The 
deb0: 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f  bottom of the lo
dec0: 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  op.  */.  sqlite
ded0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
dee0: 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  l(v, addrContinu
def0: 65 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d  e);.  if( pSort-
df00: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
df10: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20  TFLAG_UseSorter 
df20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
df30: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
df40: 6f 72 74 65 72 4e 65 78 74 2c 20 69 54 61 62 2c  orterNext, iTab,
df50: 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65   addr); VdbeCove
df60: 72 61 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65  rage(v);.  }else
df70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
df80: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
df90: 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b  xt, iTab, addr);
dfa0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
dfb0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72  ;.  }.  if( pSor
dfc0: 74 2d 3e 72 65 67 52 65 74 75 72 6e 20 29 20 73  t->regReturn ) s
dfd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
dfe0: 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70  (v, OP_Return, p
dff0: 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 29  Sort->regReturn)
e000: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
e010: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
e020: 64 64 72 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a  ddrBreak);.}../*
e030: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
e040: 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67  nter to a string
e050: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
e060: 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70  'declaration typ
e070: 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70  e' of the.** exp
e080: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54  ression pExpr. T
e090: 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65  he string may be
e0a0: 20 74 72 65 61 74 65 64 20 61 73 20 73 74 61 74   treated as stat
e0b0: 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ic by the caller
e0c0: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79  ..**.** Also try
e0d0: 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
e0e0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 74   size of the ret
e0f0: 75 72 6e 65 64 20 76 61 6c 75 65 20 61 6e 64 20  urned value and 
e100: 72 65 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72  return that.** r
e110: 65 73 75 6c 74 20 69 6e 20 2a 70 45 73 74 57 69  esult in *pEstWi
e120: 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  dth..**.** The d
e130: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
e140: 69 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74  is the exact dat
e150: 61 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e  atype definition
e160: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
e170: 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  the.** original 
e180: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
e190: 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78  tement if the ex
e1a0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
e1b0: 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63  lumn. The.** dec
e1c0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f  laration type fo
e1d0: 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20  r a ROWID field 
e1e0: 69 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63  is INTEGER. Exac
e1f0: 74 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72  tly when an expr
e200: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e  ession.** is con
e210: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
e220: 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20   can be complex 
e230: 69 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  in the presence 
e240: 6f 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54  of subqueries. T
e250: 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74  he.** result-set
e260: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
e270: 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
e280: 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65  ing SELECT state
e290: 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e  ments is .** con
e2a0: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
e2b0: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
e2c0: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  n..**.**   SELEC
e2d0: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a  T col FROM tbl;.
e2e0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
e2f0: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
e300: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53  ;.**   SELECT (S
e310: 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74  ELECT col FROM t
e320: 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  bl);.**   SELECT
e330: 20 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43   abc FROM (SELEC
e340: 54 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f  T col AS abc FRO
e350: 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54  M tbl);.** .** T
e360: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
e370: 79 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72  ype for any expr
e380: 65 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  ession other tha
e390: 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55  n a column is NU
e3a0: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  LL..**.** This r
e3b0: 6f 75 74 69 6e 65 20 68 61 73 20 65 69 74 68 65  outine has eithe
e3c0: 72 20 33 20 6f 72 20 36 20 70 61 72 61 6d 65 74  r 3 or 6 paramet
e3d0: 65 72 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ers depending on
e3e0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
e3f0: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e  ** the SQLITE_EN
e400: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
e410: 44 41 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  DATA compile-tim
e420: 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64  e option is used
e430: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
e440: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
e450: 5f 4d 45 54 41 44 41 54 41 0a 23 20 64 65 66 69  _METADATA.# defi
e460: 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c  ne columnType(A,
e470: 42 2c 43 2c 44 2c 45 29 20 63 6f 6c 75 6d 6e 54  B,C,D,E) columnT
e480: 79 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c  ypeImpl(A,B,C,D,
e490: 45 29 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 21  E).#else /* if !
e4a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
e4b0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
e4c0: 41 44 41 54 41 29 20 2a 2f 0a 23 20 64 65 66 69  ADATA) */.# defi
e4d0: 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c  ne columnType(A,
e4e0: 42 2c 43 2c 44 2c 45 29 20 63 6f 6c 75 6d 6e 54  B,C,D,E) columnT
e4f0: 79 70 65 49 6d 70 6c 28 41 2c 42 29 0a 23 65 6e  ypeImpl(A,B).#en
e500: 64 69 66 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  dif.static const
e510: 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70   char *columnTyp
e520: 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e  eImpl(.  NameCon
e530: 74 65 78 74 20 2a 70 4e 43 2c 20 0a 23 69 66 6e  text *pNC, .#ifn
e540: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e550: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
e560: 41 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 0a  A.  Expr *pExpr.
e570: 23 65 6c 73 65 0a 20 20 45 78 70 72 20 2a 70 45  #else.  Expr *pE
e580: 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  xpr,.  const cha
e590: 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20 20  r **pzOrigDb,.  
e5a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
e5b0: 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20  rigTab,.  const 
e5c0: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c  char **pzOrigCol
e5d0: 0a 23 65 6e 64 69 66 0a 29 7b 0a 20 20 63 68 61  .#endif.){.  cha
e5e0: 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d  r const *zType =
e5f0: 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 23 69 66   0;.  int j;.#if
e600: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e610: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
e620: 41 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  A.  char const *
e630: 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 63  zOrigDb = 0;.  c
e640: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
e650: 54 61 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  Tab = 0;.  char 
e660: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 43 6f 6c 20  const *zOrigCol 
e670: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  = 0;.#endif..  a
e680: 73 73 65 72 74 28 20 70 45 78 70 72 21 3d 30 20  ssert( pExpr!=0 
e690: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43  );.  assert( pNC
e6a0: 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b  ->pSrcList!=0 );
e6b0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
e6c0: 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op!=TK_AGG_COL
e6d0: 55 4d 4e 20 29 3b 20 20 2f 2a 20 54 68 69 73 20  UMN );  /* This 
e6e0: 72 6f 75 74 69 6e 65 20 72 75 6e 65 73 20 62 65  routine runes be
e6f0: 66 6f 72 65 20 61 67 67 72 65 67 61 74 65 73 0a  fore aggregates.
e700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e720: 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 70 72         ** are pr
e730: 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 73 77 69  ocessed */.  swi
e740: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
e750: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  {.    case TK_CO
e760: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LUMN: {.      /*
e770: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
e780: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63  is a column. Loc
e790: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68  ate the table th
e7a0: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e  e column is bein
e7b0: 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61  g.      ** extra
e7c0: 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d  cted from in Nam
e7d0: 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73  eContext.pSrcLis
e7e0: 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61  t. This table ma
e7f0: 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20  y be real.      
e800: 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  ** database tabl
e810: 65 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e  e or a subquery.
e820: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
e830: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
e840: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e850: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63  able structure c
e860: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
e870: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
e880: 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b   Select *pS = 0;
e890: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e8a0: 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d  Select the colum
e8b0: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
e8c0: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rom */.      int
e8d0: 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69   iCol = pExpr->i
e8e0: 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65  Column;  /* Inde
e8f0: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70  x of column in p
e900: 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  Tab */.      whi
e910: 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62  le( pNC && !pTab
e920: 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c   ){.        SrcL
e930: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
e940: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
e950: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a         for(j=0;j
e960: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
e970: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  && pTabList->a[j
e980: 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72  ].iCursor!=pExpr
e990: 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20  ->iTable;j++);. 
e9a0: 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61         if( j<pTa
e9b0: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20  bList->nSrc ){. 
e9c0: 20 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20           pTab = 
e9d0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
e9e0: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
e9f0: 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  S = pTabList->a[
ea00: 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  j].pSelect;.    
ea10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ea20: 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e       pNC = pNC->
ea30: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d  pNext;.        }
ea40: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
ea50: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
ea60: 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65         /* At one
ea70: 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63 68   time, code such
ea80: 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77 2e   as "SELECT new.
ea90: 78 22 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  x" within a trig
eaa0: 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20 20  ger would.      
eab0: 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20    ** cause this 
eac0: 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e  condition to run
ead0: 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20 77  .  Since then, w
eae0: 65 20 68 61 76 65 20 72 65 73 74 72 75 63 74 75  e have restructu
eaf0: 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20 20  red how.        
eb00: 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65 20  ** trigger code 
eb10: 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e 64  is generated and
eb20: 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74 69   so this conditi
eb30: 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  on is no longer 
eb40: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  .        ** poss
eb50: 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69  ible. However, i
eb60: 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 74  t can still be t
eb70: 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65 6e  rue for statemen
eb80: 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20  ts like.        
eb90: 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
eba0: 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
ebb0: 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45       **   CREATE
ebc0: 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e   TABLE t1(col IN
ebd0: 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20 20  TEGER);.        
ebe0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
ebf0: 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d  ECT t1.col) FROM
ec00: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
ec10: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
ec20: 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28  when columnType(
ec30: 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
ec40: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 74  he expression "t
ec50: 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20  1.col" in the . 
ec60: 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73 65         ** sub-se
ec70: 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61  lect. In this ca
ec80: 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75  se, set the colu
ec90: 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c  mn type to NULL,
eca0: 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   even.        **
ecb0: 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c   though it shoul
ecc0: 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e 54  d really be "INT
ecd0: 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20 2a  EGER"..        *
ece0: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
ecf0: 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c  s is not a probl
ed00: 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d  em, as the colum
ed10: 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63 6f  n type of "t1.co
ed20: 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20  l" is never.    
ed30: 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68 65      ** used. Whe
ed40: 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69  n columnType() i
ed50: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
ed60: 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20 20  expression .    
ed70: 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54 20      ** "(SELECT 
ed80: 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f  t1.col)", the co
ed90: 72 72 65 63 74 20 74 79 70 65 20 69 73 20 72 65  rrect type is re
eda0: 74 75 72 6e 65 64 20 28 73 65 65 20 74 68 65 20  turned (see the 
edb0: 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 20  TK_SELECT.      
edc0: 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f    ** branch belo
edd0: 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  w.  */.        b
ede0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
edf0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
ee00: 62 20 26 26 20 70 45 78 70 72 2d 3e 79 2e 70 54  b && pExpr->y.pT
ee10: 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20  ab==pTab );.    
ee20: 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20    if( pS ){.    
ee30: 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c      /* The "tabl
ee40: 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  e" is actually a
ee50: 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61   sub-select or a
ee60: 20 76 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f   view in the FRO
ee70: 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  M clause.       
ee80: 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43   ** of the SELEC
ee90: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74  T statement. Ret
eea0: 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74  urn the declarat
eeb0: 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69  ion type and ori
eec0: 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  gin.        ** d
eed0: 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 73 75  ata for the resu
eee0: 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66  lt-set column of
eef0: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e   the sub-select.
ef00: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
ef10: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
ef20: 26 26 20 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69  && iCol<pS->pELi
ef30: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
ef40: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f         /* If iCo
ef50: 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  l is less than z
ef60: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78  ero, then the ex
ef70: 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74  pression request
ef80: 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  s the.          
ef90: 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  ** rowid of the 
efa0: 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69  sub-select or vi
efb0: 65 77 2e 20 54 68 69 73 20 65 78 70 72 65 73 73  ew. This express
efc0: 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65  ion is legal (se
efd0: 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
efe0: 74 65 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e  test case misc2.
eff0: 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73  2.2) - it always
f000: 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
f010: 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  LL..          */
f020: 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43  .          NameC
f030: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20  ontext sNC;.    
f040: 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20        Expr *p = 
f050: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43  pS->pEList->a[iC
f060: 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  ol].pExpr;.     
f070: 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73       sNC.pSrcLis
f080: 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  t = pS->pSrc;.  
f090: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78          sNC.pNex
f0a0: 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 20  t = pNC;.       
f0b0: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
f0c0: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
f0d0: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63         zType = c
f0e0: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
f0f0: 70 2c 26 7a 4f 72 69 67 44 62 2c 26 7a 4f 72 69  p,&zOrigDb,&zOri
f100: 67 54 61 62 2c 26 7a 4f 72 69 67 43 6f 6c 29 3b  gTab,&zOrigCol);
f110: 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
f120: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f130: 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62 6c 65   /* A real table
f140: 20 6f 72 20 61 20 43 54 45 20 74 61 62 6c 65 20   or a CTE table 
f150: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
f160: 74 28 20 21 70 53 20 29 3b 0a 23 69 66 64 65 66  t( !pS );.#ifdef
f170: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
f180: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
f190: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
f1a0: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
f1b0: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
f1c0: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 58 4e  assert( iCol==XN
f1d0: 5f 52 4f 57 49 44 20 7c 7c 20 28 69 43 6f 6c 3e  _ROWID || (iCol>
f1e0: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
f1f0: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
f200: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
f210: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
f220: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
f230: 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20         zOrigCol 
f240: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
f250: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f260: 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70      zOrigCol = p
f270: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
f280: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
f290: 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   zType = sqlite3
f2a0: 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62  ColumnType(&pTab
f2b0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b  ->aCol[iCol],0);
f2c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f2d0: 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20 70 54     zOrigTab = pT
f2e0: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
f2f0: 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72     if( pNC->pPar
f300: 73 65 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68  se && pTab->pSch
f310: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ema ){.         
f320: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
f330: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
f340: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  pNC->pParse->db,
f350: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
f360: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
f370: 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  Db = pNC->pParse
f380: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
f390: 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  DbSName;.       
f3a0: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20   }.#else.       
f3b0: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 58   assert( iCol==X
f3c0: 4e 5f 52 4f 57 49 44 20 7c 7c 20 28 69 43 6f 6c  N_ROWID || (iCol
f3d0: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
f3e0: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
f3f0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
f400: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
f410: 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
f420: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f430: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 73         zType = s
f440: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65  qlite3ColumnType
f450: 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  (&pTab->aCol[iCo
f460: 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  l],0);.        }
f470: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a  .#endif.      }.
f480: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f490: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
f4a0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
f4b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
f4c0: 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  CT: {.      /* T
f4d0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
f4e0: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52   a sub-select. R
f4f0: 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72  eturn the declar
f500: 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20  ation type and. 
f510: 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69       ** origin i
f520: 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67  nfo for the sing
f530: 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  le column in the
f540: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
f550: 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20  he SELECT.      
f560: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  ** statement..  
f570: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d      */.      Nam
f580: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
f590: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
f5a0: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
f5b0: 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
f5c0: 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61   = pS->pEList->a
f5d0: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [0].pExpr;.     
f5e0: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
f5f0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
f600: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
f610: 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  .      sNC.pSrcL
f620: 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a  ist = pS->pSrc;.
f630: 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20        sNC.pNext 
f640: 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43  = pNC;.      sNC
f650: 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  .pParse = pNC->p
f660: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79  Parse;.      zTy
f670: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
f680: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44  &sNC, p, &zOrigD
f690: 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a  b, &zOrigTab, &z
f6a0: 4f 72 69 67 43 6f 6c 29 3b 20 0a 20 20 20 20 20  OrigCol); .     
f6b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
f6c0: 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ndif.  }..#ifdef
f6d0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
f6e0: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 20  OLUMN_METADATA  
f6f0: 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44 62 20  .  if( pzOrigDb 
f700: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
f710: 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a 4f 72  zOrigTab && pzOr
f720: 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a  igCol );.    *pz
f730: 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67 44 62  OrigDb = zOrigDb
f740: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54 61 62  ;.    *pzOrigTab
f750: 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20 20 20   = zOrigTab;.   
f760: 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a 4f   *pzOrigCol = zO
f770: 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e 64  rigCol;.  }.#end
f780: 69 66 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70  if.  return zTyp
f790: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  e;.}../*.** Gene
f7a0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
f7b0: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
f7c0: 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  E the declaratio
f7d0: 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d  n types of colum
f7e0: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
f7f0: 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  ult set..*/.stat
f800: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
f810: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50  ColumnTypes(.  P
f820: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
f830: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
f840: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
f850: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
f860: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
f870: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
f880: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
f890: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
f8a0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
f8b0: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
f8c0: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
f8d0: 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  PE.  Vdbe *v = p
f8e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
f8f0: 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
f900: 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e  text sNC;.  sNC.
f910: 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
f920: 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73  ist;.  sNC.pPars
f930: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 4e  e = pParse;.  sN
f940: 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 66  C.pNext = 0;.  f
f950: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
f960: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
f970: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c     Expr *p = pEL
f980: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
f990: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
f9a0: 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53  *zType;.#ifdef S
f9b0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
f9c0: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20  UMN_METADATA.   
f9d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
f9e0: 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  igDb = 0;.    co
f9f0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54  nst char *zOrigT
fa00: 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  ab = 0;.    cons
fa10: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c  t char *zOrigCol
fa20: 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20   = 0;.    zType 
fa30: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
fa40: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20  C, p, &zOrigDb, 
fa50: 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69  &zOrigTab, &zOri
fa60: 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  gCol);..    /* T
fa70: 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b  he vdbe must mak
fa80: 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f  e its own copy o
fa90: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70  f the column-typ
faa0: 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20  e and other .   
fab0: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69   ** column speci
fac0: 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20  fic strings, in 
fad0: 63 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20  case the schema 
fae0: 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20  is reset before 
faf0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74  this.    ** virt
fb00: 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64  ual machine is d
fb10: 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
fb20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
fb30: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
fb40: 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c  OLNAME_DATABASE,
fb50: 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45   zOrigDb, SQLITE
fb60: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
fb70: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
fb80: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
fb90: 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69  NAME_TABLE, zOri
fba0: 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41  gTab, SQLITE_TRA
fbb0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
fbc0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
fbd0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
fbe0: 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f  _COLUMN, zOrigCo
fbf0: 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  l, SQLITE_TRANSI
fc00: 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ENT);.#else.    
fc10: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
fc20: 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30  pe(&sNC, p, 0, 0
fc30: 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
fc40: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
fc50: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
fc60: 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a  NAME_DECLTYPE, z
fc70: 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  Type, SQLITE_TRA
fc80: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e  NSIENT);.  }.#en
fc90: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
fca0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
fcb0: 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a  TYPE) */.}.../*.
fcc0: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  ** Compute the c
fcd0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20  olumn names for 
fce0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
fcf0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e  nt..**.** The on
fd00: 6c 79 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  ly guarantee tha
fd10: 74 20 53 51 4c 69 74 65 20 6d 61 6b 65 73 20 61  t SQLite makes a
fd20: 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  bout column name
fd30: 73 20 69 73 20 74 68 61 74 20 69 66 20 74 68 65  s is that if the
fd40: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61  .** column has a
fd50: 6e 20 41 53 20 63 6c 61 75 73 65 20 61 73 73 69  n AS clause assi
fd60: 67 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d 65 2c  gning it a name,
fd70: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 74 68   that will be th
fd80: 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a 2a 20  e name used..** 
fd90: 54 68 61 74 20 69 73 20 74 68 65 20 6f 6e 6c 79  That is the only
fda0: 20 64 6f 63 75 6d 65 6e 74 65 64 20 67 75 61 72   documented guar
fdb0: 61 6e 74 65 65 2e 20 20 48 6f 77 65 76 65 72 2c  antee.  However,
fdc0: 20 63 6f 75 6e 74 6c 65 73 73 20 61 70 70 6c 69   countless appli
fdd0: 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c  cations.** devel
fde0: 6f 70 65 64 20 6f 76 65 72 20 74 68 65 20 79 65  oped over the ye
fdf0: 61 72 73 20 68 61 76 65 20 6d 61 64 65 20 62 61  ars have made ba
fe00: 73 65 6c 65 73 73 20 61 73 73 75 6d 70 74 69 6f  seless assumptio
fe10: 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20  ns about column 
fe20: 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77 69 6c  names.** and wil
fe30: 6c 20 62 72 65 61 6b 20 69 66 20 74 68 6f 73 65  l break if those
fe40: 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 63 68 61   assumptions cha
fe50: 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c 20 75 73  nges.  Hence, us
fe60: 65 20 65 78 74 72 65 6d 65 20 63 61 75 74 69 6f  e extreme cautio
fe70: 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69 66 79  n.** when modify
fe80: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
fe90: 20 74 6f 20 61 76 6f 69 64 20 62 72 65 61 6b 69   to avoid breaki
fea0: 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a  ng legacy..**.**
feb0: 20 53 65 65 20 41 6c 73 6f 3a 20 73 71 6c 69 74   See Also: sqlit
fec0: 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  e3ColumnsFromExp
fed0: 72 4c 69 73 74 28 29 0a 2a 2a 0a 2a 2a 20 54 68  rList().**.** Th
fee0: 65 20 50 52 41 47 4d 41 20 73 68 6f 72 74 5f 63  e PRAGMA short_c
fef0: 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 61 6e 64 20  olumn_names and 
ff00: 50 52 41 47 4d 41 20 66 75 6c 6c 5f 63 6f 6c 75  PRAGMA full_colu
ff10: 6d 6e 5f 6e 61 6d 65 73 20 73 65 74 74 69 6e 67  mn_names setting
ff20: 73 20 61 72 65 0a 2a 2a 20 64 65 70 72 65 63 61  s are.** depreca
ff30: 74 65 64 2e 20 20 54 68 65 20 64 65 66 61 75 6c  ted.  The defaul
ff40: 74 20 73 65 74 74 69 6e 67 20 69 73 20 73 68 6f  t setting is sho
ff50: 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f 46 46 2e  rt=ON, full=OFF.
ff60: 20 20 39 39 2e 39 25 20 6f 66 20 61 6c 6c 0a 2a    99.9% of all.*
ff70: 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 73  * applications s
ff80: 68 6f 75 6c 64 20 6f 70 65 72 61 74 65 20 74 68  hould operate th
ff90: 69 73 20 77 61 79 2e 20 20 4e 65 76 65 72 74 68  is way.  Neverth
ffa0: 65 6c 65 73 73 2c 20 77 65 20 6e 65 65 64 20 74  eless, we need t
ffb0: 6f 20 73 75 70 70 6f 72 74 20 74 68 65 0a 2a 2a  o support the.**
ffc0: 20 6f 74 68 65 72 20 6d 6f 64 65 73 20 66 6f 72   other modes for
ffd0: 20 6c 65 67 61 63 79 3a 0a 2a 2a 0a 2a 2a 20 20   legacy:.**.**  
ffe0: 20 20 73 68 6f 72 74 3d 4f 46 46 2c 20 66 75 6c    short=OFF, ful
fff0: 6c 3d 4f 46 46 3a 20 20 20 20 20 20 43 6f 6c 75  l=OFF:      Colu
10000 6d 6e 20 6e 61 6d 65 20 69 73 20 74 68 65 20 74  mn name is the t
10010 65 78 74 20 6f 66 20 74 68 65 20 65 78 70 72 65  ext of the expre
10020 73 73 69 6f 6e 20 68 61 73 20 69 74 0a 2a 2a 20  ssion has it.** 
10030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10040 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 72 69               ori
10050 67 69 6e 61 6c 6c 79 20 61 70 70 65 61 72 73 20  ginally appears 
10060 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  in the SELECT st
10070 61 74 65 6d 65 6e 74 2e 20 20 49 6e 0a 2a 2a 20  atement.  In.** 
10080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10090 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 74 68               oth
100a0 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 7a 53  er words, the zS
100b0 70 61 6e 20 6f 66 20 74 68 65 20 72 65 73 75 6c  pan of the resul
100c0 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  t expression..**
100d0 0a 2a 2a 20 20 20 20 73 68 6f 72 74 3d 4f 4e 2c  .**    short=ON,
100e0 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20 20 20 20   full=OFF:      
100f0 20 28 54 68 69 73 20 69 73 20 74 68 65 20 64 65   (This is the de
10100 66 61 75 6c 74 20 73 65 74 74 69 6e 67 29 2e 20  fault setting). 
10110 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 0a 2a   If the result.*
10120 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
10130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
10140 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74  efers directly t
10150 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  o a table column
10160 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20  , then the.**   
10170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10180 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
10190 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73  t column name is
101a0 20 6a 75 73 74 20 74 68 65 20 74 61 62 6c 65 20   just the table 
101b0 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 20 20 20 20  column.**       
101c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101d0 20 20 20 20 20 20 20 6e 61 6d 65 3a 20 43 4f 4c         name: COL
101e0 55 4d 4e 2e 20 20 4f 74 68 65 72 77 69 73 65 20  UMN.  Otherwise 
101f0 75 73 65 20 7a 53 70 61 6e 2e 0a 2a 2a 0a 2a 2a  use zSpan..**.**
10200 20 20 20 20 66 75 6c 6c 3d 4f 4e 2c 20 73 68 6f      full=ON, sho
10210 72 74 3d 41 4e 59 3a 20 20 20 20 20 20 20 49 66  rt=ANY:       If
10220 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 66 65   the result refe
10230 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 61  rs directly to a
10240 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 0a 2a   table column,.*
10250 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
10260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
10270 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  hen the result c
10280 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 69 74 68 20  olumn name with 
10290 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 0a 2a  the table name.*
102a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
102c0 72 65 66 69 78 2c 20 65 78 3a 20 54 41 42 4c 45  refix, ex: TABLE
102d0 2e 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65 72 77  .COLUMN.  Otherw
102e0 69 73 65 20 75 73 65 20 7a 53 70 61 6e 2e 0a 2a  ise use zSpan..*
102f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
10300 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
10310 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
10320 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
10330 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
10340 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
10350 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
10360 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72  column names for
10370 20 74 68 69 73 20 53 45 4c 45 43 54 20 73 74 61   this SELECT sta
10380 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56  tement */.){.  V
10390 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
103a0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
103b0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
103c0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
103d0 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
103e0 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74  *pEList;.  sqlit
103f0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
10400 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e  >db;.  int fullN
10410 61 6d 65 3b 20 20 20 20 2f 2a 20 54 41 42 4c 45  ame;    /* TABLE
10420 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f 20 41 53  .COLUMN if no AS
10430 20 63 6c 61 75 73 65 20 61 6e 64 20 69 73 20 61   clause and is a
10440 20 64 69 72 65 63 74 20 74 61 62 6c 65 20 72 65   direct table re
10450 66 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 4e 61  f */.  int srcNa
10460 6d 65 3b 20 20 20 20 20 2f 2a 20 43 4f 4c 55 4d  me;     /* COLUM
10470 4e 20 6f 72 20 54 41 42 4c 45 2e 43 4f 4c 55 4d  N or TABLE.COLUM
10480 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c 61 75 73  N if no AS claus
10490 65 20 61 6e 64 20 69 73 20 64 69 72 65 63 74 20  e and is direct 
104a0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
104b0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
104c0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
104d0 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70  an EXPLAIN, skip
104e0 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20   this step */.  
104f0 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
10500 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ain ){.    retur
10510 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
10520 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c   if( pParse->col
10530 4e 61 6d 65 73 53 65 74 20 29 20 72 65 74 75 72  NamesSet ) retur
10540 6e 3b 0a 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e  n;.  /* Column n
10550 61 6d 65 73 20 61 72 65 20 64 65 74 65 72 6d 69  ames are determi
10560 6e 65 64 20 62 79 20 74 68 65 20 6c 65 66 74 2d  ned by the left-
10570 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 61 20 63  most term of a c
10580 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 2a  ompound select *
10590 2f 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  /.  while( pSele
105a0 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  ct->pPrior ) pSe
105b0 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  lect = pSelect->
105c0 70 50 72 69 6f 72 3b 0a 20 20 53 45 4c 45 43 54  pPrior;.  SELECT
105d0 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
105e0 53 65 6c 65 63 74 2c 28 22 67 65 6e 65 72 61 74  Select,("generat
105f0 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ing column names
10600 5c 6e 22 29 29 3b 0a 20 20 70 54 61 62 4c 69 73  \n"));.  pTabLis
10610 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72  t = pSelect->pSr
10620 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53  c;.  pEList = pS
10630 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
10640 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
10650 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 4c  .  assert( pTabL
10660 69 73 74 21 3d 30 20 29 3b 0a 20 20 70 50 61 72  ist!=0 );.  pPar
10670 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
10680 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 20  = 1;.  fullName 
10690 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
106a0 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
106b0 65 73 29 21 3d 30 3b 0a 20 20 73 72 63 4e 61 6d  es)!=0;.  srcNam
106c0 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  e = (db->flags &
106d0 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
106e0 4e 61 6d 65 73 29 21 3d 30 20 7c 7c 20 66 75 6c  Names)!=0 || ful
106f0 6c 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33  lName;.  sqlite3
10700 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76  VdbeSetNumCols(v
10710 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
10720 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
10730 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
10740 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
10750 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
10760 45 78 70 72 3b 0a 0a 20 20 20 20 61 73 73 65 72  Expr;..    asser
10770 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 20 20 61  t( p!=0 );.    a
10780 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b  ssert( p->op!=TK
10790 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 20 20  _AGG_COLUMN );  
107a0 2f 2a 20 41 67 67 20 70 72 6f 63 65 73 73 69 6e  /* Agg processin
107b0 67 20 68 61 73 20 6e 6f 74 20 72 75 6e 20 79 65  g has not run ye
107c0 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  t */.    assert(
107d0 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d   p->op!=TK_COLUM
107e0 4e 20 7c 7c 20 70 2d 3e 79 2e 70 54 61 62 21 3d  N || p->y.pTab!=
107f0 30 20 29 3b 20 2f 2a 20 43 6f 76 65 72 69 6e 67  0 ); /* Covering
10800 20 69 64 78 20 6e 6f 74 20 79 65 74 20 63 6f 64   idx not yet cod
10810 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 45  ed */.    if( pE
10820 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
10830 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20   ){.      /* An 
10840 41 53 20 63 6c 61 75 73 65 20 61 6c 77 61 79 73  AS clause always
10850 20 74 61 6b 65 73 20 66 69 72 73 74 20 70 72 69   takes first pri
10860 6f 72 69 74 79 20 2a 2f 0a 20 20 20 20 20 20 63  ority */.      c
10870 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c  har *zName = pEL
10880 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  ist->a[i].zName;
10890 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
108a0 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
108b0 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
108c0 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54   zName, SQLITE_T
108d0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
108e0 65 6c 73 65 20 69 66 28 20 73 72 63 4e 61 6d 65  else if( srcName
108f0 20 26 26 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f   && p->op==TK_CO
10900 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63 68  LUMN ){.      ch
10910 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
10920 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43  int iCol = p->iC
10930 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54 61  olumn;.      pTa
10940 62 20 3d 20 70 2d 3e 79 2e 70 54 61 62 3b 0a 20  b = p->y.pTab;. 
10950 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
10960 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  b!=0 );.      if
10970 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
10980 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
10990 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
109a0 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
109b0 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
109c0 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
109d0 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
109e0 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77       zCol = "row
109f0 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id";.      }else
10a00 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
10a10 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
10a20 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ].zName;.      }
10a30 0a 20 20 20 20 20 20 69 66 28 20 66 75 6c 6c 4e  .      if( fullN
10a40 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ame ){.        c
10a50 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
10a60 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
10a70 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
10a80 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62  b, "%s.%s", pTab
10a90 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a  ->zName, zCol);.
10aa0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10ab0 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
10ac0 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
10ad0 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
10ae0 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
10af0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
10b00 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
10b10 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
10b20 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53  ME_NAME, zCol, S
10b30 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
10b40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
10b50 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  lse{.      const
10b60 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 4c 69 73   char *z = pELis
10b70 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20  t->a[i].zSpan;. 
10b80 20 20 20 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20       z = z==0 ? 
10b90 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
10ba0 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69  b, "column%d", i
10bb0 2b 31 29 20 3a 20 73 71 6c 69 74 65 33 44 62 53  +1) : sqlite3DbS
10bc0 74 72 44 75 70 28 64 62 2c 20 7a 29 3b 0a 20 20  trDup(db, z);.  
10bd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
10be0 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
10bf0 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c  COLNAME_NAME, z,
10c00 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29   SQLITE_DYNAMIC)
10c10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65  ;.    }.  }.  ge
10c20 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
10c30 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
10c40 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a  st, pEList);.}..
10c50 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65  /*.** Given an e
10c60 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28  xpression list (
10c70 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20  which is really 
10c80 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72  the list of expr
10c90 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
10ca0 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20  form the result 
10cb0 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20  set of a SELECT 
10cc0 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75  statement) compu
10cd0 74 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  te appropriate.*
10ce0 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  * column names f
10cf0 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  or a table that 
10d00 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
10d10 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
10d20 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e  **.** All column
10d30 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75   names will be u
10d40 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  nique..**.** Onl
10d50 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  y the column nam
10d60 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e  es are computed.
10d70 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20    Column.zType, 
10d80 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a  Column.zColl,.**
10d90 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64   and other field
10da0 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20  s of Column are 
10db0 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  zeroed..**.** Re
10dc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
10dd0 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 61  n success.  If a
10de0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
10df0 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
10e00 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69  .** store NULL i
10e10 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69  n *paCol and 0 i
10e20 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74  n *pnCol and ret
10e30 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
10e40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79  ..**.** The only
10e50 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
10e60 53 51 4c 69 74 65 20 6d 61 6b 65 73 20 61 62 6f  SQLite makes abo
10e70 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ut column names 
10e80 69 73 20 74 68 61 74 20 69 66 20 74 68 65 0a 2a  is that if the.*
10e90 2a 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61 6e 20  * column has an 
10ea0 41 53 20 63 6c 61 75 73 65 20 61 73 73 69 67 6e  AS clause assign
10eb0 69 6e 67 20 69 74 20 61 20 6e 61 6d 65 2c 20 74  ing it a name, t
10ec0 68 61 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20  hat will be the 
10ed0 6e 61 6d 65 20 75 73 65 64 2e 0a 2a 2a 20 54 68  name used..** Th
10ee0 61 74 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 64  at is the only d
10ef0 6f 63 75 6d 65 6e 74 65 64 20 67 75 61 72 61 6e  ocumented guaran
10f00 74 65 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 63  tee.  However, c
10f10 6f 75 6e 74 6c 65 73 73 20 61 70 70 6c 69 63 61  ountless applica
10f20 74 69 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c 6f 70  tions.** develop
10f30 65 64 20 6f 76 65 72 20 74 68 65 20 79 65 61 72  ed over the year
10f40 73 20 68 61 76 65 20 6d 61 64 65 20 62 61 73 65  s have made base
10f50 6c 65 73 73 20 61 73 73 75 6d 70 74 69 6f 6e 73  less assumptions
10f60 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61   about column na
10f70 6d 65 73 0a 2a 2a 20 61 6e 64 20 77 69 6c 6c 20  mes.** and will 
10f80 62 72 65 61 6b 20 69 66 20 74 68 6f 73 65 20 61  break if those a
10f90 73 73 75 6d 70 74 69 6f 6e 73 20 63 68 61 6e 67  ssumptions chang
10fa0 65 73 2e 20 20 48 65 6e 63 65 2c 20 75 73 65 20  es.  Hence, use 
10fb0 65 78 74 72 65 6d 65 20 63 61 75 74 69 6f 6e 0a  extreme caution.
10fc0 2a 2a 20 77 68 65 6e 20 6d 6f 64 69 66 79 69 6e  ** when modifyin
10fd0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  g this routine t
10fe0 6f 20 61 76 6f 69 64 20 62 72 65 61 6b 69 6e 67  o avoid breaking
10ff0 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a 20 53   legacy..**.** S
11000 65 65 20 41 6c 73 6f 3a 20 67 65 6e 65 72 61 74  ee Also: generat
11010 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 0a 2a  eColumnNames().*
11020 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 6c  /.int sqlite3Col
11030 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
11040 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
11050 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
11060 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
11070 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
11080 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45  List,       /* E
11090 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68  xpr list from wh
110a0 69 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f  ich to derive co
110b0 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
110c0 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20  i16 *pnCol,     
110d0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
110e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
110f0 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20  olumns here */. 
11100 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20   Column **paCol 
11110 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
11120 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e  e the new column
11130 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b   list here */.){
11140 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
11150 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
11160 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
11170 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
11180 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
11190 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
111a0 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 75 33 32  ounters */.  u32
111b0 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
111c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
111d0 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20  x added to make 
111e0 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20  the name unique 
111f0 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  */.  Column *aCo
11200 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20  l, *pCol;       
11210 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
11220 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75  over result colu
11230 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  mns */.  int nCo
11240 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
11250 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
11260 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
11270 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
11280 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
11290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
112a0 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  Column name */. 
112b0 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
112c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
112d0 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20  Size of name in 
112e0 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 20 20 48 61 73  zName[] */.  Has
112f0 68 20 68 74 3b 20 20 20 20 20 20 20 20 20 20 20  h ht;           
11300 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68           /* Hash
11310 20 74 61 62 6c 65 20 6f 66 20 63 6f 6c 75 6d 6e   table of column
11320 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 73 71 6c   names */..  sql
11330 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 68 74  ite3HashInit(&ht
11340 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20  );.  if( pEList 
11350 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 45  ){.    nCol = pE
11360 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
11370 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44   aCol = sqlite3D
11380 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
11390 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a  sizeof(aCol[0])*
113a0 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73 74 63  nCol);.    testc
113b0 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ase( aCol==0 );.
113c0 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e 33 32 37      if( nCol>327
113d0 36 37 20 29 20 6e 43 6f 6c 20 3d 20 33 32 37 36  67 ) nCol = 3276
113e0 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  7;.  }else{.    
113f0 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43  nCol = 0;.    aC
11400 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  ol = 0;.  }.  as
11410 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 28 69 31 36  sert( nCol==(i16
11420 29 6e 43 6f 6c 20 29 3b 0a 20 20 2a 70 6e 43 6f  )nCol );.  *pnCo
11430 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43  l = nCol;.  *paC
11440 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f  ol = aCol;..  fo
11450 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c  r(i=0, pCol=aCol
11460 3b 20 69 3c 6e 43 6f 6c 20 26 26 20 21 64 62 2d  ; i<nCol && !db-
11470 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 20 69  >mallocFailed; i
11480 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
11490 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f   /* Get an appro
114a0 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20  priate name for 
114b0 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a  the column.    *
114c0 2f 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65  /.    if( (zName
114d0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
114e0 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
114f0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
11500 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  umn contains an 
11510 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61  "AS <name>" phra
11520 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61  se, use <name> a
11530 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  s the name */.  
11540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45    }else{.      E
11550 78 70 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20  xpr *pColExpr = 
11560 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
11570 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74 2d 3e 61  ollate(pEList->a
11580 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
11590 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70    while( pColExp
115a0 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b  r->op==TK_DOT ){
115b0 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70  .        pColExp
115c0 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52  r = pColExpr->pR
115d0 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73  ight;.        as
115e0 73 65 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d  sert( pColExpr!=
115f0 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
11600 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45     assert( pColE
11610 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
11620 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
11630 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  if( pColExpr->op
11640 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
11650 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f         /* For co
11660 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f  lumns use the co
11670 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a  lumn name name *
11680 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  /.        int iC
11690 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69  ol = pColExpr->i
116a0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
116b0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 43  Table *pTab = pC
116c0 6f 6c 45 78 70 72 2d 3e 79 2e 70 54 61 62 3b 0a  olExpr->y.pTab;.
116d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
116e0 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20  pTab!=0 );.     
116f0 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
11700 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
11710 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  ey;.        zNam
11720 65 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54  e = iCol>=0 ? pT
11730 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
11740 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22 3b 0a  Name : "rowid";.
11750 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
11760 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
11770 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _ID ){.        a
11780 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
11790 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78 70 72  roperty(pColExpr
117a0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
117b0 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
117c0 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54  = pColExpr->u.zT
117d0 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73  oken;.      }els
117e0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73  e{.        /* Us
117f0 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74  e the original t
11800 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ext of the colum
11810 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20  n expression as 
11820 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  its name */.    
11830 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69      zName = pELi
11840 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a  st->a[i].zSpan;.
11850 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11860 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
11870 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
11880 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
11890 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
118a0 73 65 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20  se{.      zName 
118b0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
118c0 28 64 62 2c 22 63 6f 6c 75 6d 6e 25 64 22 2c 69  (db,"column%d",i
118d0 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  +1);.    }..    
118e0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
118f0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
11900 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65 20  unique.  If the 
11910 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71  name is not uniq
11920 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e  ue,.    ** appen
11930 64 20 61 6e 20 69 6e 74 65 67 65 72 20 74 6f 20  d an integer to 
11940 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74  the name so that
11950 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71   it becomes uniq
11960 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ue..    */.    c
11970 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  nt = 0;.    whil
11980 65 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69  e( zName && sqli
11990 74 65 33 48 61 73 68 46 69 6e 64 28 26 68 74 2c  te3HashFind(&ht,
119a0 20 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20   zName)!=0 ){.  
119b0 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69      nName = sqli
119c0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
119d0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e  e);.      if( nN
119e0 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ame>0 ){.       
119f0 20 66 6f 72 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20   for(j=nName-1; 
11a00 6a 3e 30 20 26 26 20 73 71 6c 69 74 65 33 49 73  j>0 && sqlite3Is
11a10 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b  digit(zName[j]);
11a20 20 6a 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20   j--){}.        
11a30 69 66 28 20 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a  if( zName[j]==':
11a40 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20  ' ) nName = j;. 
11a50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4e 61       }.      zNa
11a60 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
11a70 6e 74 66 28 64 62 2c 20 22 25 2e 2a 7a 3a 25 75  ntf(db, "%.*z:%u
11a80 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  ", nName, zName,
11a90 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 69   ++cnt);.      i
11aa0 66 28 20 63 6e 74 3e 33 20 29 20 73 71 6c 69 74  f( cnt>3 ) sqlit
11ab0 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
11ac0 7a 65 6f 66 28 63 6e 74 29 2c 20 26 63 6e 74 29  zeof(cnt), &cnt)
11ad0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c  ;.    }.    pCol
11ae0 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
11af0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  .    sqlite3Colu
11b00 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d  mnPropertiesFrom
11b10 4e 61 6d 65 28 30 2c 20 70 43 6f 6c 29 3b 0a 20  Name(0, pCol);. 
11b20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 20     if( zName && 
11b30 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
11b40 74 28 26 68 74 2c 20 7a 4e 61 6d 65 2c 20 70 43  t(&ht, zName, pC
11b50 6f 6c 29 3d 3d 70 43 6f 6c 20 29 7b 0a 20 20 20  ol)==pCol ){.   
11b60 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
11b70 6c 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  lt(db);.    }.  
11b80 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43  }.  sqlite3HashC
11b90 6c 65 61 72 28 26 68 74 29 3b 0a 20 20 69 66 28  lear(&ht);.  if(
11ba0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
11bb0 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  d ){.    for(j=0
11bc0 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<i; j++){.   
11bd0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
11be0 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  (db, aCol[j].zNa
11bf0 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  me);.    }.    s
11c00 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
11c10 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43   aCol);.    *paC
11c20 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43  ol = 0;.    *pnC
11c30 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  ol = 0;.    retu
11c40 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
11c50 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
11c60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11c70 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20  ./*.** Add type 
11c80 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e  and collation in
11c90 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63  formation to a c
11ca0 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64  olumn list based
11cb0 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20   on.** a SELECT 
11cc0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a  statement..** .*
11cd0 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  * The column lis
11ce0 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d  t presumably cam
11cf0 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c  e from selectCol
11d00 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72  umnNamesFromExpr
11d10 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63  List()..** The c
11d20 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f  olumn list has o
11d30 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74  nly names, not t
11d40 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f  ypes or collatio
11d50 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ns.  This.** rou
11d60 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67  tine goes throug
11d70 68 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 74  h and adds the t
11d80 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69  ypes and collati
11d90 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
11da0 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65 73  routine requires
11db0 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69   that all identi
11dc0 66 69 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c  fiers in the SEL
11dd0 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ECT.** statement
11de0 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f   be resolved..*/
11df0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
11e00 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
11e10 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  AndCollation(.  
11e20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
11e30 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
11e40 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54   contexts */.  T
11e50 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
11e60 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75       /* Add colu
11e70 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d 61 74  mn type informat
11e80 69 6f 6e 20 74 6f 20 74 68 69 73 20 74 61 62 6c  ion to this tabl
11e90 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
11ea0 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20  Select       /* 
11eb0 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64  SELECT used to d
11ec0 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61  etermine types a
11ed0 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f  nd collations */
11ee0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
11ef0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
11f00 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
11f10 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  C;.  Column *pCo
11f20 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  l;.  CollSeq *pC
11f30 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  oll;.  int i;.  
11f40 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63  Expr *p;.  struc
11f50 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
11f60 2a 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *a;..  assert( p
11f70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61  Select!=0 );.  a
11f80 73 73 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d  ssert( (pSelect-
11f90 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
11fa0 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20  esolved)!=0 );. 
11fb0 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
11fc0 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45  Col==pSelect->pE
11fd0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64  List->nExpr || d
11fe0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
11ff0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
12000 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
12010 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e  rn;.  memset(&sN
12020 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
12030 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  ));.  sNC.pSrcLi
12040 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53  st = pSelect->pS
12050 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63  rc;.  a = pSelec
12060 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20  t->pEList->a;.  
12070 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54  for(i=0, pCol=pT
12080 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62  ab->aCol; i<pTab
12090 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
120a0 6c 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  l++){.    const 
120b0 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20  char *zType;.   
120c0 20 69 6e 74 20 6e 2c 20 6d 3b 0a 20 20 20 20 70   int n, m;.    p
120d0 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20   = a[i].pExpr;. 
120e0 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
120f0 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30  nType(&sNC, p, 0
12100 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20  , 0, 0);.    /* 
12110 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 2e 2e  pCol->szEst = ..
12120 2e 20 2f 2f 20 43 6f 6c 75 6d 6e 20 73 69 7a 65  . // Column size
12130 20 65 73 74 20 66 6f 72 20 53 45 4c 45 43 54 20   est for SELECT 
12140 74 61 62 6c 65 73 20 6e 65 76 65 72 20 75 73 65  tables never use
12150 64 20 2a 2f 0a 20 20 20 20 70 43 6f 6c 2d 3e 61  d */.    pCol->a
12160 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
12170 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29  3ExprAffinity(p)
12180 3b 0a 20 20 20 20 69 66 28 20 7a 54 79 70 65 20  ;.    if( zType 
12190 29 7b 0a 20 20 20 20 20 20 6d 20 3d 20 73 71 6c  ){.      m = sql
121a0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79  ite3Strlen30(zTy
121b0 70 65 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73  pe);.      n = s
121c0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
121d0 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
121e0 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d     pCol->zName =
121f0 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
12200 63 4f 72 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  cOrFree(db, pCol
12210 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b 6d 2b 32 29 3b  ->zName, n+m+2);
12220 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d  .      if( pCol-
12230 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  >zName ){.      
12240 20 20 6d 65 6d 63 70 79 28 26 70 43 6f 6c 2d 3e    memcpy(&pCol->
12250 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c 20 7a 54 79 70  zName[n+1], zTyp
12260 65 2c 20 6d 2b 31 29 3b 0a 20 20 20 20 20 20 20  e, m+1);.       
12270 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
12280 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41 53 54 59  |= COLFLAG_HASTY
12290 50 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PE;.      }.    
122a0 7d 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e  }.    if( pCol->
122b0 61 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43  affinity==0 ) pC
122c0 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  ol->affinity = S
122d0 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a  QLITE_AFF_BLOB;.
122e0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
122f0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
12300 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69  Parse, p);.    i
12310 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c  f( pColl && pCol
12320 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20  ->zColl==0 ){.  
12330 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20      pCol->zColl 
12340 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
12350 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  p(db, pColl->zNa
12360 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
12370 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20   pTab->szTabRow 
12380 3d 20 31 3b 20 2f 2a 20 41 6e 79 20 6e 6f 6e 2d  = 1; /* Any non-
12390 7a 65 72 6f 20 76 61 6c 75 65 20 77 6f 72 6b 73  zero value works
123a0 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   */.}../*.** Giv
123b0 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  en a SELECT stat
123c0 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20  ement, generate 
123d0 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
123e0 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
123f0 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
12400 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43  et of that SELEC
12410 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  T..*/.Table *sql
12420 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
12430 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
12440 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
12450 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  lect){.  Table *
12460 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20  pTab;.  sqlite3 
12470 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
12480 3b 0a 20 20 75 36 34 20 73 61 76 65 64 46 6c 61  ;.  u64 savedFla
12490 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67  gs;..  savedFlag
124a0 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20  s = db->flags;. 
124b0 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28   db->flags &= ~(
124c0 75 36 34 29 53 51 4c 49 54 45 5f 46 75 6c 6c 43  u64)SQLITE_FullC
124d0 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66  olNames;.  db->f
124e0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53  lags |= SQLITE_S
124f0 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20  hortColNames;.  
12500 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
12510 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  p(pParse, pSelec
12520 74 2c 20 30 29 3b 0a 20 20 64 62 2d 3e 66 6c 61  t, 0);.  db->fla
12530 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b  gs = savedFlags;
12540 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
12550 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Err ) return 0;.
12560 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74    while( pSelect
12570 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65  ->pPrior ) pSele
12580 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50  ct = pSelect->pP
12590 72 69 6f 72 3b 0a 20 20 70 54 61 62 20 3d 20 73  rior;.  pTab = s
125a0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
125b0 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
125c0 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54  ble) );.  if( pT
125d0 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ab==0 ){.    ret
125e0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20  urn 0;.  }.  /* 
125f0 54 68 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c  The sqlite3Resul
12600 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69  tSetOfSelect() i
12610 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f  s only used n co
12620 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f  ntexts where loo
12630 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64  kaside.  ** is d
12640 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73  isabled */.  ass
12650 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ert( db->lookasi
12660 64 65 2e 62 44 69 73 61 62 6c 65 20 29 3b 0a 20  de.bDisable );. 
12670 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d   pTab->nTabRef =
12680 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d   1;.  pTab->zNam
12690 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e  e = 0;.  pTab->n
126a0 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b  RowLogEst = 200;
126b0 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71   assert( 200==sq
126c0 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38  lite3LogEst(1048
126d0 35 37 36 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  576) );.  sqlite
126e0 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  3ColumnsFromExpr
126f0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
12700 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70  lect->pEList, &p
12710 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  Tab->nCol, &pTab
12720 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  ->aCol);.  sqlit
12730 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d  e3SelectAddColum
12740 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
12750 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  n(pParse, pTab, 
12760 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62  pSelect);.  pTab
12770 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
12780 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
12790 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
127a0 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
127b0 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65  b, pTab);.    re
127c0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
127d0 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
127e0 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66  .** Get a VDBE f
127f0 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72  or the given par
12800 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72  ser context.  Cr
12810 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
12820 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
12830 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
12840 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  rs, return NULL 
12850 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73  and leave a mess
12860 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
12870 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47  /.Vdbe *sqlite3G
12880 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50  etVdbe(Parse *pP
12890 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61  arse){.  if( pPa
128a0 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20  rse->pVdbe ){.  
128b0 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d    return pParse-
128c0 3e 70 56 64 62 65 3b 0a 20 20 7d 0a 20 20 69 66  >pVdbe;.  }.  if
128d0 28 20 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65  ( pParse->pTople
128e0 76 65 6c 3d 3d 30 0a 20 20 20 26 26 20 4f 70 74  vel==0.   && Opt
128f0 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
12900 28 70 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49  (pParse->db,SQLI
12910 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73  TE_FactorOutCons
12920 74 29 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 72  t).  ){.    pPar
12930 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
12940 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  r = 1;.  }.  ret
12950 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 43  urn sqlite3VdbeC
12960 72 65 61 74 65 28 70 50 61 72 73 65 29 3b 0a 7d  reate(pParse);.}
12970 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  .../*.** Compute
12980 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20   the iLimit and 
12990 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f  iOffset fields o
129a0 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73  f the SELECT bas
129b0 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69  ed on the.** pLi
129c0 6d 69 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  mit expressions.
129d0 20 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20    pLimit->pLeft 
129e0 61 6e 64 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67  and pLimit->pRig
129f0 68 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72  ht hold the expr
12a00 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
12a10 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72  appear in the or
12a20 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
12a30 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c  ment after the L
12a40 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
12a50 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72  ** keywords.  Or
12a60 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b   NULL if those k
12a70 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74  eywords are omit
12a80 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20  ted. iLimit and 
12a90 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20  iOffset .** are 
12aa0 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f  the integer memo
12ab0 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  ry register numb
12ac0 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73  ers for counters
12ad0 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
12ae0 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61   .** the limit a
12af0 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74  nd offset.  If t
12b00 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74  here is no limit
12b10 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20   and/or offset, 
12b20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20  then .** iLimit 
12b30 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20  and iOffset are 
12b40 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
12b50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61  This routine cha
12b60 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  nges the values 
12b70 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  of iLimit and iO
12b80 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a  ffset only if.**
12b90 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73   a limit or offs
12ba0 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
12bb0 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61   pLimit->pLeft a
12bc0 6e 64 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68  nd pLimit->pRigh
12bd0 74 2e 20 20 69 4c 69 6d 69 74 0a 2a 2a 20 61 6e  t.  iLimit.** an
12be0 64 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64  d iOffset should
12bf0 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65   have been prese
12c00 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65  t to appropriate
12c10 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20   default values 
12c20 28 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20  (zero).** prior 
12c30 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
12c40 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
12c50 68 65 20 69 4f 66 66 73 65 74 20 72 65 67 69 73  he iOffset regis
12c60 74 65 72 20 28 69 66 20 69 74 20 65 78 69 73 74  ter (if it exist
12c70 73 29 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  s) is initialize
12c80 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a  d to the value.*
12c90 2a 20 6f 66 20 74 68 65 20 4f 46 46 53 45 54 2e  * of the OFFSET.
12ca0 20 20 54 68 65 20 69 4c 69 6d 69 74 20 72 65 67    The iLimit reg
12cb0 69 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c  ister is initial
12cc0 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20  ized to LIMIT.  
12cd0 52 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66  Register.** iOff
12ce0 73 65 74 2b 31 20 69 73 20 69 6e 69 74 69 61 6c  set+1 is initial
12cf0 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46  ized to LIMIT+OF
12d00 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  FSET..**.** Only
12d10 20 69 66 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66   if pLimit->pLef
12d20 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69  t!=0 do the limi
12d30 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a  t registers get.
12d40 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54  ** redefined.  T
12d50 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
12d60 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20  rator uses this 
12d70 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63  property to forc
12d80 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f  e.** the reuse o
12d90 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74  f the same limit
12da0 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69   and offset regi
12db0 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c  sters across mul
12dc0 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20  tiple.** SELECT 
12dd0 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73  statements..*/.s
12de0 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75  tatic void compu
12df0 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
12e00 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
12e10 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
12e20 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a  Break){.  Vdbe *
12e30 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69  v = 0;.  int iLi
12e40 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  mit = 0;.  int i
12e50 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 6e 3b  Offset;.  int n;
12e60 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20  .  Expr *pLimit 
12e70 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 0a 20 20  = p->pLimit;..  
12e80 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20  if( p->iLimit ) 
12e90 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20  return;..  /* . 
12ea0 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61   ** "LIMIT -1" a
12eb0 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20  lways shows all 
12ec0 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20  rows.  There is 
12ed0 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f  some.  ** contro
12ee0 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74  versy about what
12ef0 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
12f00 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e  avior should be.
12f10 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  .  ** The curren
12f20 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
12f30 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d   interprets "LIM
12f40 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20  IT 0" to mean.  
12f50 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f  ** no rows..  */
12f60 0a 20 20 69 66 28 20 70 4c 69 6d 69 74 20 29 7b  .  if( pLimit ){
12f70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
12f80 6d 69 74 2d 3e 6f 70 3d 3d 54 4b 5f 4c 49 4d 49  mit->op==TK_LIMI
12f90 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  T );.    assert(
12fa0 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21 3d   pLimit->pLeft!=
12fb0 30 20 29 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d  0 );.    p->iLim
12fc0 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b  it = iLimit = ++
12fd0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
12fe0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
12ff0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
13000 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
13010 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
13020 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
13030 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 26 6e  Limit->pLeft, &n
13040 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
13050 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13060 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69  OP_Integer, n, i
13070 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64  Limit);.      Vd
13080 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
13090 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  IMIT counter"));
130a0 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  .      if( n==0 
130b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
130c0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 42  e3VdbeGoto(v, iB
130d0 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c  reak);.      }el
130e0 73 65 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70  se if( n>=0 && p
130f0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 73 71 6c  ->nSelectRow>sql
13100 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29  ite3LogEst((u64)
13110 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  n) ){.        p-
13120 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71  >nSelectRow = sq
13130 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34  lite3LogEst((u64
13140 29 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  )n);.        p->
13150 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 46  selFlags |= SF_F
13160 69 78 65 64 4c 69 6d 69 74 3b 0a 20 20 20 20 20  ixedLimit;.     
13170 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
13180 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
13190 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69 6d  ode(pParse, pLim
131a0 69 74 2d 3e 70 4c 65 66 74 2c 20 69 4c 69 6d 69  it->pLeft, iLimi
131b0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
131c0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
131d0 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69  P_MustBeInt, iLi
131e0 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  mit); VdbeCovera
131f0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62  ge(v);.      Vdb
13200 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
13210 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  MIT counter"));.
13220 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13230 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
13240 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72  Not, iLimit, iBr
13250 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
13260 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ge(v);.    }.   
13270 20 69 66 28 20 70 4c 69 6d 69 74 2d 3e 70 52 69   if( pLimit->pRi
13280 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ght ){.      p->
13290 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65  iOffset = iOffse
132a0 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
132b0 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  em;.      pParse
132c0 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41  ->nMem++;   /* A
132d0 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61  llocate an extra
132e0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69   register for li
132f0 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20  mit+offset */.  
13300 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
13310 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69 6d  ode(pParse, pLim
13320 69 74 2d 3e 70 52 69 67 68 74 2c 20 69 4f 66 66  it->pRight, iOff
13330 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  set);.      sqli
13340 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
13350 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69   OP_MustBeInt, i
13360 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76  Offset); VdbeCov
13370 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
13380 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
13390 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22  "OFFSET counter"
133a0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
133b0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
133c0 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 20 69  P_OffsetLimit, i
133d0 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2b 31  Limit, iOffset+1
133e0 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
133f0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
13400 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22  , "LIMIT+OFFSET"
13410 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ));.    }.  }.}.
13420 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13430 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
13440 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  LECT./*.** Retur
13450 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
13460 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
13470 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f  ence for the iCo
13480 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a  l-th column of.*
13490 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  * the result set
134a0 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
134b0 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  d-select stateme
134c0 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20  nt "p".  Return 
134d0 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63  NULL if.** the c
134e0 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66  olumn has no def
134f0 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ault collating s
13500 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54  equence..**.** T
13510 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
13520 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f  uence for the co
13530 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73  mpound select is
13540 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a   taken from the.
13550 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  ** left-most ter
13560 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  m of the select 
13570 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61  that has a colla
13580 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
13590 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71  /.static CollSeq
135a0 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c   *multiSelectCol
135b0 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
135c0 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
135d0 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c  nt iCol){.  Coll
135e0 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28  Seq *pRet;.  if(
135f0 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
13600 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65    pRet = multiSe
13610 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
13620 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69  se, p->pPrior, i
13630 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Col);.  }else{. 
13640 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d     pRet = 0;.  }
13650 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
13660 3d 30 20 29 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20  =0 );.  /* iCol 
13670 6d 75 73 74 20 62 65 20 6c 65 73 73 20 74 68 61  must be less tha
13680 6e 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  n p->pEList->nEx
13690 70 72 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61  pr.  Otherwise a
136a0 6e 20 65 72 72 6f 72 20 77 6f 75 6c 64 0a 20 20  n error would.  
136b0 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74 68 72  ** have been thr
136c0 6f 77 6e 20 64 75 72 69 6e 67 20 6e 61 6d 65 20  own during name 
136d0 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6e 64 20 77  resolution and w
136e0 65 20 77 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65  e would not have
136f0 20 67 6f 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69   gotten.  ** thi
13700 73 20 66 61 72 20 2a 2f 0a 20 20 69 66 28 20 70  s far */.  if( p
13710 52 65 74 3d 3d 30 20 26 26 20 41 4c 57 41 59 53  Ret==0 && ALWAYS
13720 28 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d  (iCol<p->pEList-
13730 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 70  >nExpr) ){.    p
13740 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Ret = sqlite3Exp
13750 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
13760 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43   p->pEList->a[iC
13770 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  ol].pExpr);.  }.
13780 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
13790 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65  ../*.** The sele
137a0 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
137b0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
137c0 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  d parameter is a
137d0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
137e0 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52 44 45  .** with an ORDE
137f0 52 20 42 59 20 63 6c 61 75 73 65 2e 20 54 68 69  R BY clause. Thi
13800 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  s function alloc
13810 61 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73  ates and returns
13820 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74   a KeyInfo.** st
13830 72 75 63 74 75 72 65 20 73 75 69 74 61 62 6c 65  ructure suitable
13840 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e   for implementin
13850 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a  g the ORDER BY..
13860 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
13870 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  old the KeyInfo 
13880 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74  structure is obt
13890 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
138a0 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  c. The calling.*
138b0 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  * function is re
138c0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e  sponsible for en
138d0 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 69 73  suring that this
138e0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76   structure is ev
138f0 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65  entually.** free
13900 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79  d..*/.static Key
13910 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63  Info *multiSelec
13920 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28  tOrderByKeyInfo(
13930 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
13940 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45  elect *p, int nE
13950 78 74 72 61 29 7b 0a 20 20 45 78 70 72 4c 69 73  xtra){.  ExprLis
13960 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  t *pOrderBy = p-
13970 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74  >pOrderBy;.  int
13980 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   nOrderBy = p->p
13990 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
139a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
139b0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65  pParse->db;.  Ke
139c0 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73 71  yInfo *pRet = sq
139d0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
139e0 63 28 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e  c(db, nOrderBy+n
139f0 45 78 74 72 61 2c 20 31 29 3b 0a 20 20 69 66 28  Extra, 1);.  if(
13a00 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74   pRet ){.    int
13a10 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
13a20 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
13a30 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
13a40 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
13a50 49 74 65 6d 20 3d 20 26 70 4f 72 64 65 72 42 79  Item = &pOrderBy
13a60 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78  ->a[i];.      Ex
13a70 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 49 74 65  pr *pTerm = pIte
13a80 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
13a90 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
13aa0 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
13ab0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
13ac0 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  late ){.        
13ad0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
13ae0 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
13af0 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  e, pTerm);.     
13b00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13b10 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c  pColl = multiSel
13b20 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
13b30 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78  e, p, pItem->u.x
13b40 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b  .iOrderByCol-1);
13b50 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
13b60 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20  ll==0 ) pColl = 
13b70 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
13b80 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d         pOrderBy-
13b90 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20  >a[i].pExpr =.  
13ba0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
13bb0 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72  xprAddCollateStr
13bc0 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54 65 72  ing(pParse, pTer
13bd0 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  m, pColl->zName)
13be0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13bf0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
13c00 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
13c10 65 28 70 52 65 74 29 20 29 3b 0a 20 20 20 20 20  e(pRet) );.     
13c20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20   pRet->aColl[i] 
13c30 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70  = pColl;.      p
13c40 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Ret->aSortOrder[
13c50 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  i] = pOrderBy->a
13c60 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [i].sortOrder;. 
13c70 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
13c80 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e  rn pRet;.}..#ifn
13c90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13ca0 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  CTE./*.** This r
13cb0 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
13cc0 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 63 6f   VDBE code to co
13cd0 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  mpute the conten
13ce0 74 20 6f 66 20 61 20 57 49 54 48 20 52 45 43 55  t of a WITH RECU
13cf0 52 53 49 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f  RSIVE.** query o
13d00 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
13d10 2a 20 20 20 3c 72 65 63 75 72 73 69 76 65 2d 74  *   <recursive-t
13d20 61 62 6c 65 3e 20 41 53 20 28 3c 73 65 74 75 70  able> AS (<setup
13d30 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41  -query> UNION [A
13d40 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76 65 2d 71  LL] <recursive-q
13d50 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20  uery>).**       
13d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d70 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20    \___________/ 
13d80 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
13d90 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a  ____________/.**
13da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13db0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50             p->pP
13dc0 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20  rior            
13dd0 20 20 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a            p.**.*
13de0 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 65 78  *.** There is ex
13df0 61 63 74 6c 79 20 6f 6e 65 20 72 65 66 65 72 65  actly one refere
13e00 6e 63 65 20 74 6f 20 74 68 65 20 72 65 63 75 72  nce to the recur
13e10 73 69 76 65 2d 74 61 62 6c 65 20 69 6e 20 74 68  sive-table in th
13e20 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a  e FROM clause.**
13e30 20 6f 66 20 72 65 63 75 72 73 69 76 65 2d 71 75   of recursive-qu
13e40 65 72 79 2c 20 6d 61 72 6b 65 64 20 77 69 74 68  ery, marked with
13e50 20 74 68 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b   the SrcList->a[
13e60 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65  ].fg.isRecursive
13e70 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   flag..**.** The
13e80 20 73 65 74 75 70 2d 71 75 65 72 79 20 72 75 6e   setup-query run
13e90 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72 61  s once to genera
13ea0 74 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73 65  te an initial se
13eb0 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 67  t of rows that g
13ec0 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65 75  o.** into a Queu
13ed0 65 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20 61  e table.  Rows a
13ee0 72 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  re extracted fro
13ef0 6d 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  m the Queue tabl
13f00 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e  e one by.** one.
13f10 20 20 45 61 63 68 20 72 6f 77 20 65 78 74 72 61    Each row extra
13f20 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 20  cted from Queue 
13f30 69 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65  is output to pDe
13f40 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73 69  st.  Then the si
13f50 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74 65  ngle.** extracte
13f60 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68  d row (now in th
13f70 65 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c 65  e iCurrent table
13f80 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f  ) becomes the co
13f90 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20  ntent of the.** 
13fa0 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20  recursive-table 
13fb0 66 6f 72 20 61 20 72 65 63 75 72 73 69 76 65 2d  for a recursive-
13fc0 71 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65 20  query run.  The 
13fd0 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 72 65  output of the re
13fe0 63 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a  cursive-query.**
13ff0 20 69 73 20 61 64 64 65 64 20 62 61 63 6b 20 69   is added back i
14000 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61  nto the Queue ta
14010 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68  ble.  Then anoth
14020 65 72 20 72 6f 77 20 69 73 20 65 78 74 72 61 63  er row is extrac
14030 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a  ted from Queue.*
14040 2a 20 61 6e 64 20 74 68 65 20 69 74 65 72 61 74  * and the iterat
14050 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e  ion continues un
14060 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 74 61  til the Queue ta
14070 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a  ble is empty..**
14080 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 6f  .** If the compo
14090 75 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61 74  und query operat
140a0 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e  or is UNION then
140b0 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72 6f   no duplicate ro
140c0 77 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20 69  ws are ever.** i
140d0 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65  nserted into the
140e0 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54   Queue table.  T
140f0 68 65 20 69 44 69 73 74 69 6e 63 74 20 74 61 62  he iDistinct tab
14100 6c 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79 20  le keeps a copy 
14110 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74  of all rows.** t
14120 68 61 74 20 68 61 76 65 20 65 76 65 72 20 62 65  hat have ever be
14130 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  en inserted into
14140 20 51 75 65 75 65 20 61 6e 64 20 63 61 75 73 65   Queue and cause
14150 73 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f 20  s duplicates to 
14160 62 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64 2e  be.** discarded.
14170 20 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 6f    If the operato
14180 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  r is UNION ALL, 
14190 74 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73 20  then duplicates 
141a0 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20  are allowed..** 
141b0 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79  .** If the query
141c0 20 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42 59   has an ORDER BY
141d0 2c 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20 69  , then entries i
141e0 6e 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  n the Queue tabl
141f0 65 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a  e are kept in.**
14200 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 20   ORDER BY order 
14210 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 65 6e  and the first en
14220 74 72 79 20 69 73 20 65 78 74 72 61 63 74 65 64  try is extracted
14230 20 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65 2e   for each cycle.
14240 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20    Without.** an 
14250 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 51 75  ORDER BY, the Qu
14260 65 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75 73  eue table is jus
14270 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20  t a FIFO..**.** 
14280 49 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  If a LIMIT claus
14290 65 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20 74  e is provided, t
142a0 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 69 6f  hen the iteratio
142b0 6e 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c 49  n stops after LI
142c0 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65  MIT rows.** have
142d0 20 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f 20   been output to 
142e0 70 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54 20  pDest.  A LIMIT 
142f0 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f  of zero means to
14300 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73 20   output no rows 
14310 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76  and a.** negativ
14320 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f  e LIMIT means to
14330 20 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77 73   output all rows
14340 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61  .  If there is a
14350 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63 6c  lso an OFFSET cl
14360 61 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20 70  ause.** with a p
14370 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20 74  ositive value, t
14380 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f 46  hen the first OF
14390 46 53 45 54 20 6f 75 74 70 75 74 73 20 61 72 65  FSET outputs are
143a0 20 64 69 73 63 61 72 64 65 64 20 72 61 74 68 65   discarded rathe
143b0 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67 20  r.** than being 
143c0 73 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20 20  sent to pDest.  
143d0 54 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20  The LIMIT count 
143e0 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 75  does not begin u
143f0 6e 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53 45  ntil after OFFSE
14400 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20 62  T.** rows have b
14410 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a  een skipped..*/.
14420 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
14430 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76  rateWithRecursiv
14440 65 51 75 65 72 79 28 0a 20 20 50 61 72 73 65 20  eQuery(.  Parse 
14450 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
14460 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
14470 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
14480 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
14490 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20 53   The recursive S
144a0 45 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64 65  ELECT to be code
144b0 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
144c0 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
144d0 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
144e0 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
144f0 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  .){.  SrcList *p
14500 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20  Src = p->pSrc;  
14510 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
14520 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72 65  clause of the re
14530 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f  cursive query */
14540 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d  .  int nCol = p-
14550 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  >pEList->nExpr; 
14560 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
14570 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63  lumns in the rec
14580 75 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a  ursive table */.
14590 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
145a0 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
145b0 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20  /* The prepared 
145c0 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  statement under 
145d0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
145e0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75 70    Select *pSetup
145f0 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20   = p->pPrior;   
14600 2f 2a 20 54 68 65 20 73 65 74 75 70 20 71 75 65  /* The setup que
14610 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ry */.  int addr
14620 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Top;            
14630 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
14640 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  the loop */.  in
14650 74 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72  t addrCont, addr
14660 42 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43  Break;      /* C
14670 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45 41  ONTINUE and BREA
14680 4b 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a 20  K addresses */. 
14690 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20   int iCurrent = 
146a0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
146b0 2a 20 54 68 65 20 43 75 72 72 65 6e 74 20 74 61  * The Current ta
146c0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ble */.  int reg
146d0 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20  Current;        
146e0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
146f0 65 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72 65  er holding Curre
14700 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  nt table */.  in
14710 74 20 69 51 75 65 75 65 3b 20 20 20 20 20 20 20  t iQueue;       
14720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
14730 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a  he Queue table *
14740 2f 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e 63  /.  int iDistinc
14750 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
14760 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20 75    /* To ensure u
14770 6e 69 71 75 65 20 72 65 73 75 6c 74 73 20 69 66  nique results if
14780 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20   UNION */.  int 
14790 65 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66 6f  eDest = SRT_Fifo
147a0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77  ;         /* How
147b0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75 65   to write to Que
147c0 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ue */.  SelectDe
147d0 73 74 20 64 65 73 74 51 75 65 75 65 3b 20 20 20  st destQueue;   
147e0 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 44        /* SelectD
147f0 65 73 74 20 74 61 72 67 65 74 74 69 6e 67 20 74  est targetting t
14800 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a  he Queue table *
14810 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
14820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14830 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
14840 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  r */.  int rc;  
14850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14860 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
14870 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ode */.  ExprLis
14880 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20  t *pOrderBy;    
14890 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52         /* The OR
148a0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
148b0 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b  .  Expr *pLimit;
148c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148d0 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54 20   /* Saved LIMIT 
148e0 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20  and OFFSET */.  
148f0 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72 65  int regLimit, re
14900 67 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a  gOffset;      /*
14910 20 52 65 67 69 73 74 65 72 73 20 75 73 65 64 20   Registers used 
14920 62 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  by LIMIT and OFF
14930 53 45 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  SET */..#ifndef 
14940 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
14950 4f 57 46 55 4e 43 0a 20 20 69 66 28 20 70 2d 3e  OWFUNC.  if( p->
14960 70 57 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  pWin ){.    sqli
14970 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14980 73 65 2c 20 22 63 61 6e 6e 6f 74 20 75 73 65 20  se, "cannot use 
14990 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73  window functions
149a0 20 69 6e 20 72 65 63 75 72 73 69 76 65 20 71 75   in recursive qu
149b0 65 72 69 65 73 22 29 3b 0a 20 20 20 20 72 65 74  eries");.    ret
149c0 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
149d0 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 75 74  .  /* Obtain aut
149e0 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 64 6f  horization to do
149f0 20 61 20 72 65 63 75 72 73 69 76 65 20 71 75 65   a recursive que
14a00 72 79 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  ry */.  if( sqli
14a10 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
14a20 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 43 55  rse, SQLITE_RECU
14a30 52 53 49 56 45 2c 20 30 2c 20 30 2c 20 30 29 20  RSIVE, 0, 0, 0) 
14a40 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
14a50 50 72 6f 63 65 73 73 20 74 68 65 20 4c 49 4d 49  Process the LIMI
14a60 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
14a70 75 73 65 73 2c 20 69 66 20 74 68 65 79 20 65 78  uses, if they ex
14a80 69 73 74 20 2a 2f 0a 20 20 61 64 64 72 42 72 65  ist */.  addrBre
14a90 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
14aa0 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
14ab0 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52  );.  p->nSelectR
14ac0 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20  ow = 320;  /* 4 
14ad0 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a  billion rows */.
14ae0 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
14af0 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
14b00 70 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  p, addrBreak);. 
14b10 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69   pLimit = p->pLi
14b20 6d 69 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74 20  mit;.  regLimit 
14b30 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 72  = p->iLimit;.  r
14b40 65 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f  egOffset = p->iO
14b50 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d  ffset;.  p->pLim
14b60 69 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c 69  it = 0;.  p->iLi
14b70 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74  mit = p->iOffset
14b80 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72 42 79   = 0;.  pOrderBy
14b90 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
14ba0 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
14bb0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
14bc0 66 20 74 68 65 20 43 75 72 72 65 6e 74 20 74 61  f the Current ta
14bd0 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ble */.  for(i=0
14be0 3b 20 41 4c 57 41 59 53 28 69 3c 70 53 72 63 2d  ; ALWAYS(i<pSrc-
14bf0 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a 20 20  >nSrc); i++){.  
14c00 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d    if( pSrc->a[i]
14c10 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  .fg.isRecursive 
14c20 29 7b 0a 20 20 20 20 20 20 69 43 75 72 72 65 6e  ){.      iCurren
14c30 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69  t = pSrc->a[i].i
14c40 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 62 72  Cursor;.      br
14c50 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
14c60 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75    /* Allocate cu
14c70 72 73 6f 72 73 20 6e 75 6d 62 65 72 73 20 66 6f  rsors numbers fo
14c80 72 20 51 75 65 75 65 20 61 6e 64 20 44 69 73 74  r Queue and Dist
14c90 69 6e 63 74 2e 20 20 54 68 65 20 63 75 72 73 6f  inct.  The curso
14ca0 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20 2a  r number for.  *
14cb0 2a 20 74 68 65 20 44 69 73 74 69 6e 63 74 20 74  * the Distinct t
14cc0 61 62 6c 65 20 6d 75 73 74 20 62 65 20 65 78 61  able must be exa
14cd0 63 74 6c 79 20 6f 6e 65 20 67 72 65 61 74 65 72  ctly one greater
14ce0 20 74 68 61 6e 20 51 75 65 75 65 20 69 6e 20 6f   than Queue in o
14cf0 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68  rder.  ** for th
14d00 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 20 61  e SRT_DistFifo a
14d10 6e 64 20 53 52 54 5f 44 69 73 74 51 75 65 75 65  nd SRT_DistQueue
14d20 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 20 74 6f   destinations to
14d30 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51 75 65   work. */.  iQue
14d40 75 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ue = pParse->nTa
14d50 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70  b++;.  if( p->op
14d60 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
14d70 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72    eDest = pOrder
14d80 42 79 20 3f 20 53 52 54 5f 44 69 73 74 51 75 65  By ? SRT_DistQue
14d90 75 65 20 3a 20 53 52 54 5f 44 69 73 74 46 69 66  ue : SRT_DistFif
14da0 6f 3b 0a 20 20 20 20 69 44 69 73 74 69 6e 63 74  o;.    iDistinct
14db0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
14dc0 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
14dd0 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79  eDest = pOrderBy
14de0 20 3f 20 53 52 54 5f 51 75 65 75 65 20 3a 20 53   ? SRT_Queue : S
14df0 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20 20 73  RT_Fifo;.  }.  s
14e00 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
14e10 49 6e 69 74 28 26 64 65 73 74 51 75 65 75 65 2c  Init(&destQueue,
14e20 20 65 44 65 73 74 2c 20 69 51 75 65 75 65 29 3b   eDest, iQueue);
14e30 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
14e40 63 75 72 73 6f 72 73 20 66 6f 72 20 43 75 72 72  cursors for Curr
14e50 65 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e 64 20  ent, Queue, and 
14e60 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20 20 72  Distinct. */.  r
14e70 65 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b 70 50  egCurrent = ++pP
14e80 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71  arse->nMem;.  sq
14e90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
14ea0 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
14eb0 2c 20 69 43 75 72 72 65 6e 74 2c 20 72 65 67 43  , iCurrent, regC
14ec0 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20  urrent, nCol);. 
14ed0 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
14ee0 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
14ef0 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69 53 65  eyInfo = multiSe
14f00 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
14f10 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29  fo(pParse, p, 1)
14f20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14f30 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
14f40 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75  enEphemeral, iQu
14f50 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  eue, pOrderBy->n
14f60 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20  Expr+2, 0,.     
14f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f80 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
14f90 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
14fa0 20 20 20 64 65 73 74 51 75 65 75 65 2e 70 4f 72     destQueue.pOr
14fb0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
14fc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
14fd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14fe0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
14ff0 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 6e 43  eral, iQueue, nC
15000 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62 65 43  ol);.  }.  VdbeC
15010 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75 65 75  omment((v, "Queu
15020 65 20 74 61 62 6c 65 22 29 29 3b 0a 20 20 69 66  e table"));.  if
15030 28 20 69 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  ( iDistinct ){. 
15040 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
15050 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 56  hm[0] = sqlite3V
15060 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15070 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
15080 44 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20  Distinct, 0);.  
15090 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
150a0 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
150b0 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74  l;.  }..  /* Det
150c0 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ach the ORDER BY
150d0 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65   clause from the
150e0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
150f0 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42   */.  p->pOrderB
15100 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f  y = 0;..  /* Sto
15110 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  re the results o
15120 66 20 74 68 65 20 73 65 74 75 70 2d 71 75 65 72  f the setup-quer
15130 79 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f 0a 20  y in Queue. */. 
15140 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d   pSetup->pNext =
15150 20 30 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75 65   0;.  ExplainQue
15160 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
15170 31 2c 20 22 53 45 54 55 50 22 29 29 3b 0a 20 20  1, "SETUP"));.  
15180 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
15190 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 74 75  ct(pParse, pSetu
151a0 70 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b 0a  p, &destQueue);.
151b0 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20    pSetup->pNext 
151c0 3d 20 70 3b 0a 20 20 69 66 28 20 72 63 20 29 20  = p;.  if( rc ) 
151d0 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72 65 63 75  goto end_of_recu
151e0 72 73 69 76 65 5f 71 75 65 72 79 3b 0a 0a 20 20  rsive_query;..  
151f0 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74  /* Find the next
15200 20 72 6f 77 20 69 6e 20 74 68 65 20 51 75 65 75   row in the Queu
15210 65 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 61  e and output tha
15220 74 20 72 6f 77 20 2a 2f 0a 20 20 61 64 64 72 54  t row */.  addrT
15230 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
15240 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
15250 69 6e 64 2c 20 69 51 75 65 75 65 2c 20 61 64 64  ind, iQueue, add
15260 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  rBreak); VdbeCov
15270 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20  erage(v);..  /* 
15280 54 72 61 6e 73 66 65 72 20 74 68 65 20 6e 65 78  Transfer the nex
15290 74 20 72 6f 77 20 69 6e 20 51 75 65 75 65 20 6f  t row in Queue o
152a0 76 65 72 20 74 6f 20 43 75 72 72 65 6e 74 20 2a  ver to Current *
152b0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  /.  sqlite3VdbeA
152c0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp1(v, OP_Null
152d0 52 6f 77 2c 20 69 43 75 72 72 65 6e 74 29 3b 20  Row, iCurrent); 
152e0 2f 2a 20 54 6f 20 72 65 73 65 74 20 63 6f 6c 75  /* To reset colu
152f0 6d 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 69 66  mn cache */.  if
15300 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
15310 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15320 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
15330 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72  , iQueue, pOrder
15340 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67  By->nExpr+1, reg
15350 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 65 6c 73  Current);.  }els
15360 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
15370 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
15380 6f 77 44 61 74 61 2c 20 69 51 75 65 75 65 2c 20  owData, iQueue, 
15390 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d  regCurrent);.  }
153a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
153b0 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74  dOp1(v, OP_Delet
153c0 65 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f  e, iQueue);..  /
153d0 2a 20 4f 75 74 70 75 74 20 74 68 65 20 73 69 6e  * Output the sin
153e0 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65  gle row in Curre
153f0 6e 74 20 2a 2f 0a 20 20 61 64 64 72 43 6f 6e 74  nt */.  addrCont
15400 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
15410 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
15420 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c  .  codeOffset(v,
15430 20 72 65 67 4f 66 66 73 65 74 2c 20 61 64 64 72   regOffset, addr
15440 43 6f 6e 74 29 3b 0a 20 20 73 65 6c 65 63 74 49  Cont);.  selectI
15450 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
15460 20 70 2c 20 69 43 75 72 72 65 6e 74 2c 0a 20 20   p, iCurrent,.  
15470 20 20 20 20 30 2c 20 30 2c 20 70 44 65 73 74 2c      0, 0, pDest,
15480 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42   addrCont, addrB
15490 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 72 65 67  reak);.  if( reg
154a0 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
154b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
154c0 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72  , OP_DecrJumpZer
154d0 6f 2c 20 72 65 67 4c 69 6d 69 74 2c 20 61 64 64  o, regLimit, add
154e0 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62  rBreak);.    Vdb
154f0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
15500 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  }.  sqlite3VdbeR
15510 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
15520 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20  ddrCont);..  /* 
15530 45 78 65 63 75 74 65 20 74 68 65 20 72 65 63 75  Execute the recu
15540 72 73 69 76 65 20 53 45 4c 45 43 54 20 74 61 6b  rsive SELECT tak
15550 69 6e 67 20 74 68 65 20 73 69 6e 67 6c 65 20 72  ing the single r
15560 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20 61 73  ow in Current as
15570 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  .  ** the value 
15580 66 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76  for the recursiv
15590 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72 65 20 74  e-table. Store t
155a0 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
155b0 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20  e Queue..  */.  
155c0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
155d0 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29  & SF_Aggregate )
155e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
155f0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72  orMsg(pParse, "r
15600 65 63 75 72 73 69 76 65 20 61 67 67 72 65 67 61  ecursive aggrega
15610 74 65 20 71 75 65 72 69 65 73 20 6e 6f 74 20 73  te queries not s
15620 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 7d 65  upported");.  }e
15630 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 70 50 72 69  lse{.    p->pPri
15640 6f 72 20 3d 20 30 3b 0a 20 20 20 20 45 78 70 6c  or = 0;.    Expl
15650 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
15660 61 72 73 65 2c 20 31 2c 20 22 52 45 43 55 52 53  arse, 1, "RECURS
15670 49 56 45 20 53 54 45 50 22 29 29 3b 0a 20 20 20  IVE STEP"));.   
15680 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
15690 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51  Parse, p, &destQ
156a0 75 65 75 65 29 3b 0a 20 20 20 20 61 73 73 65 72  ueue);.    asser
156b0 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  t( p->pPrior==0 
156c0 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  );.    p->pPrior
156d0 20 3d 20 70 53 65 74 75 70 3b 0a 20 20 7d 0a 0a   = pSetup;.  }..
156e0 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e    /* Keep runnin
156f0 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c  g the loop until
15700 20 74 68 65 20 51 75 65 75 65 20 69 73 20 65 6d   the Queue is em
15710 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  pty */.  sqlite3
15720 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
15730 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Top);.  sqlite3V
15740 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
15750 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a  v, addrBreak);..
15760 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65  end_of_recursive
15770 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c 69 74 65  _query:.  sqlite
15780 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
15790 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
157a0 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70  OrderBy);.  p->p
157b0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
157c0 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20  By;.  p->pLimit 
157d0 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 72 65 74 75  = pLimit;.  retu
157e0 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rn;.}.#endif /* 
157f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20  SQLITE_OMIT_CTE 
15800 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  */../* Forward r
15810 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 73 74 61  eferences */.sta
15820 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
15830 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61  ectOrderBy(.  Pa
15840 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
15850 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
15860 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
15870 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
15880 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
15890 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
158a0 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
158b0 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
158c0 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
158d0 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
158e0 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a  esults */.);../*
158f0 0a 2a 2a 20 48 61 6e 64 6c 65 20 74 68 65 20 73  .** Handle the s
15900 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61  pecial case of a
15910 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74   compound-select
15920 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73   that originates
15930 20 66 72 6f 6d 20 61 0a 2a 2a 20 56 41 4c 55 45   from a.** VALUE
15940 53 20 63 6c 61 75 73 65 2e 20 20 42 79 20 68 61  S clause.  By ha
15950 6e 64 6c 69 6e 67 20 74 68 69 73 20 61 73 20 61  ndling this as a
15960 20 73 70 65 63 69 61 6c 20 63 61 73 65 2c 20 77   special case, w
15970 65 20 61 76 6f 69 64 20 64 65 65 70 0a 2a 2a 20  e avoid deep.** 
15980 72 65 63 75 72 73 69 6f 6e 2c 20 61 6e 64 20 74  recursion, and t
15990 68 75 73 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20  hus do not need 
159a0 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 65 20 53  to enforce the S
159b0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50  QLITE_LIMIT_COMP
159c0 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f  OUND_SELECT.** o
159d0 6e 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73  n a VALUES claus
159e0 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 63 61 75 73 65  e..**.** Because
159f0 20 74 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65   the Select obje
15a00 63 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72  ct originates fr
15a10 6f 6d 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75  om a VALUES clau
15a20 73 65 3a 0a 2a 2a 20 20 20 28 31 29 20 54 68 65  se:.**   (1) The
15a30 72 65 20 69 73 20 6e 6f 20 4c 49 4d 49 54 20 6f  re is no LIMIT o
15a40 72 20 4f 46 46 53 45 54 20 6f 72 20 65 6c 73 65  r OFFSET or else
15a50 20 74 68 65 72 65 20 69 73 20 61 20 4c 49 4d 49   there is a LIMI
15a60 54 20 6f 66 20 65 78 61 63 74 6c 79 20 31 0a 2a  T of exactly 1.*
15a70 2a 20 20 20 28 32 29 20 41 6c 6c 20 74 65 72 6d  *   (2) All term
15a80 73 20 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a  s are UNION ALL.
15a90 2a 2a 20 20 20 28 33 29 20 54 68 65 72 65 20 69  **   (3) There i
15aa0 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
15ab0 61 75 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  ause.**.** The "
15ac0 4c 49 4d 49 54 20 6f 66 20 65 78 61 63 74 6c 79  LIMIT of exactly
15ad0 20 31 22 20 63 61 73 65 20 6f 66 20 63 6f 6e 64   1" case of cond
15ae0 69 74 69 6f 6e 20 28 31 29 20 63 6f 6d 65 73 20  ition (1) comes 
15af0 61 62 6f 75 74 20 77 68 65 6e 20 61 20 56 41 4c  about when a VAL
15b00 55 45 53 0a 2a 2a 20 63 6c 61 75 73 65 20 6f 63  UES.** clause oc
15b10 63 75 72 73 20 77 69 74 68 69 6e 20 73 63 61 6c  curs within scal
15b20 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 28 65  ar expression (e
15b30 78 3a 20 22 53 45 4c 45 43 54 20 28 56 41 4c 55  x: "SELECT (VALU
15b40 45 53 28 31 29 2c 28 32 29 2c 28 33 29 29 22 29  ES(1),(2),(3))")
15b50 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  ..** The sqlite3
15b60 43 6f 64 65 53 75 62 73 65 6c 65 63 74 20 77 69  CodeSubselect wi
15b70 6c 6c 20 68 61 76 65 20 61 64 64 65 64 20 74 68  ll have added th
15b80 65 20 4c 49 4d 49 54 20 31 20 63 6c 61 75 73 65  e LIMIT 1 clause
15b90 20 69 6e 20 74 68 74 20 63 61 73 65 2e 0a 2a 2a   in tht case..**
15ba0 20 53 69 6e 63 65 20 74 68 65 20 6c 69 6d 69 74   Since the limit
15bb0 20 69 73 20 65 78 61 63 74 6c 79 20 31 2c 20 77   is exactly 1, w
15bc0 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 65  e only need to e
15bd0 76 61 6c 75 74 65 73 20 74 68 65 20 6c 65 66 74  valutes the left
15be0 2d 6d 6f 73 74 20 56 41 4c 55 45 53 2e 0a 2a 2f  -most VALUES..*/
15bf0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
15c00 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28 0a 20  iSelectValues(. 
15c10 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
15c20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
15c30 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
15c40 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
15c50 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
15c60 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
15c70 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
15c80 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
15c90 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
15ca0 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
15cb0 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
15cc0 20 20 69 6e 74 20 6e 52 6f 77 20 3d 20 31 3b 0a    int nRow = 1;.
15cd0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
15ce0 69 6e 74 20 62 53 68 6f 77 41 6c 6c 20 3d 20 70  int bShowAll = p
15cf0 2d 3e 70 4c 69 6d 69 74 3d 3d 30 3b 0a 20 20 61  ->pLimit==0;.  a
15d00 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61  ssert( p->selFla
15d10 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c  gs & SF_MultiVal
15d20 75 65 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  ue );.  do{.    
15d30 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c  assert( p->selFl
15d40 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20  ags & SF_Values 
15d50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
15d60 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ->op==TK_ALL || 
15d70 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  (p->op==TK_SELEC
15d80 54 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  T && p->pPrior==
15d90 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  0) );.    assert
15da0 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c 7c  ( p->pNext==0 ||
15db0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
15dc0 72 3d 3d 70 2d 3e 70 4e 65 78 74 2d 3e 70 45 4c  r==p->pNext->pEL
15dd0 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
15de0 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d    if( p->pPrior=
15df0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
15e00 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f  assert( p->pPrio
15e10 72 2d 3e 70 4e 65 78 74 3d 3d 70 20 29 3b 0a 20  r->pNext==p );. 
15e20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72     p = p->pPrior
15e30 3b 0a 20 20 20 20 6e 52 6f 77 20 2b 3d 20 62 53  ;.    nRow += bS
15e40 68 6f 77 41 6c 6c 3b 0a 20 20 7d 77 68 69 6c 65  howAll;.  }while
15e50 28 31 29 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75  (1);.  ExplainQu
15e60 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
15e70 20 30 2c 20 22 53 43 41 4e 20 25 64 20 43 4f 4e   0, "SCAN %d CON
15e80 53 54 41 4e 54 20 52 4f 57 25 73 22 2c 20 6e 52  STANT ROW%s", nR
15e90 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
15ea0 20 20 20 20 20 20 20 20 6e 52 6f 77 3d 3d 31 20          nRow==1 
15eb0 3f 20 22 22 20 3a 20 22 53 22 29 29 3b 0a 20 20  ? "" : "S"));.  
15ec0 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
15ed0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
15ee0 70 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 30  pParse, p, -1, 0
15ef0 2c 20 30 2c 20 70 44 65 73 74 2c 20 31 2c 20 31  , 0, pDest, 1, 1
15f00 29 3b 0a 20 20 20 20 69 66 28 20 21 62 53 68 6f  );.    if( !bSho
15f10 77 41 6c 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20  wAll ) break;.  
15f20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
15f30 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20  = nRow;.    p = 
15f40 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
15f50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15f60 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
15f70 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72   is called to pr
15f80 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ocess a compound
15f90 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d   query form from
15fa0 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  .** two or more 
15fb0 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73  separate queries
15fc0 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e   using UNION, UN
15fd0 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c  ION ALL, EXCEPT,
15fe0 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54   or.** INTERSECT
15ff0 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74  .**.** "p" point
16000 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  s to the right-m
16010 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71  ost of the two q
16020 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65  ueries.  the que
16030 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66  ry on the.** lef
16040 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20  t is p->pPrior. 
16050 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20   The left query 
16060 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20  could also be a 
16070 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a  compound query.*
16080 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  * in which case 
16090 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
160a0 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75  l be called recu
160b0 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20  rsively. .**.** 
160c0 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  The results of t
160d0 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61  he total query a
160e0 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  re to be written
160f0 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74   into a destinat
16100 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65  ion.** of type e
16110 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65  Dest with parame
16120 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  ter iParm..**.**
16130 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e   Example 1:  Con
16140 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61  sider a three-wa
16150 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73  y compound SQL s
16160 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
16170 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
16180 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t1 UNION SELEC
16190 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f  T b FROM t2 UNIO
161a0 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20  N SELECT c FROM 
161b0 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74  t3.**.** This st
161c0 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
161d0 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  d up as follows:
161e0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
161f0 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20  T c FROM t3.**  
16200 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d      |.**      `-
16210 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20  ---->  SELECT b 
16220 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20  FROM t2.**      
16230 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20            |.**  
16240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d                `-
16250 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61  ----->  SELECT a
16260 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54   FROM t1.**.** T
16270 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65  he arrows in the
16280 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72   diagram above r
16290 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c  epresent the Sel
162a0 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74  ect.pPrior point
162b0 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69  er..** So if thi
162c0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
162d0 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c  led with p equal
162e0 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79   to the t3 query
162f0 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72  , then.** pPrior
16300 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20   will be the t2 
16310 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69  query.  p->op wi
16320 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69  ll be TK_UNION i
16330 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
16340 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62  ** Notice that b
16350 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61  ecause of the wa
16360 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20  y SQLite parses 
16370 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  compound SELECTs
16380 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  , the.** individ
16390 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61  ual selects alwa
163a0 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65  ys group from le
163b0 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a  ft to right..*/.
163c0 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
163d0 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
163e0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
163f0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
16400 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
16410 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
16420 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
16430 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
16440 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
16450 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
16460 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
16470 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
16480 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ts */.){.  int r
16490 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
164a0 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65   /* Success code
164b0 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69   from a subrouti
164c0 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ne */.  Select *
164d0 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
164e0 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
164f0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
16500 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
16510 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
16520 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
16530 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
16540 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
16550 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41   dest;      /* A
16560 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74 61 20  lternative data 
16570 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20  destination */. 
16580 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65   Select *pDelete
16590 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20   = 0;  /* Chain 
165a0 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74  of simple select
165b0 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  s to delete */. 
165c0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
165d0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
165e0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
165f0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
16600 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
16610 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63  ER BY or LIMIT c
16620 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53  lause on prior S
16630 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20  ELECTs.  Only.  
16640 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67  ** the last (rig
16650 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20  ht-most) SELECT 
16660 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61  in the series ma
16670 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  y have an ORDER 
16680 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a  BY or LIMIT..  *
16690 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26 26  /.  assert( p &&
166a0 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f   p->pPrior );  /
166b0 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * Calling functi
166c0 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  on guarantees th
166d0 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73  is much */.  ass
166e0 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
166f0 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
16700 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  )==0 || p->op==T
16710 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  K_ALL || p->op==
16720 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62  TK_UNION );.  db
16730 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
16740 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
16750 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70  ior;.  dest = *p
16760 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72 69  Dest;.  if( pPri
16770 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 7c 7c 20  or->pOrderBy || 
16780 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
16790 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
167a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 25 73  orMsg(pParse,"%s
167b0 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
167c0 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
167d0 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
167e0 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
167f0 21 3d 30 20 3f 20 22 4f 52 44 45 52 20 42 59 22  !=0 ? "ORDER BY"
16800 20 3a 20 22 4c 49 4d 49 54 22 2c 20 73 65 6c 65   : "LIMIT", sele
16810 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
16820 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
16830 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
16840 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
16850 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
16860 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  be(pParse);.  as
16870 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f  sert( v!=0 );  /
16880 2a 20 54 68 65 20 56 44 42 45 20 61 6c 72 65 61  * The VDBE alrea
16890 64 79 20 63 72 65 61 74 65 64 20 62 79 20 63 61  dy created by ca
168a0 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a  lling function *
168b0 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74  /..  /* Create t
168c0 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74  he destination t
168d0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
168e0 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f  f necessary.  */
168f0 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73  .  if( dest.eDes
16900 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
16910 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
16920 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
16930 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16940 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
16950 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 53 44 50  meral, dest.iSDP
16960 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  arm, p->pEList->
16970 6e 45 78 70 72 29 3b 0a 20 20 20 20 64 65 73 74  nExpr);.    dest
16980 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62  .eDest = SRT_Tab
16990 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70  le;.  }..  /* Sp
169a0 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20 66  ecial handling f
169b0 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65  or a compound-se
169c0 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67 69 6e  lect that origin
169d0 61 74 65 73 20 61 73 20 61 20 56 41 4c 55 45 53  ates as a VALUES
169e0 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
169f0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
16a00 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20  & SF_MultiValue 
16a10 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74  ){.    rc = mult
16a20 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28 70 50  iSelectValues(pP
16a30 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b  arse, p, &dest);
16a40 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
16a50 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
16a60 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
16a70 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74  all SELECTs in t
16a80 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76  he statement hav
16a90 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
16aa0 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20  r of elements.  
16ab0 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73 75  ** in their resu
16ac0 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20  lt sets..  */.  
16ad0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
16ae0 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c  t && pPrior->pEL
16af0 69 73 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ist );.  assert(
16b00 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
16b10 72 3d 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  r==pPrior->pELis
16b20 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 0a 23 69 66  t->nExpr );..#if
16b30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16b40 5f 43 54 45 0a 20 20 69 66 28 20 70 2d 3e 73 65  _CTE.  if( p->se
16b50 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
16b60 72 73 69 76 65 20 29 7b 0a 20 20 20 20 67 65 6e  rsive ){.    gen
16b70 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69  erateWithRecursi
16b80 76 65 51 75 65 72 79 28 70 50 61 72 73 65 2c 20  veQuery(pParse, 
16b90 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d 65 6c  p, &dest);.  }el
16ba0 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  se.#endif..  /* 
16bb0 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  Compound SELECTs
16bc0 20 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52   that have an OR
16bd0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
16be0 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61  e handled separa
16bf0 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tely..  */.  if(
16c00 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
16c10 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69      return multi
16c20 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50  SelectOrderBy(pP
16c30 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
16c40 0a 20 20 7d 65 6c 73 65 7b 0a 0a 23 69 66 6e 64  .  }else{..#ifnd
16c50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
16c60 58 50 4c 41 49 4e 0a 20 20 20 20 69 66 28 20 70  XPLAIN.    if( p
16c70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30  Prior->pPrior==0
16c80 20 29 7b 0a 20 20 20 20 20 20 45 78 70 6c 61 69   ){.      Explai
16c90 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
16ca0 73 65 2c 20 31 2c 20 22 43 4f 4d 50 4f 55 4e 44  se, 1, "COMPOUND
16cb0 20 51 55 45 52 59 22 29 29 3b 0a 20 20 20 20 20   QUERY"));.     
16cc0 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61   ExplainQueryPla
16cd0 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 4c  n((pParse, 1, "L
16ce0 45 46 54 2d 4d 4f 53 54 20 53 55 42 51 55 45 52  EFT-MOST SUBQUER
16cf0 59 22 29 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Y"));.    }.#end
16d00 69 66 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72  if..    /* Gener
16d10 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
16d20 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
16d30 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
16d40 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 77  s..    */.    sw
16d50 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
16d60 20 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c       case TK_ALL
16d70 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  : {.        int 
16d80 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  addr = 0;.      
16d90 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20    int nLimit;.  
16da0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
16db0 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b  Prior->pLimit );
16dc0 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d  .        pPrior-
16dd0 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69  >iLimit = p->iLi
16de0 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 50 72  mit;.        pPr
16df0 69 6f 72 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70  ior->iOffset = p
16e00 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->iOffset;.     
16e10 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69     pPrior->pLimi
16e20 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
16e30 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
16e40 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
16e50 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29  , pPrior, &dest)
16e60 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69  ;.        p->pLi
16e70 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  mit = 0;.       
16e80 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
16e90 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
16ea0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
16eb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d      }.        p-
16ec0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
16ed0 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
16ee0 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b   pPrior->iLimit;
16ef0 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  .        p->iOff
16f00 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f  set = pPrior->iO
16f10 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69  ffset;.        i
16f20 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  f( p->iLimit ){.
16f30 20 20 20 20 20 20 20 20 20 20 61 64 64 72 20 3d            addr =
16f40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16f50 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
16f60 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56 64 62 65  p->iLimit); Vdbe
16f70 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
16f80 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
16f90 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65  nt((v, "Jump ahe
16fa0 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63  ad if LIMIT reac
16fb0 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20  hed"));.        
16fc0 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74    if( p->iOffset
16fd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
16fe0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16ff0 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69  3(v, OP_OffsetLi
17000 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mit,.           
17010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17020 20 20 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d     p->iLimit, p-
17030 3e 69 4f 66 66 73 65 74 2b 31 2c 20 70 2d 3e 69  >iOffset+1, p->i
17040 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  Offset);.       
17050 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
17060 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75         ExplainQu
17070 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
17080 20 31 2c 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 29   1, "UNION ALL")
17090 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
170a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
170b0 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b  arse, p, &dest);
170c0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
170d0 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
170e0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 6c   );.        pDel
170f0 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ete = p->pPrior;
17100 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69  .        p->pPri
17110 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
17120 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
17130 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
17140 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74  stAdd(p->nSelect
17150 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65  Row, pPrior->nSe
17160 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  lectRow);.      
17170 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c    if( pPrior->pL
17180 69 6d 69 74 0a 20 20 20 20 20 20 20 20 20 26 26  imit.         &&
17190 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
171a0 74 65 67 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c  teger(pPrior->pL
171b0 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 4c  imit->pLeft, &nL
171c0 69 6d 69 74 29 0a 20 20 20 20 20 20 20 20 20 26  imit).         &
171d0 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d  & nLimit>0 && p-
171e0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 73 71  >nSelectRow > sq
171f0 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34  lite3LogEst((u64
17200 29 6e 4c 69 6d 69 74 29 20 0a 20 20 20 20 20 20  )nLimit) .      
17210 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
17220 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
17230 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36  qlite3LogEst((u6
17240 34 29 6e 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  4)nLimit);.     
17250 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
17260 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20   addr ){.       
17270 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
17280 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
17290 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
172a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
172b0 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f  }.      case TK_
172c0 45 58 43 45 50 54 3a 0a 20 20 20 20 20 20 63 61  EXCEPT:.      ca
172d0 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20  se TK_UNION: {. 
172e0 20 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e         int union
172f0 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f  Tab;    /* Curso
17300 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
17310 74 65 6d 70 20 74 61 62 6c 65 20 68 6f 6c 64 69  temp table holdi
17320 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20  ng result */.   
17330 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30 3b 20       u8 op = 0; 
17340 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
17350 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  the SRT_ operati
17360 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ons to apply to 
17370 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 20 20  self */.        
17380 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20  int priorOp;    
17390 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65   /* The SRT_ ope
173a0 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20  ration to apply 
173b0 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73  to prior selects
173c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72   */.        Expr
173d0 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20   *pLimit;    /* 
173e0 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20  Saved values of 
173f0 70 2d 3e 6e 4c 69 6d 69 74 20 20 2a 2f 0a 20 20  p->nLimit  */.  
17400 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
17410 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65          SelectDe
17420 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 20 20  st uniondest;.  
17430 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
17440 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43  e( p->op==TK_EXC
17450 45 50 54 20 29 3b 0a 20 20 20 20 20 20 20 20 74  EPT );.        t
17460 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
17470 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20  TK_UNION );.    
17480 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52      priorOp = SR
17490 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 20  T_Union;.       
174a0 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
174b0 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20  =priorOp ){.    
174c0 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20        /* We can 
174d0 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72  reuse a temporar
174e0 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  y table generate
174f0 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f  d by a SELECT to
17500 20 6f 75 72 0a 20 20 20 20 20 20 20 20 20 20 2a   our.          *
17510 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20  * right..       
17520 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
17530 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69  assert( p->pLimi
17540 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  t==0 );      /* 
17550 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c  Not allowed on l
17560 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73  eftward elements
17570 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e   */.          un
17580 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 53  ionTab = dest.iS
17590 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 20 20 7d  DParm;.        }
175a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
175b0 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20  /* We will need 
175c0 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77  to create our ow
175d0 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
175e0 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20  e to hold the.  
175f0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72          ** inter
17600 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e  mediate results.
17610 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
17620 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
17630 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
17640 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  +;.          ass
17650 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
17660 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
17670 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
17680 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17690 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75  OpenEphemeral, u
176a0 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
176b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
176c0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
176d0 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
176e0 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
176f0 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
17700 20 20 20 20 20 20 20 20 20 20 66 69 6e 64 52 69            findRi
17710 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46  ghtmost(p)->selF
17720 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
17730 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20  phemeral;.      
17740 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
17750 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20  EList );.       
17760 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a   }.  .        /*
17770 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
17780 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f   statements to o
17790 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20  ur left.        
177a0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
177b0 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64  t( !pPrior->pOrd
177c0 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20 20 20  erBy );.        
177d0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
177e0 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74  tInit(&uniondest
177f0 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e  , priorOp, union
17800 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 72 63  Tab);.        rc
17810 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
17820 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
17830 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20   &uniondest);.  
17840 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
17850 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
17860 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
17870 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  .        }.  .  
17880 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
17890 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
178a0 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20   statement.     
178b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
178c0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45  ( p->op==TK_EXCE
178d0 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  PT ){.          
178e0 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b  op = SRT_Except;
178f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
17900 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
17910 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
17920 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  N );.          o
17930 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
17940 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17950 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
17960 20 20 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d          pLimit =
17970 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
17980 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
17990 30 3b 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  0;.        union
179a0 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b  dest.eDest = op;
179b0 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e  .        Explain
179c0 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
179d0 65 2c 20 31 2c 20 22 25 73 20 55 53 49 4e 47 20  e, 1, "%s USING 
179e0 54 45 4d 50 20 42 2d 54 52 45 45 22 2c 0a 20 20  TEMP B-TREE",.  
179f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a00 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70          selectOp
17a10 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 29 3b 0a 20  Name(p->op)));. 
17a20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
17a30 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
17a40 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29  , p, &uniondest)
17a50 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
17a60 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
17a70 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K );.        /* 
17a80 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  Query flattening
17a90 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63   in sqlite3Selec
17aa0 74 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c  t() might refill
17ab0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20   p->pOrderBy..  
17ac0 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65        ** Be sure
17ad0 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f   to delete p->pO
17ae0 72 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72  rderBy, therefor
17af0 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65  e, to avoid a me
17b00 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20  mory leak. */.  
17b10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
17b20 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
17b30 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
17b40 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20        pDelete = 
17b50 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  p->pPrior;.     
17b60 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
17b70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 70  Prior;.        p
17b80 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
17b90 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f          if( p->o
17ba0 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
17bb0 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c           p->nSel
17bc0 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
17bd0 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65  LogEstAdd(p->nSe
17be0 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d  lectRow, pPrior-
17bf0 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20  >nSelectRow);.  
17c00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17c10 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
17c20 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
17c30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69  ;.        p->pLi
17c40 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
17c50 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
17c60 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 0;.        p->
17c70 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 0a  iOffset = 0;.  .
17c80 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65          /* Conve
17c90 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74  rt the data in t
17ca0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
17cb0 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72  le into whatever
17cc0 20 66 6f 72 6d 0a 20 20 20 20 20 20 20 20 2a 2a   form.        **
17cd0 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63   it is that we c
17ce0 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20  urrently need.. 
17cf0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
17d00 20 20 61 73 73 65 72 74 28 20 75 6e 69 6f 6e 54    assert( unionT
17d10 61 62 3d 3d 64 65 73 74 2e 69 53 44 50 61 72 6d  ab==dest.iSDParm
17d20 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d   || dest.eDest!=
17d30 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20  priorOp );.     
17d40 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
17d50 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20  t!=priorOp ){.  
17d60 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e          int iCon
17d70 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
17d80 74 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  t;.          ass
17d90 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
17da0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 42 72 65  ;.          iBre
17db0 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
17dc0 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
17dd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  );.          iCo
17de0 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
17df0 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
17e00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6d  );.          com
17e10 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
17e20 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42  rs(pParse, p, iB
17e30 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  reak);.         
17e40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17e50 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
17e60 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61   unionTab, iBrea
17e70 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
17e80 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  (v);.          i
17e90 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
17ea0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
17eb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65 6c  );.          sel
17ec0 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
17ed0 72 73 65 2c 20 70 2c 20 75 6e 69 6f 6e 54 61 62  rse, p, unionTab
17ee0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
17f00 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20  , &dest, iCont, 
17f10 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
17f20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
17f30 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
17f40 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ont);.          
17f50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17f60 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e  2(v, OP_Next, un
17f70 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b  ionTab, iStart);
17f80 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
17f90 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
17fa0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
17fb0 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
17fc0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17fd0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17fe0 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61  P_Close, unionTa
17ff0 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  b, 0);.        }
18000 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
18010 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65        }.      de
18020 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70  fault: assert( p
18030 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  ->op==TK_INTERSE
18040 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 20 20  CT ); {.        
18050 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a  int tab1, tab2;.
18060 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e          int iCon
18070 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
18080 74 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  t;.        Expr 
18090 2a 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20  *pLimit;.       
180a0 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
180b0 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 69 6e     SelectDest in
180c0 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20 20 20  tersectdest;.   
180d0 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 0a       int r1;.  .
180e0 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52          /* INTER
180f0 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e  SECT is differen
18100 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  t from the other
18110 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69  s since it requi
18120 72 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  res.        ** t
18130 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  wo temporary tab
18140 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68  les.  Hence it h
18150 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e  as its own case.
18160 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20 20 20    Begin.        
18170 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67  ** by allocating
18180 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77   the tables we w
18190 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  ill need..      
181a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 61 62    */.        tab
181b0 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  1 = pParse->nTab
181c0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 74 61 62 32  ++;.        tab2
181d0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
181e0 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
181f0 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
18200 30 20 29 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  0 );.  .        
18210 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
18220 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
18230 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
18240 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  b1, 0);.        
18250 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
18260 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31  penEphm[0] == -1
18270 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   );.        p->a
18280 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
18290 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 66   addr;.        f
182a0 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d  indRightmost(p)-
182b0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
182c0 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
182d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
182e0 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 0a 20  ->pEList );.  . 
182f0 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74         /* Code t
18300 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75  he SELECTs to ou
18310 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70  r left into temp
18320 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62  orary table "tab
18330 31 22 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  1"..        */. 
18340 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
18350 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e  lectDestInit(&in
18360 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52 54  tersectdest, SRT
18370 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20  _Union, tab1);. 
18380 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
18390 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
183a0 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74 65 72  , pPrior, &inter
183b0 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20  sectdest);.     
183c0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
183d0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
183e0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
183f0 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
18400 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
18410 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e  urrent SELECT in
18420 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
18430 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20  le "tab2".      
18440 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64 64    */.        add
18450 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
18460 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
18470 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c  Ephemeral, tab2,
18480 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73   0);.        ass
18490 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
184a0 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[1] == -1 );
184b0 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72  .        p->addr
184c0 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64  OpenEphm[1] = ad
184d0 64 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  dr;.        p->p
184e0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
184f0 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70     pLimit = p->p
18500 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70  Limit;.        p
18510 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
18520 20 20 20 20 20 20 69 6e 74 65 72 73 65 63 74 64        intersectd
18530 65 73 74 2e 69 53 44 50 61 72 6d 20 3d 20 74 61  est.iSDParm = ta
18540 62 32 3b 0a 20 20 20 20 20 20 20 20 45 78 70 6c  b2;.        Expl
18550 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
18560 61 72 73 65 2c 20 31 2c 20 22 25 73 20 55 53 49  arse, 1, "%s USI
18570 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 22 2c  NG TEMP B-TREE",
18580 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18590 20 20 20 20 20 20 20 20 20 20 20 73 65 6c 65 63             selec
185a0 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 29  tOpName(p->op)))
185b0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
185c0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
185d0 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65  rse, p, &interse
185e0 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 20  ctdest);.       
185f0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
18600 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
18610 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
18620 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
18630 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
18640 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ior;.        if(
18650 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70   p->nSelectRow>p
18660 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
18670 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  w ){.          p
18680 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70  ->nSelectRow = p
18690 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
186a0 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  w;.        }.   
186b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
186c0 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
186d0 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 70  imit);.        p
186e0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
186f0 74 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a  t;.  .        /*
18700 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
18710 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72  o take the inter
18720 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  section of the t
18730 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  wo temporary.   
18740 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a       ** tables..
18750 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
18760 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
18770 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  List );.        
18780 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
18790 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
187a0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
187b0 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
187c0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
187d0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d  se);.        com
187e0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
187f0 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42  rs(pParse, p, iB
18800 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
18810 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18820 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74  (v, OP_Rewind, t
18830 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  ab1, iBreak); Vd
18840 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
18850 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
18860 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
18870 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
18880 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
18890 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
188a0 52 6f 77 44 61 74 61 2c 20 74 61 62 31 2c 20 72  RowData, tab1, r
188b0 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
188c0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
188d0 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
188e0 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31   tab2, iCont, r1
188f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64  , 0);.        Vd
18900 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
18910 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
18920 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
18930 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
18940 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
18950 70 28 70 50 61 72 73 65 2c 20 70 2c 20 74 61 62  p(pParse, p, tab
18960 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
18970 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
18980 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69   &dest, iCont, i
18990 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
189a0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
189b0 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
189c0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
189d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
189e0 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69  OP_Next, tab1, i
189f0 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65  Start); VdbeCove
18a00 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
18a10 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
18a20 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
18a30 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
18a40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18a50 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32  , OP_Close, tab2
18a60 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
18a70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18a80 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
18a90 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62  1, 0);.        b
18aa0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
18ab0 20 20 7d 0a 20 20 0a 20 20 23 69 66 6e 64 65 66    }.  .  #ifndef
18ac0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
18ad0 4c 41 49 4e 0a 20 20 20 20 69 66 28 20 70 2d 3e  LAIN.    if( p->
18ae0 70 4e 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pNext==0 ){.    
18af0 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
18b00 61 6e 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  anPop(pParse);. 
18b10 20 20 20 7d 0a 20 20 23 65 6e 64 69 66 0a 20 20     }.  #endif.  
18b20 7d 0a 20 20 0a 20 20 2f 2a 20 43 6f 6d 70 75 74  }.  .  /* Comput
18b30 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
18b40 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a 20  ences used by . 
18b50 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61   ** temporary ta
18b60 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69  bles needed to i
18b70 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d  mplement the com
18b80 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
18b90 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65  ** Attach the Ke
18ba0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
18bb0 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79  to all temporary
18bc0 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
18bd0 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  ** This section 
18be0 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69  is run by the ri
18bf0 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20  ght-most SELECT 
18c00 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a  statement only..
18c10 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
18c20 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65  ements to the le
18c30 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74  ft always skip t
18c40 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72  his part.  The r
18c50 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53  ight-most.  ** S
18c60 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f  ELECT might also
18c70 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20   skip this part 
18c80 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44  if it has no ORD
18c90 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
18ca0 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61  .  ** no temp ta
18cb0 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65  bles are require
18cc0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
18cd0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55  >selFlags & SF_U
18ce0 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a  sesEphemeral ){.
18cf0 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
18d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d10 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
18d20 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f  r */.    KeyInfo
18d30 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20   *pKeyInfo;     
18d40 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
18d50 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
18d60 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
18d70 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  */.    Select *p
18d80 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
18d90 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
18da0 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45  ing through SELE
18db0 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  CT statements */
18dc0 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61  .    CollSeq **a
18dd0 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
18de0 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
18df0 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e  g through pKeyIn
18e00 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20  fo->aColl[] */. 
18e10 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20     int nCol;    
18e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e30 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
18e40 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20  lumns in result 
18e50 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  set */..    asse
18e60 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20  rt( p->pNext==0 
18e70 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d  );.    nCol = p-
18e80 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
18e90 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
18ea0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
18eb0 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b  oc(db, nCol, 1);
18ec0 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e  .    if( !pKeyIn
18ed0 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fo ){.      rc =
18ee0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
18ef0 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  PT;.      goto m
18f00 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
18f10 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
18f20 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49  =0, apColl=pKeyI
18f30 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43  nfo->aColl; i<nC
18f40 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b  ol; i++, apColl+
18f50 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c  +){.      *apCol
18f60 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
18f70 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
18f80 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
18f90 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20  0==*apColl ){.  
18fa0 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
18fb0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
18fc0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
18fd0 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70    for(pLoop=p; p
18fe0 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
18ff0 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  p->pPrior){.    
19000 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20    for(i=0; i<2; 
19010 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
19020 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e  t addr = pLoop->
19030 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b  addrOpenEphm[i];
19040 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
19050 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  r<0 ){.         
19060 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e   /* If [0] is un
19070 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73  used then [1] is
19080 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53   also unused.  S
19090 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20  o we can.       
190a0 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66     ** always saf
190b0 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f  ely abort as soo
190c0 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75  n as the first u
190d0 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f  nused slot is fo
190e0 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  und */.         
190f0 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
19100 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c  addrOpenEphm[1]<
19110 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  0 );.          b
19120 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
19130 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
19140 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
19150 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  ddr, nCol);.    
19160 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
19170 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c  hangeP4(v, addr,
19180 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b   (char*)sqlite3K
19190 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e  eyInfoRef(pKeyIn
191a0 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  fo),.           
191b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191c0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
191d0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64        pLoop->add
191e0 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d  rOpenEphm[i] = -
191f0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
19200 0a 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49  .    sqlite3KeyI
19210 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66  nfoUnref(pKeyInf
19220 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73  o);.  }..multi_s
19230 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65  elect_end:.  pDe
19240 73 74 2d 3e 69 53 64 73 74 20 3d 20 64 65 73 74  st->iSdst = dest
19250 2e 69 53 64 73 74 3b 0a 20 20 70 44 65 73 74 2d  .iSdst;.  pDest-
19260 3e 6e 53 64 73 74 20 3d 20 64 65 73 74 2e 6e 53  >nSdst = dest.nS
19270 64 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  dst;.  sqlite3Se
19280 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
19290 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72  Delete);.  retur
192a0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
192b0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
192c0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
192d0 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d 65  ../*.** Error me
192e0 73 73 61 67 65 20 66 6f 72 20 77 68 65 6e 20 74  ssage for when t
192f0 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73  wo or more terms
19300 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
19310 65 6c 65 63 74 20 68 61 76 65 20 64 69 66 66 65  elect have diffe
19320 72 65 6e 74 0a 2a 2a 20 73 69 7a 65 20 72 65 73  rent.** size res
19330 75 6c 74 20 73 65 74 73 2e 0a 2a 2f 0a 76 6f 69  ult sets..*/.voi
19340 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  d sqlite3SelectW
19350 72 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f  rongNumTermsErro
19360 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
19370 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
19380 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
19390 20 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20   SF_Values ){.  
193a0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
193b0 67 28 70 50 61 72 73 65 2c 20 22 61 6c 6c 20 56  g(pParse, "all V
193c0 41 4c 55 45 53 20 6d 75 73 74 20 68 61 76 65 20  ALUES must have 
193d0 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
193e0 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20 20 7d 65  of terms");.  }e
193f0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
19400 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
19410 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65   "SELECTs to the
19420 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
19430 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64  of %s".      " d
19440 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73  o not have the s
19450 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  ame number of re
19460 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73  sult columns", s
19470 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
19480 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  p));.  }.}../*.*
19490 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74  * Code an output
194a0 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   subroutine for 
194b0 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c  a coroutine impl
194c0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a  ementation of a.
194d0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65  ** SELECT statme
194e0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61  nt..**.** The da
194f0 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20  ta to be output 
19500 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
19510 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65  pIn->iSdst.  The
19520 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e  re are.** pIn->n
19530 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  Sdst columns to 
19540 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73  be output.  pDes
19550 74 20 69 73 20 77 68 65 72 65 20 74 68 65 20 6f  t is where the o
19560 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  utput should.** 
19570 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72  be sent..**.** r
19580 65 67 52 65 74 75 72 6e 20 69 73 20 74 68 65 20  egReturn is the 
19590 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65  number of the re
195a0 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
195b0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a  he subroutine.**
195c0 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e   return address.
195d0 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65  .**.** If regPre
195e0 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20 74  v>0 then it is t
195f0 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
19600 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68  r in a vector th
19610 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68  at.** records th
19620 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  e previous outpu
19630 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d  t.  mem[regPrev]
19640 20 69 73 20 61 20 66 6c 61 67 20 74 68 61 74 20   is a flag that 
19650 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74  is false.** if t
19660 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f  here has been no
19670 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
19680 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e 30 20  .  If regPrev>0 
19690 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20  then code is.** 
196a0 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70  generated to sup
196b0 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73  press duplicates
196c0 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75  .  pKeyInfo is u
196d0 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e  sed for comparin
196e0 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a  g.** keys..**.**
196f0 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f   If the LIMIT fo
19700 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74  und in p->iLimit
19710 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d   is reached, jum
19720 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
19730 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73  .** iBreak..*/.s
19740 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61  tatic int genera
19750 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
19760 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ne(.  Parse *pPa
19770 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
19780 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
19790 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
197a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
197b0 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
197c0 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ement */.  Selec
197d0 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20  tDest *pIn,     
197e0 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20     /* Coroutine 
197f0 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a  supplying data *
19800 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
19810 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57  pDest,      /* W
19820 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65  here to send the
19830 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72   data */.  int r
19840 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20  egReturn,       
19850 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
19860 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
19870 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  r */.  int regPr
19880 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev,            /
19890 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c  * Previous resul
198a0 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20  t register.  No 
198b0 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30 20  uniqueness if 0 
198c0 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
198d0 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20  eyInfo,      /* 
198e0 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69  For comparing wi
198f0 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  th previous entr
19900 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61  y */.  int iBrea
19910 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k              /
19920 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77  * Jump here if w
19930 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20  e hit the LIMIT 
19940 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
19950 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
19960 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
19970 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20  ;.  int addr;.. 
19980 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
19990 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
199a0 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d  );.  iContinue =
199b0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
199c0 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a  Label(pParse);..
199d0 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75    /* Suppress du
199e0 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49  plicates for UNI
199f0 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20  ON, EXCEPT, and 
19a00 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a  INTERSECT .  */.
19a10 20 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b    if( regPrev ){
19a20 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20  .    int addr1, 
19a30 61 64 64 72 32 3b 0a 20 20 20 20 61 64 64 72 31  addr2;.    addr1
19a40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
19a50 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
19a60 2c 20 72 65 67 50 72 65 76 29 3b 20 56 64 62 65  , regPrev); Vdbe
19a70 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
19a80 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33   addr2 = sqlite3
19a90 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
19aa0 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69  _Compare, pIn->i
19ab0 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c  Sdst, regPrev+1,
19ac0 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20   pIn->nSdst,.   
19ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ae0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
19af0 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  *)sqlite3KeyInfo
19b00 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50  Ref(pKeyInfo), P
19b10 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
19b20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19b30 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64  3(v, OP_Jump, ad
19b40 64 72 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65  dr2+2, iContinue
19b50 2c 20 61 64 64 72 32 2b 32 29 3b 20 56 64 62 65  , addr2+2); Vdbe
19b60 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
19b70 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
19b80 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
19b90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19ba0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp3(v, OP_Copy
19bb0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65  , pIn->iSdst, re
19bc0 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53  gPrev+1, pIn->nS
19bd0 64 73 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69  dst-1);.    sqli
19be0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19bf0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
19c00 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20  regPrev);.  }.  
19c10 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
19c20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
19c30 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53  eturn 0;..  /* S
19c40 75 70 70 72 65 73 73 20 74 68 65 20 66 69 72 73  uppress the firs
19c50 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73  t OFFSET entries
19c60 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
19c70 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a 20 20  OFFSET clause.  
19c80 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28  */.  codeOffset(
19c90 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69  v, p->iOffset, i
19ca0 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 61 73  Continue);..  as
19cb0 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65  sert( pDest->eDe
19cc0 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29  st!=SRT_Exists )
19cd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 65 73  ;.  assert( pDes
19ce0 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 54 61  t->eDest!=SRT_Ta
19cf0 62 6c 65 20 29 3b 0a 20 20 73 77 69 74 63 68 28  ble );.  switch(
19d00 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b   pDest->eDest ){
19d10 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68  .    /* Store th
19d20 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61  e result as data
19d30 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20   using a unique 
19d40 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  key..    */.    
19d50 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
19d60 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  b: {.      int r
19d70 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
19d80 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
19d90 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71       int r2 = sq
19da0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
19db0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
19dc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
19dd0 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
19de0 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  d, pIn->iSdst, p
19df0 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a  In->nSdst, r1);.
19e00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19e10 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
19e20 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69  wRowid, pDest->i
19e30 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20  SDParm, r2);.   
19e40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19e50 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
19e60 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  t, pDest->iSDPar
19e70 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20  m, r1, r2);.    
19e80 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
19e90 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
19ea0 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73  APPEND);.      s
19eb0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
19ec0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
19ed0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
19ee0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
19ef0 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
19f00 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
19f10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19f20 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
19f30 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65  /* If we are cre
19f40 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20  ating a set for 
19f50 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c  an "expr IN (SEL
19f60 45 43 54 20 2e 2e 2e 29 22 2e 0a 20 20 20 20 2a  ECT ...)"..    *
19f70 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
19f80 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  et: {.      int 
19f90 72 31 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  r1;.      testca
19fa0 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3e 31  se( pIn->nSdst>1
19fb0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
19fc0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
19fd0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
19fe0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19ff0 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
1a000 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  rd, pIn->iSdst, 
1a010 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 0a 20 20 20  pIn->nSdst, .   
1a020 20 20 20 20 20 20 20 72 31 2c 20 70 44 65 73 74         r1, pDest
1a030 2d 3e 7a 41 66 66 53 64 73 74 2c 20 70 49 6e 2d  ->zAffSdst, pIn-
1a040 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73  >nSdst);.      s
1a050 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1a060 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
1a070 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ert, pDest->iSDP
1a080 61 72 6d 2c 20 72 31 2c 0a 20 20 20 20 20 20 20  arm, r1,.       
1a090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0a0 20 20 20 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20      pIn->iSdst, 
1a0b0 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
1a0c0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1a0d0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1a0e0 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
1a0f0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1a100 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63   If this is a sc
1a110 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74  alar select that
1a120 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
1a130 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a  xpression, then.
1a140 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
1a150 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
1a160 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f  appropriate memo
1a170 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61  ry cell and brea
1a180 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20  k out.    ** of 
1a190 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  the scan loop.. 
1a1a0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1a1b0 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
1a1c0 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64  assert( pIn->nSd
1a1d0 73 74 3d 3d 31 20 7c 7c 20 70 50 61 72 73 65 2d  st==1 || pParse-
1a1e0 3e 6e 45 72 72 3e 30 20 29 3b 20 20 74 65 73 74  >nErr>0 );  test
1a1f0 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74  case( pIn->nSdst
1a200 21 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  !=1 );.      sql
1a210 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
1a220 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
1a230 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  dst, pDest->iSDP
1a240 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f  arm, 1);.      /
1a250 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
1a260 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74  se will jump out
1a270 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72   of the loop for
1a280 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
1a290 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
1a2a0 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
1a2b0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1a2c0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   */..    /* The 
1a2d0 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72  results are stor
1a2e0 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65  ed in a sequence
1a2f0 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20   of registers.  
1a300 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
1a310 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2e 20 20   pDest->iSdst.  
1a320 54 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74  Then the co-rout
1a330 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20  ine yields..    
1a340 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
1a350 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20  Coroutine: {.   
1a360 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53     if( pDest->iS
1a370 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dst==0 ){.      
1a380 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d    pDest->iSdst =
1a390 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1a3a0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
1a3b0 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
1a3c0 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d    pDest->nSdst =
1a3d0 20 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20   pIn->nSdst;.   
1a3e0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1a3f0 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
1a400 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73  Parse, pIn->iSds
1a410 74 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c  t, pDest->iSdst,
1a420 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
1a430 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a440 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
1a450 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
1a460 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  m);.      break;
1a470 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1a480 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61 62  f none of the ab
1a490 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ove, then the re
1a4a0 73 75 6c 74 20 64 65 73 74 69 6e 61 74 69 6f 6e  sult destination
1a4b0 20 6d 75 73 74 20 62 65 0a 20 20 20 20 2a 2a 20   must be.    ** 
1a4c0 53 52 54 5f 4f 75 74 70 75 74 2e 20 20 54 68 69  SRT_Output.  Thi
1a4d0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
1a4e0 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61  er called with a
1a4f0 6e 79 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20  ny other.    ** 
1a500 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65  destination othe
1a510 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 73 20  r than the ones 
1a520 68 61 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f 72  handled above or
1a530 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20   SRT_Output..   
1a540 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53   **.    ** For S
1a550 52 54 5f 4f 75 74 70 75 74 2c 20 72 65 73 75 6c  RT_Output, resul
1a560 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ts are stored in
1a570 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
1a580 65 67 69 73 74 65 72 73 2e 20 20 0a 20 20 20 20  egisters.  .    
1a590 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f 50 5f 52  ** Then the OP_R
1a5a0 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20  esultRow opcode 
1a5b0 69 73 20 75 73 65 64 20 74 6f 20 63 61 75 73 65  is used to cause
1a5c0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
1a5d0 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  to.    ** return
1a5e0 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66   the next row of
1a5f0 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a   result..    */.
1a600 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
1a610 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65       assert( pDe
1a620 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  st->eDest==SRT_O
1a630 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 73  utput );.      s
1a640 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a650 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
1a660 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
1a670 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
1a680 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1a690 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  }..  /* Jump to 
1a6a0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
1a6b0 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54  oop if the LIMIT
1a6c0 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a   is reached..  *
1a6d0 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  /.  if( p->iLimi
1a6e0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
1a6f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a700 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70  _DecrJumpZero, p
1a710 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  ->iLimit, iBreak
1a720 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1a730 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  v);.  }..  /* Ge
1a740 6e 65 72 61 74 65 20 74 68 65 20 73 75 62 72 6f  nerate the subro
1a750 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a  utine return.  *
1a760 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
1a770 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
1a780 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c  Continue);.  sql
1a790 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
1a7a0 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
1a7b0 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75  Return);..  retu
1a7c0 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn addr;.}../*.*
1a7d0 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  * Alternative co
1a7e0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f  mpound select co
1a7f0 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72  de generator for
1a800 20 63 61 73 65 73 20 77 68 65 6e 20 74 68 65 72   cases when ther
1a810 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52  e.** is an ORDER
1a820 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a   BY clause..**.*
1a830 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20 71 75  * We assume a qu
1a840 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ery of the follo
1a850 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a  wing form:.**.**
1a860 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20        <selectA> 
1a870 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65   <operator>  <se
1a880 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59  lectB>  ORDER BY
1a890 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a   <orderbylist>.*
1a8a0 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20  *.** <operator> 
1a8b0 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20  is one of UNION 
1a8c0 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45  ALL, UNION, EXCE
1a8d0 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
1a8e0 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69  .  The idea.** i
1a8f0 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c  s to code both <
1a900 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65  selectA> and <se
1a910 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68 65 20  lectB> with the 
1a920 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1a930 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65  as.** co-routine
1a940 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65  s.  Then run the
1a950 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20   co-routines in 
1a960 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72  parallel and mer
1a970 67 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  ge the results.*
1a980 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  * into the outpu
1a990 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  t.  In addition 
1a9a0 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75  to the two corou
1a9b0 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65  tines (called se
1a9c0 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c  lectA and.** sel
1a9d0 65 63 74 42 29 20 74 68 65 72 65 20 61 72 65 20  ectB) there are 
1a9e0 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a  7 subroutines:.*
1a9f0 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20  *.**    outA:   
1aa00 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74   Move the output
1aa10 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41 20   of the selectA 
1aa20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74  coroutine into t
1aa30 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20  he output.**    
1aa40 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
1aa50 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a  compound query..
1aa60 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20  **.**    outB:  
1aa70 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75    Move the outpu
1aa80 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42  t of the selectB
1aa90 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20   coroutine into 
1aaa0 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20  the output.**   
1aab0 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
1aac0 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e   compound query.
1aad0 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65    (Only generate
1aae0 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a  d for UNION and.
1aaf0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
1ab00 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50  NION ALL.  EXCEP
1ab10 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54  T and INSERTSECT
1ab20 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61 20   never output a 
1ab30 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  row that.**     
1ab40 20 20 20 20 20 20 20 20 61 70 70 65 61 72 73 20          appears 
1ab50 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a  only in B.).**.*
1ab60 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61  *    AltB:    Ca
1ab70 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
1ab80 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
1ab90 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
1aba0 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41   A<B..**.**    A
1abb0 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  eqB:    Called w
1abc0 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
1abd0 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
1abe0 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e  utines and A==B.
1abf0 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20  .**.**    AgtB: 
1ac00 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
1ac10 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
1ac20 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
1ac30 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a  s and A>B..**.**
1ac40 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c      EofA:    Cal
1ac50 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73  led when data is
1ac60 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20   exhausted from 
1ac70 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20  selectA..**.**  
1ac80 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65    EofB:    Calle
1ac90 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65  d when data is e
1aca0 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65  xhausted from se
1acb0 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lectB..**.** The
1acc0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1acd0 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20 66 69  of the latter fi
1ace0 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64  ve subroutines d
1acf0 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a  epend on which .
1ad00 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73  ** <operator> is
1ad10 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20   used:.**.**.** 
1ad20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
1ad30 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e  N ALL         UN
1ad40 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 45  ION            E
1ad50 58 43 45 50 54 20 20 20 20 20 20 20 20 20 20 49  XCEPT          I
1ad60 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20  NTERSECT.**     
1ad70 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
1ad80 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
1ad90 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
1ada0 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
1adb0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c  --------.**   Al
1adc0 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  tB:   outA, next
1add0 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
1ade0 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
1adf0 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78  extA         nex
1ae00 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a  tA.**.**   AeqB:
1ae10 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
1ae20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20         nextA    
1ae30 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20           nextA  
1ae40 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
1ae50 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a  tA.**.**   AgtB:
1ae60 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
1ae70 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
1ae80 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 20 20           nextB  
1ae90 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a            nextB.
1aea0 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20  **.**   EofA:   
1aeb0 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
1aec0 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
1aed0 20 20 20 20 20 20 68 61 6c 74 20 20 20 20 20 20        halt      
1aee0 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a         halt.**.*
1aef0 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41  *   EofB:   outA
1af00 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74  , nextA      out
1af10 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f  A, nextA       o
1af20 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
1af30 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e     halt.**.** In
1af40 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c   the AltB, AeqB,
1af50 20 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75   and AgtB subrou
1af60 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e  tines, an EOF on
1af70 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78   A following nex
1af80 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20  tA.** causes an 
1af90 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74  immediate jump t
1afa0 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f  o EofA and an EO
1afb0 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67  F on B following
1afc0 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a   nextB causes.**
1afd0 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75   an immediate ju
1afe0 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74  mp to EofB.  Wit
1aff0 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66  hin EofA and Eof
1b000 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e  B, and EOF on en
1b010 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77  try or.** follow
1b020 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65 73  ing nextX causes
1b030 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65   a jump to the e
1b040 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  nd of the select
1b050 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
1b060 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d  ** Duplicate rem
1b070 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f  oval in the UNIO
1b080 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
1b090 4e 54 45 52 53 45 43 54 20 63 61 73 65 73 20 69  NTERSECT cases i
1b0a0 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74  s handled.** wit
1b0b0 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73  hin the output s
1b0c0 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  ubroutine.  The 
1b0d0 72 65 67 50 72 65 76 20 72 65 67 69 73 74 65 72  regPrev register
1b0e0 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70   set holds the p
1b0f0 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74  reviously.** out
1b100 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f  put value.  A co
1b110 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65  mparison is made
1b120 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 76 61   against this va
1b130 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70  lue and the outp
1b140 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64  ut.** is skipped
1b150 20 69 66 20 74 68 65 20 6e 65 78 74 20 72 65 73   if the next res
1b160 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68  ults would be th
1b170 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 72  e same as the pr
1b180 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  evious..**.** Th
1b190 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
1b1a0 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c   plan is to impl
1b1b0 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f  ement the two co
1b1c0 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76  routines and sev
1b1d0 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65  en.** subroutine
1b1e0 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75  s first, then pu
1b1f0 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f  t the control lo
1b200 67 69 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f  gic at the botto
1b210 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a  m.  Like this:.*
1b220 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f  *.**          go
1b230 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63  to Init.**     c
1b240 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  oA: coroutine fo
1b250 72 20 6c 65 66 74 20 71 75 65 72 79 20 28 41 29  r left query (A)
1b260 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72  .**     coB: cor
1b270 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74  outine for right
1b280 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20   query (B).**   
1b290 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e   outA: output on
1b2a0 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20  e row of A.**   
1b2b0 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e   outB: output on
1b2c0 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f  e row of B (UNIO
1b2d0 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20  N and UNION ALL 
1b2e0 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41  only).**    EofA
1b2f0 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42  : ....**    EofB
1b300 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42  : ....**    AltB
1b310 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42  : ....**    AeqB
1b320 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42  : ....**    AgtB
1b330 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74  : ....**    Init
1b340 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72  : initialize cor
1b350 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73  outine registers
1b360 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
1b370 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20  ld coA.**       
1b380 20 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74     if eof(A) got
1b390 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20  o EofA.**       
1b3a0 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20     yield coB.** 
1b3b0 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28           if eof(
1b3c0 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20  B) goto EofB.** 
1b3d0 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65     Cmpr: Compare
1b3e0 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20   A, B.**        
1b3f0 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71    Jump AltB, Aeq
1b400 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45  B, AgtB.**     E
1b410 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65  nd: ....**.** We
1b420 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42   call AltB, AeqB
1b430 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e  , AgtB, EofA, an
1b440 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69  d EofB "subrouti
1b450 6e 65 73 22 20 62 75 74 20 74 68 65 79 20 61 72  nes" but they ar
1b460 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c  e not.** actuall
1b470 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47  y called using G
1b480 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f  osub and they do
1b490 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f   not Return.  Eo
1b4a0 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70  fA and EofB loop
1b4b0 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61  .** until all da
1b4c0 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
1b4d0 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65  then jump to the
1b4e0 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c   "end" labe.  Al
1b4f0 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64  tB, AeqB,.** and
1b500 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69   AgtB jump to ei
1b510 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e  ther L2 or to on
1b520 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66  e of EofA or Eof
1b530 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  B..*/.#ifndef SQ
1b540 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
1b550 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63  ND_SELECT.static
1b560 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
1b570 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65  OrderBy(.  Parse
1b580 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1b590 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1b5a0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
1b5b0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
1b5c0 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
1b5d0 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
1b5e0 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
1b5f0 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
1b600 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
1b610 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
1b620 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
1b630 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
1b640 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1b650 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  rs */.  Select *
1b660 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
1b670 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
1b680 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
1b690 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
1b6a0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
1b6b0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
1b6c0 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
1b6d0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
1b6e0 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44   destA;     /* D
1b6f0 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63  estination for c
1b700 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20  oroutine A */.  
1b710 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 42  SelectDest destB
1b720 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  ;     /* Destina
1b730 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69  tion for corouti
1b740 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ne B */.  int re
1b750 67 41 64 64 72 41 3b 20 20 20 20 20 20 20 20 20  gAddrA;         
1b760 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
1b770 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
1b780 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
1b790 69 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20 20  int regAddrB;   
1b7a0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1b7b0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
1b7c0 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65  lect-B coroutine
1b7d0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65   */.  int addrSe
1b7e0 6c 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41  lectA;      /* A
1b7f0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
1b800 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65  lect-A coroutine
1b810 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65   */.  int addrSe
1b820 6c 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41  lectB;      /* A
1b830 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
1b840 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65  lect-B coroutine
1b850 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
1b860 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  A;          /* A
1b870 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
1b880 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41  for the output-A
1b890 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
1b8a0 20 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20   int regOutB;   
1b8b0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
1b8c0 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74  s register for t
1b8d0 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72  he output-B subr
1b8e0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1b8f0 61 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20  addrOutA;       
1b900 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1b910 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62  the output-A sub
1b920 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1b930 20 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20   addrOutB = 0;  
1b940 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
1b950 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75   the output-B su
1b960 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
1b970 74 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20  t addrEofA;     
1b980 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
1b990 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65  f the select-A-e
1b9a0 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74  xhausted subrout
1b9b0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
1b9c0 72 45 6f 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f  rEofA_noB;     /
1b9d0 2a 20 41 6c 74 65 72 6e 61 74 65 20 61 64 64 72  * Alternate addr
1b9e0 45 6f 66 41 20 69 66 20 42 20 69 73 20 75 6e 69  EofA if B is uni
1b9f0 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
1ba00 69 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20  int addrEofB;   
1ba10 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1ba20 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
1ba30 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f  -exhausted subro
1ba40 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
1ba50 64 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20  ddrAltB;        
1ba60 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
1ba70 68 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e  he A<B subroutin
1ba80 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
1ba90 65 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  eqB;         /* 
1baa0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
1bab0 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ==B subroutine *
1bac0 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74 42  /.  int addrAgtB
1bad0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
1bae0 72 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20  ress of the A>B 
1baf0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
1bb00 69 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20  int regLimitA;  
1bb10 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72        /* Limit r
1bb20 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
1bb30 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ct-A */.  int re
1bb40 67 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20  gLimitB;        
1bb50 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
1bb60 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
1bb70 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b  /.  int regPrev;
1bb80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72            /* A r
1bb90 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
1bba0 73 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f  s to hold previo
1bbb0 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69  us output */.  i
1bbc0 6e 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20  nt savedLimit;  
1bbd0 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61       /* Saved va
1bbe0 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74  lue of p->iLimit
1bbf0 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f   */.  int savedO
1bc00 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53  ffset;      /* S
1bc10 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d  aved value of p-
1bc20 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e  >iOffset */.  in
1bc30 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20  t labelCmpr;    
1bc40 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
1bc50 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
1bc60 65 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68  e merge algorith
1bc70 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c  m */.  int label
1bc80 45 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  End;         /* 
1bc90 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e  Label for the en
1bca0 64 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c  d of the overall
1bcb0 20 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a   SELECT stmt */.
1bcc0 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20    int addr1;    
1bcd0 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
1bce0 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61  instructions tha
1bcf0 74 20 67 65 74 20 72 65 74 61 72 67 65 74 74 65  t get retargette
1bd00 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  d */.  int op;  
1bd10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bd20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54  One of TK_ALL, T
1bd30 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45  K_UNION, TK_EXCE
1bd40 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  PT, TK_INTERSECT
1bd50 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
1bd60 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43  KeyDup = 0; /* C
1bd70 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d  omparison inform
1bd80 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63  ation for duplic
1bd90 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20  ate removal */. 
1bda0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65   KeyInfo *pKeyMe
1bdb0 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72  rge;   /* Compar
1bdc0 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
1bdd0 20 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77   for merging row
1bde0 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
1bdf0 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  db;          /* 
1be00 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
1be10 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ion */.  ExprLis
1be20 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f  t *pOrderBy;   /
1be30 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
1be40 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lause */.  int n
1be50 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
1be60 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
1be70 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
1be80 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
1be90 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20  int *aPermute;  
1bea0 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67        /* Mapping
1beb0 20 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74   from ORDER BY t
1bec0 65 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73  erms to result s
1bed0 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20  et columns */.. 
1bee0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
1bef0 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73  erBy!=0 );.  ass
1bf00 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20  ert( pKeyDup==0 
1bf10 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20  ); /* "Managed" 
1bf20 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e  code needs this.
1bf30 20 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20    Ticket #3382. 
1bf40 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  */.  db = pParse
1bf50 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72  ->db;.  v = pPar
1bf60 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
1bf70 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20  ert( v!=0 );    
1bf80 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68     /* Already th
1bf90 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69  rown the error i
1bfa0 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69  f VDBE alloc fai
1bfb0 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e  led */.  labelEn
1bfc0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
1bfd0 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
1bfe0 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20  ;.  labelCmpr = 
1bff0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1c000 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a 0a  abel(pParse);...
1c010 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20 74 68    /* Patch up th
1c020 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1c030 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d  e.  */.  op = p-
1c040 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f 72 20  >op;  .  pPrior 
1c050 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61  = p->pPrior;.  a
1c060 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
1c070 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
1c080 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
1c090 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65 72 74  rderBy;.  assert
1c0a0 28 20 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  ( pOrderBy );.  
1c0b0 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  nOrderBy = pOrde
1c0c0 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f  rBy->nExpr;..  /
1c0d0 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72 73 20  * For operators 
1c0e0 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e  other than UNION
1c0f0 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74 6f 20   ALL we have to 
1c100 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a 20  make sure that. 
1c110 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59   ** the ORDER BY
1c120 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73 20 65   clause covers e
1c130 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65  very term of the
1c140 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 41 64   result set.  Ad
1c150 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20  d.  ** terms to 
1c160 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1c170 75 73 65 20 61 73 20 6e 65 63 65 73 73 61 72 79  use as necessary
1c180 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21  ..  */.  if( op!
1c190 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66  =TK_ALL ){.    f
1c1a0 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c  or(i=1; db->mall
1c1b0 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26 20 69  ocFailed==0 && i
1c1c0 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <=p->pEList->nEx
1c1d0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
1c1e0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
1c1f0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
1c200 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65     for(j=0, pIte
1c210 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a  m=pOrderBy->a; j
1c220 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20  <nOrderBy; j++, 
1c230 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
1c240 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
1c250 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
1c260 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
1c270 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
1c280 64 65 72 42 79 43 6f 6c 3d 3d 69 20 29 20 62 72  derByCol==i ) br
1c290 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1c2a0 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72     if( j==nOrder
1c2b0 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  By ){.        Ex
1c2c0 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  pr *pNew = sqlit
1c2d0 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e  e3Expr(db, TK_IN
1c2e0 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20 20 20  TEGER, 0);.     
1c2f0 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
1c300 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1c310 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
1c320 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
1c330 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20  = EP_IntValue;. 
1c340 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69         pNew->u.i
1c350 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20 20  Value = i;.     
1c360 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
1c370 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69   pOrderBy = sqli
1c380 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
1c390 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  d(pParse, pOrder
1c3a0 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  By, pNew);.     
1c3b0 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
1c3c0 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f  ) pOrderBy->a[nO
1c3d0 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69 4f  rderBy++].u.x.iO
1c3e0 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36  rderByCol = (u16
1c3f0 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )i;.      }.    
1c400 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  }.  }..  /* Comp
1c410 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ute the comparis
1c420 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 61  on permutation a
1c430 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74 20  nd keyinfo that 
1c440 69 73 20 75 73 65 64 20 77 69 74 68 0a 20 20 2a  is used with.  *
1c450 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f  * the permutatio
1c460 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  n used to determ
1c470 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74 0a  ine if the next.
1c480 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73 75    ** row of resu
1c490 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73  lts comes from s
1c4a0 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63 74  electA or select
1c4b0 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78 70  B.  Also add exp
1c4c0 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61  licit.  ** colla
1c4d0 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52 44  tions to the ORD
1c4e0 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72  ER BY clause ter
1c4f0 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e 20  ms so that when 
1c500 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 20  the subqueries. 
1c510 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68 74   ** to the right
1c520 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61 72   and the left ar
1c530 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68 65  e evaluated, the
1c540 79 20 75 73 65 20 74 68 65 20 63 6f 72 72 65 63  y use the correc
1c550 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e  t.  ** collation
1c560 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74  ..  */.  aPermut
1c570 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
1c580 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
1c590 65 6f 66 28 69 6e 74 29 2a 28 6e 4f 72 64 65 72  eof(int)*(nOrder
1c5a0 42 79 20 2b 20 31 29 29 3b 0a 20 20 69 66 28 20  By + 1));.  if( 
1c5b0 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20  aPermute ){.    
1c5c0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
1c5d0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
1c5e0 20 61 50 65 72 6d 75 74 65 5b 30 5d 20 3d 20 6e   aPermute[0] = n
1c5f0 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 66 6f 72  OrderBy;.    for
1c600 28 69 3d 31 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (i=1, pItem=pOrd
1c610 65 72 42 79 2d 3e 61 3b 20 69 3c 3d 6e 4f 72 64  erBy->a; i<=nOrd
1c620 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  erBy; i++, pItem
1c630 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
1c640 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  t( pItem->u.x.iO
1c650 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20  rderByCol>0 );. 
1c660 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
1c670 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
1c680 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  Col<=p->pEList->
1c690 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61  nExpr );.      a
1c6a0 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74  Permute[i] = pIt
1c6b0 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
1c6c0 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20  Col - 1;.    }. 
1c6d0 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 6d     pKeyMerge = m
1c6e0 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
1c6f0 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  yKeyInfo(pParse,
1c700 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b   p, 1);.  }else{
1c710 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d  .    pKeyMerge =
1c720 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
1c730 61 74 74 61 63 68 20 74 68 65 20 4f 52 44 45 52  attach the ORDER
1c740 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68   BY clause to th
1c750 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  e query..  */.  
1c760 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
1c770 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72  rderBy;.  pPrior
1c780 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  ->pOrderBy = sql
1c790 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
1c7a0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64  pParse->db, pOrd
1c7b0 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  erBy, 0);..  /* 
1c7c0 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65  Allocate a range
1c7d0 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65   of temporary re
1c7e0 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20  gisters and the 
1c7f0 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20  KeyInfo needed. 
1c800 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69   ** for the logi
1c810 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64  c that removes d
1c820 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20  uplicate result 
1c830 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20  rows when the.  
1c840 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55  ** operator is U
1c850 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72  NION, EXCEPT, or
1c860 20 49 4e 54 45 52 53 45 43 54 20 28 62 75 74 20   INTERSECT (but 
1c870 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a  not UNION ALL)..
1c880 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
1c890 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67  K_ALL ){.    reg
1c8a0 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Prev = 0;.  }els
1c8b0 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72  e{.    int nExpr
1c8c0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45   = p->pEList->nE
1c8d0 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
1c8e0 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72   nOrderBy>=nExpr
1c8f0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
1c900 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 67 50  iled );.    regP
1c910 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  rev = pParse->nM
1c920 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
1c930 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b  ->nMem += nExpr+
1c940 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  1;.    sqlite3Vd
1c950 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1c960 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72  nteger, 0, regPr
1c970 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70  ev);.    pKeyDup
1c980 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
1c990 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72  oAlloc(db, nExpr
1c9a0 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  , 1);.    if( pK
1c9b0 65 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20 61  eyDup ){.      a
1c9c0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
1c9d0 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
1c9e0 28 70 4b 65 79 44 75 70 29 20 29 3b 0a 20 20 20  (pKeyDup) );.   
1c9f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
1ca00 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1ca10 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c     pKeyDup->aCol
1ca20 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65  l[i] = multiSele
1ca30 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
1ca40 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  , p, i);.       
1ca50 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f   pKeyDup->aSortO
1ca60 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  rder[i] = 0;.   
1ca70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1ca80 0a 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20 74  .  /* Separate t
1ca90 68 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65 20  he left and the 
1caa0 72 69 67 68 74 20 71 75 65 72 79 20 66 72 6f 6d  right query from
1cab0 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a   one another.  *
1cac0 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  /.  p->pPrior = 
1cad0 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65  0;.  pPrior->pNe
1cae0 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  xt = 0;.  sqlite
1caf0 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f  3ResolveOrderGro
1cb00 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20  upBy(pParse, p, 
1cb10 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  p->pOrderBy, "OR
1cb20 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50 72  DER");.  if( pPr
1cb30 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ior->pPrior==0 )
1cb40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
1cb50 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79  olveOrderGroupBy
1cb60 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
1cb70 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
1cb80 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d  y, "ORDER");.  }
1cb90 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74  ..  /* Compute t
1cba0 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65  he limit registe
1cbb0 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c  rs */.  computeL
1cbc0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
1cbd0 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e  arse, p, labelEn
1cbe0 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69  d);.  if( p->iLi
1cbf0 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c  mit && op==TK_AL
1cc00 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69  L ){.    regLimi
1cc10 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tA = ++pParse->n
1cc20 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69  Mem;.    regLimi
1cc30 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tB = ++pParse->n
1cc40 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
1cc50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1cc60 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65  _Copy, p->iOffse
1cc70 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31  t ? p->iOffset+1
1cc80 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20   : p->iLimit,.  
1cc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccb0 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20  regLimitA);.    
1ccc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ccd0 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65  2(v, OP_Copy, re
1cce0 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69  gLimitA, regLimi
1ccf0 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tB);.  }else{.  
1cd00 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72 65    regLimitA = re
1cd10 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d  gLimitB = 0;.  }
1cd20 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
1cd30 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
1cd40 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74  it);.  p->pLimit
1cd50 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64 72   = 0;..  regAddr
1cd60 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
1cd70 65 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20 3d  em;.  regAddrB =
1cd80 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1cd90 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70  .  regOutA = ++p
1cda0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
1cdb0 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73  egOutB = ++pPars
1cdc0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  e->nMem;.  sqlit
1cdd0 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
1cde0 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72  (&destA, SRT_Cor
1cdf0 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41  outine, regAddrA
1ce00 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
1ce10 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
1ce20 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  B, SRT_Coroutine
1ce30 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20  , regAddrB);..  
1ce40 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
1ce50 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 4d 45  ((pParse, 1, "ME
1ce60 52 47 45 20 28 25 73 29 22 2c 20 73 65 6c 65 63  RGE (%s)", selec
1ce70 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 29  tOpName(p->op)))
1ce80 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1ce90 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20   a coroutine to 
1cea0 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c  evaluate the SEL
1ceb0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ECT statement to
1cec0 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f   the.  ** left o
1ced0 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f  f the compound o
1cee0 70 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41  perator - the "A
1cef0 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20  " select..  */. 
1cf00 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73   addrSelectA = s
1cf10 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
1cf20 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20  tAddr(v) + 1;.  
1cf30 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
1cf40 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1cf50 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72  InitCoroutine, r
1cf60 65 67 41 64 64 72 41 2c 20 30 2c 20 61 64 64 72  egAddrA, 0, addr
1cf70 53 65 6c 65 63 74 41 29 3b 0a 20 20 56 64 62 65  SelectA);.  Vdbe
1cf80 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65 66  Comment((v, "lef
1cf90 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70  t SELECT"));.  p
1cfa0 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20  Prior->iLimit = 
1cfb0 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 45 78 70  regLimitA;.  Exp
1cfc0 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
1cfd0 50 61 72 73 65 2c 20 31 2c 20 22 4c 45 46 54 22  Parse, 1, "LEFT"
1cfe0 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  ));.  sqlite3Sel
1cff0 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
1d000 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a 20 20 73  or, &destA);.  s
1d010 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72  qlite3VdbeEndCor
1d020 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 41 64 64  outine(v, regAdd
1d030 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rA);.  sqlite3Vd
1d040 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
1d050 64 72 31 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  dr1);..  /* Gene
1d060 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65  rate a coroutine
1d070 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
1d080 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1d090 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72  t on .  ** the r
1d0a0 69 67 68 74 20 2d 20 74 68 65 20 22 42 22 20 73  ight - the "B" s
1d0b0 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64  elect.  */.  add
1d0c0 72 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74  rSelectB = sqlit
1d0d0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
1d0e0 72 28 76 29 20 2b 20 31 3b 0a 20 20 61 64 64 72  r(v) + 1;.  addr
1d0f0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
1d100 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp3(v, OP_Init
1d110 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
1d120 64 72 42 2c 20 30 2c 20 61 64 64 72 53 65 6c 65  drB, 0, addrSele
1d130 63 74 42 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  ctB);.  VdbeComm
1d140 65 6e 74 28 28 76 2c 20 22 72 69 67 68 74 20 53  ent((v, "right S
1d150 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76 65  ELECT"));.  save
1d160 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d  dLimit = p->iLim
1d170 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73 65  it;.  savedOffse
1d180 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a  t = p->iOffset;.
1d190 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65    p->iLimit = re
1d1a0 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f  gLimitB;.  p->iO
1d1b0 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20 45  ffset = 0;  .  E
1d1c0 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
1d1d0 28 70 50 61 72 73 65 2c 20 31 2c 20 22 52 49 47  (pParse, 1, "RIG
1d1e0 48 54 22 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  HT"));.  sqlite3
1d1f0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
1d200 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e  , &destB);.  p->
1d210 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c 69  iLimit = savedLi
1d220 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65  mit;.  p->iOffse
1d230 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74 3b  t = savedOffset;
1d240 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e  .  sqlite3VdbeEn
1d250 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65  dCoroutine(v, re
1d260 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47  gAddrB);..  /* G
1d270 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
1d280 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
1d290 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  s the current ro
1d2a0 77 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20  w of the A.  ** 
1d2b0 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65  select as the ne
1d2c0 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66  xt output row of
1d2d0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
1d2e0 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62  lect..  */.  Vdb
1d2f0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1d300 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65   "Output routine
1d310 20 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64   for A"));.  add
1d320 72 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65  rOutA = generate
1d330 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65  OutputSubroutine
1d340 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
1d350 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65            p, &de
1d360 73 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f  stA, pDest, regO
1d370 75 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20  utA,.           
1d380 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70        regPrev, p
1d390 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64  KeyDup, labelEnd
1d3a0 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72  );.  .  /* Gener
1d3b0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
1d3c0 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68   that outputs th
1d3d0 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66  e current row of
1d3e0 20 74 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65   the B.  ** sele
1d3f0 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f  ct as the next o
1d400 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65  utput row of the
1d410 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1d420 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
1d430 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54  =TK_ALL || op==T
1d440 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56  K_UNION ){.    V
1d450 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1d460 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69  v, "Output routi
1d470 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a 20 20 20  ne for B"));.   
1d480 20 61 64 64 72 4f 75 74 42 20 3d 20 67 65 6e 65   addrOutB = gene
1d490 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75  rateOutputSubrou
1d4a0 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20  tine(pParse,.   
1d4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c                p,
1d4c0 20 26 64 65 73 74 42 2c 20 70 44 65 73 74 2c 20   &destB, pDest, 
1d4d0 72 65 67 4f 75 74 42 2c 0a 20 20 20 20 20 20 20  regOutB,.       
1d4e0 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65            regPre
1d4f0 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65  v, pKeyDup, labe
1d500 6c 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  lEnd);.  }.  sql
1d510 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
1d520 28 70 4b 65 79 44 75 70 29 3b 0a 0a 20 20 2f 2a  (pKeyDup);..  /*
1d530 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
1d540 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68  outine to run wh
1d550 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66  en the results f
1d560 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a  rom select A.  *
1d570 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20  * are exhausted 
1d580 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e  and only data in
1d590 20 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e   select B remain
1d5a0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  s..  */.  if( op
1d5b0 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f  ==TK_EXCEPT || o
1d5c0 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
1d5d0 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f  ){.    addrEofA_
1d5e0 6e 6f 42 20 3d 20 61 64 64 72 45 6f 66 41 20 3d  noB = addrEofA =
1d5f0 20 6c 61 62 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c   labelEnd;.  }el
1d600 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f  se{  .    VdbeNo
1d610 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  opComment((v, "e
1d620 6f 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22  of-A subroutine"
1d630 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41  ));.    addrEofA
1d640 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1d650 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1d660 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f  , regOutB, addrO
1d670 75 74 42 29 3b 0a 20 20 20 20 61 64 64 72 45 6f  utB);.    addrEo
1d680 66 41 5f 6e 6f 42 20 3d 20 73 71 6c 69 74 65 33  fA_noB = sqlite3
1d690 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d6a0 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42  _Yield, regAddrB
1d6b0 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20  , labelEnd);.   
1d6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6e0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1d6f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1d700 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f  beGoto(v, addrEo
1d710 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c  fA);.    p->nSel
1d720 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
1d730 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65  LogEstAdd(p->nSe
1d740 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d  lectRow, pPrior-
1d750 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20  >nSelectRow);.  
1d760 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
1d770 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f   a subroutine to
1d780 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65   run when the re
1d790 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63  sults from selec
1d7a0 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65 78 68  t B.  ** are exh
1d7b0 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20  austed and only 
1d7c0 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 41  data in select A
1d7d0 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20   remains..  */. 
1d7e0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45   if( op==TK_INTE
1d7f0 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64  RSECT ){.    add
1d800 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f 66 41  rEofB = addrEofA
1d810 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65  ;.    if( p->nSe
1d820 6c 65 63 74 52 6f 77 20 3e 20 70 50 72 69 6f 72  lectRow > pPrior
1d830 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70  ->nSelectRow ) p
1d840 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70  ->nSelectRow = p
1d850 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
1d860 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20  w;.  }else{  .  
1d870 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1d880 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73 75 62  t((v, "eof-B sub
1d890 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20  routine"));.    
1d8a0 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c 69 74  addrEofB = sqlit
1d8b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d8c0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
1d8d0 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20  A, addrOutA);.  
1d8e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d8f0 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1d900 20 72 65 67 41 64 64 72 41 2c 20 6c 61 62 65 6c   regAddrA, label
1d910 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61  End); VdbeCovera
1d920 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
1d930 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64  e3VdbeGoto(v, ad
1d940 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20  drEofB);.  }..  
1d950 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1d960 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
1d970 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a  ase of A<B.  */.
1d980 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1d990 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75  t((v, "A-lt-B su
1d9a0 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61  broutine"));.  a
1d9b0 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74 65  ddrAltB = sqlite
1d9c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d9d0 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41  P_Gosub, regOutA
1d9e0 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 73  , addrOutA);.  s
1d9f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1da00 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1da10 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41  gAddrA, addrEofA
1da20 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1da30 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
1da40 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d  eGoto(v, labelCm
1da50 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  pr);..  /* Gener
1da60 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
1da70 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41  le the case of A
1da80 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ==B.  */.  if( o
1da90 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p==TK_ALL ){.   
1daa0 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72   addrAeqB = addr
1dab0 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66  AltB;.  }else if
1dac0 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  ( op==TK_INTERSE
1dad0 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65  CT ){.    addrAe
1dae0 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20  qB = addrAltB;. 
1daf0 20 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20     addrAltB++;. 
1db00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65   }else{.    Vdbe
1db10 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1db20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69  "A-eq-B subrouti
1db30 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41  ne"));.    addrA
1db40 65 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65  eqB =.    sqlite
1db50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1db60 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1db70 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64  A, addrEofA); Vd
1db80 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1db90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
1dba0 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29  to(v, labelCmpr)
1dbb0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
1dbc0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e  rate code to han
1dbd0 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20  dle the case of 
1dbe0 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  A>B.  */.  VdbeN
1dbf0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1dc00 41 2d 67 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-gt-B subroutin
1dc10 65 22 29 29 3b 0a 20 20 61 64 64 72 41 67 74 42  e"));.  addrAgtB
1dc20 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
1dc30 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
1dc40 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  if( op==TK_ALL |
1dc50 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  | op==TK_UNION )
1dc60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1dc70 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1dc80 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64  sub, regOutB, ad
1dc90 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73  drOutB);.  }.  s
1dca0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1dcb0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1dcc0 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42  gAddrB, addrEofB
1dcd0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1dce0 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
1dcf0 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d  eGoto(v, labelCm
1dd00 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  pr);..  /* This 
1dd10 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20 74  code runs once t
1dd20 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76 65  o initialize eve
1dd30 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  rything..  */.  
1dd40 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
1dd50 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
1dd60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1dd70 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1dd80 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f  regAddrA, addrEo
1dd90 66 41 5f 6e 6f 42 29 3b 20 56 64 62 65 43 6f 76  fA_noB); VdbeCov
1dda0 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
1ddb0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ddc0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1ddd0 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20  drB, addrEofB); 
1dde0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1ddf0 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74  ..  /* Implement
1de00 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65 20   the main merge 
1de10 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  loop.  */.  sqli
1de20 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1de30 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72  bel(v, labelCmpr
1de40 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1de50 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72  AddOp4(v, OP_Per
1de60 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20  mutation, 0, 0, 
1de70 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d 75  0, (char*)aPermu
1de80 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29  te, P4_INTARRAY)
1de90 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1dea0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
1deb0 61 72 65 2c 20 64 65 73 74 41 2e 69 53 64 73 74  are, destA.iSdst
1dec0 2c 20 64 65 73 74 42 2e 69 53 64 73 74 2c 20 6e  , destB.iSdst, n
1ded0 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20  OrderBy,.       
1dee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1def0 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65 72    (char*)pKeyMer
1df00 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  ge, P4_KEYINFO);
1df10 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
1df20 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
1df30 5f 50 45 52 4d 55 54 45 29 3b 0a 20 20 73 71 6c  _PERMUTE);.  sql
1df40 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1df50 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41  , OP_Jump, addrA
1df60 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20 61  ltB, addrAeqB, a
1df70 64 64 72 41 67 74 42 29 3b 20 56 64 62 65 43 6f  ddrAgtB); VdbeCo
1df80 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a  verage(v);..  /*
1df90 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74 68 69   Jump to the thi
1dfa0 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72  s point in order
1dfb0 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
1dfc0 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  e query..  */.  
1dfd0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1dfe0 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c  veLabel(v, label
1dff0 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 73  End);..  /* Reas
1e000 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f  sembly the compo
1e010 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68 61  und query so tha
1e020 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65  t it will be fre
1e030 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a  ed correctly.  *
1e040 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  * by the calling
1e050 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69   function */.  i
1e060 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
1e070 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
1e080 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
1e090 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d  Prior);.  }.  p-
1e0a0 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
1e0b0 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78  ;.  pPrior->pNex
1e0c0 74 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54  t = p;..  /*** T
1e0d0 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72  BD:  Insert subr
1e0e0 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20  outine calls to 
1e0f0 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e  close cursors on
1e100 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a   incomplete.  **
1e110 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a  ** subqueries **
1e120 2a 2a 2f 0a 20 20 45 78 70 6c 61 69 6e 51 75 65  **/.  ExplainQue
1e130 72 79 50 6c 61 6e 50 6f 70 28 70 50 61 72 73 65  ryPlanPop(pParse
1e140 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72  );.  return pPar
1e150 73 65 2d 3e 6e 45 72 72 21 3d 30 3b 0a 7d 0a 23  se->nErr!=0;.}.#
1e160 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
1e170 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1e180 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
1e190 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1e1a0 54 5f 56 49 45 57 29 0a 0a 2f 2a 20 41 6e 20 69  T_VIEW)../* An i
1e1b0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 53  nstance of the S
1e1c0 75 62 73 74 43 6f 6e 74 65 78 74 20 6f 62 6a 65  ubstContext obje
1e1d0 63 74 20 64 65 73 63 72 69 62 65 73 20 61 6e 20  ct describes an 
1e1e0 73 75 62 73 74 69 74 75 74 69 6f 6e 20 65 64 69  substitution edi
1e1f0 74 0a 2a 2a 20 74 6f 20 62 65 20 70 65 72 66 6f  t.** to be perfo
1e200 72 6d 65 64 20 6f 6e 20 61 20 70 61 72 73 65 20  rmed on a parse 
1e210 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  tree..**.** All 
1e220 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
1e230 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 69  lumns in table i
1e240 54 61 62 6c 65 20 61 72 65 20 74 6f 20 62 65 20  Table are to be 
1e250 72 65 70 6c 61 63 65 64 20 62 79 20 63 6f 72 72  replaced by corr
1e260 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 65 78 70  esponding.** exp
1e270 72 65 73 73 69 6f 6e 73 20 69 6e 20 70 45 4c 69  ressions in pELi
1e280 73 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  st..*/.typedef s
1e290 74 72 75 63 74 20 53 75 62 73 74 43 6f 6e 74 65  truct SubstConte
1e2a0 78 74 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  xt {.  Parse *pP
1e2b0 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
1e2c0 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
1e2d0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
1e2e0 20 69 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20   iTable;        
1e2f0 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61 63         /* Replac
1e300 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
1e310 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
1e320 69 6e 74 20 69 4e 65 77 54 61 62 6c 65 3b 20 20  int iNewTable;  
1e330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
1e340 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f   table number */
1e350 0a 20 20 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69  .  int isLeftJoi
1e360 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n;           /* 
1e370 41 64 64 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52  Add TK_IF_NULL_R
1e380 4f 57 20 6f 70 63 6f 64 65 73 20 6f 6e 20 65 61  OW opcodes on ea
1e390 63 68 20 72 65 70 6c 61 63 65 6d 65 6e 74 20 2a  ch replacement *
1e3a0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
1e3b0 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  List;         /*
1e3c0 20 52 65 70 6c 61 63 65 6d 65 6e 74 20 65 78 70   Replacement exp
1e3d0 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 7d 20 53 75  ressions */.} Su
1e3e0 62 73 74 43 6f 6e 74 65 78 74 3b 0a 0a 2f 2a 20  bstContext;../* 
1e3f0 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61 74  Forward Declarat
1e400 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76  ions */.static v
1e410 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73  oid substExprLis
1e420 74 28 53 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c  t(SubstContext*,
1e430 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61   ExprList*);.sta
1e440 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
1e450 6c 65 63 74 28 53 75 62 73 74 43 6f 6e 74 65 78  lect(SubstContex
1e460 74 2a 2c 20 53 65 6c 65 63 74 2a 2c 20 69 6e 74  t*, Select*, int
1e470 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74  );../*.** Scan t
1e480 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72 65  hrough the expre
1e490 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65  ssion pExpr.  Re
1e4a0 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66 65  place every refe
1e4b0 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f  rence to.** a co
1e4c0 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75  lumn in table nu
1e4d0 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74 68  mber iTable with
1e4e0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69   a copy of the i
1e4f0 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74  Column-th.** ent
1e500 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28  ry in pEList.  (
1e510 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72 65  But leave refere
1e520 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49  nces to the ROWI
1e530 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63  D column .** unc
1e540 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54  hanged.).**.** T
1e550 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70  his routine is p
1e560 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74  art of the flatt
1e570 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e  ening procedure.
1e580 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20    A subquery.** 
1e590 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74  whose result set
1e5a0 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
1e5b0 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61 73  EList appears as
1e5c0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a   entry in the.**
1e5d0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1e5e0 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74 68  a SELECT such th
1e5f0 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72 73  at the VDBE curs
1e600 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  or assigned to t
1e610 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75  hat.** FORM clau
1e620 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61 62  se entry is iTab
1e630 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  le.  This routin
1e640 65 20 6d 61 6b 65 73 20 74 68 65 20 6e 65 63 65  e makes the nece
1e650 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65  ssary .** change
1e660 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68  s to pExpr so th
1e670 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72  at it refers dir
1e680 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75  ectly to the sou
1e690 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20  rce table.** of 
1e6a0 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74  the subquery rat
1e6b0 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  her the result s
1e6c0 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  et of the subque
1e6d0 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78  ry..*/.static Ex
1e6e0 70 72 20 2a 73 75 62 73 74 45 78 70 72 28 0a 20  pr *substExpr(. 
1e6f0 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70   SubstContext *p
1e700 53 75 62 73 74 2c 20 20 2f 2a 20 44 65 73 63 72  Subst,  /* Descr
1e710 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  iption of the su
1e720 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20  bstitution */.  
1e730 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
1e740 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 69         /* Expr i
1e750 6e 20 77 68 69 63 68 20 73 75 62 73 74 69 74 75  n which substitu
1e760 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 29  tion occurs */.)
1e770 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  {.  if( pExpr==0
1e780 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
1e790 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
1e7a0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
1e7b0 6d 4a 6f 69 6e 29 0a 20 20 20 26 26 20 70 45 78  mJoin).   && pEx
1e7c0 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  pr->iRightJoinTa
1e7d0 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61  ble==pSubst->iTa
1e7e0 62 6c 65 0a 20 20 29 7b 0a 20 20 20 20 70 45 78  ble.  ){.    pEx
1e7f0 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  pr->iRightJoinTa
1e800 62 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e  ble = pSubst->iN
1e810 65 77 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69  ewTable;.  }.  i
1e820 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
1e830 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72  _COLUMN && pExpr
1e840 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 75 62 73 74  ->iTable==pSubst
1e850 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ->iTable ){.    
1e860 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
1e870 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45  mn<0 ){.      pE
1e880 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c  xpr->op = TK_NUL
1e890 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  L;.    }else{.  
1e8a0 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a      Expr *pNew;.
1e8b0 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f 70        Expr *pCop
1e8c0 79 20 3d 20 70 53 75 62 73 74 2d 3e 70 45 4c 69  y = pSubst->pELi
1e8d0 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f  st->a[pExpr->iCo
1e8e0 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20  lumn].pExpr;.   
1e8f0 20 20 20 45 78 70 72 20 69 66 4e 75 6c 6c 52 6f     Expr ifNullRo
1e900 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  w;.      assert(
1e910 20 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 21   pSubst->pEList!
1e920 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  =0 && pExpr->iCo
1e930 6c 75 6d 6e 3c 70 53 75 62 73 74 2d 3e 70 45 4c  lumn<pSubst->pEL
1e940 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
1e950 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1e960 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
1e970 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1e980 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 43  3ExprIsVector(pC
1e990 6f 70 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  opy) ){.        
1e9a0 73 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72  sqlite3VectorErr
1e9b0 6f 72 4d 73 67 28 70 53 75 62 73 74 2d 3e 70 50  orMsg(pSubst->pP
1e9c0 61 72 73 65 2c 20 70 43 6f 70 79 29 3b 0a 20 20  arse, pCopy);.  
1e9d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e9e0 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
1e9f0 20 70 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2d   pSubst->pParse-
1ea00 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28  >db;.        if(
1ea10 20 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74 4a   pSubst->isLeftJ
1ea20 6f 69 6e 20 26 26 20 70 43 6f 70 79 2d 3e 6f 70  oin && pCopy->op
1ea30 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  !=TK_COLUMN ){. 
1ea40 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
1ea50 26 69 66 4e 75 6c 6c 52 6f 77 2c 20 30 2c 20 73  &ifNullRow, 0, s
1ea60 69 7a 65 6f 66 28 69 66 4e 75 6c 6c 52 6f 77 29  izeof(ifNullRow)
1ea70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 4e  );.          ifN
1ea80 75 6c 6c 52 6f 77 2e 6f 70 20 3d 20 54 4b 5f 49  ullRow.op = TK_I
1ea90 46 5f 4e 55 4c 4c 5f 52 4f 57 3b 0a 20 20 20 20  F_NULL_ROW;.    
1eaa0 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e        ifNullRow.
1eab0 70 4c 65 66 74 20 3d 20 70 43 6f 70 79 3b 0a 20  pLeft = pCopy;. 
1eac0 20 20 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52           ifNullR
1ead0 6f 77 2e 69 54 61 62 6c 65 20 3d 20 70 53 75 62  ow.iTable = pSub
1eae0 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20  st->iNewTable;. 
1eaf0 20 20 20 20 20 20 20 20 20 70 43 6f 70 79 20 3d           pCopy =
1eb00 20 26 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20   &ifNullRow;.   
1eb10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74       }.        t
1eb20 65 73 74 63 61 73 65 28 20 45 78 70 72 48 61 73  estcase( ExprHas
1eb30 50 72 6f 70 65 72 74 79 28 70 43 6f 70 79 2c 20  Property(pCopy, 
1eb40 45 50 5f 53 75 62 71 75 65 72 79 29 20 29 3b 0a  EP_Subquery) );.
1eb50 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
1eb60 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
1eb70 2c 20 70 43 6f 70 79 2c 20 30 29 3b 0a 20 20 20  , pCopy, 0);.   
1eb80 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26       if( pNew &&
1eb90 20 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74 4a   pSubst->isLeftJ
1eba0 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oin ){.         
1ebb0 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
1ebc0 28 70 4e 65 77 2c 20 45 50 5f 43 61 6e 42 65 4e  (pNew, EP_CanBeN
1ebd0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ull);.        }.
1ebe0 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
1ebf0 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65   && ExprHasPrope
1ec00 72 74 79 28 70 45 78 70 72 2c 45 50 5f 46 72 6f  rty(pExpr,EP_Fro
1ec10 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  mJoin) ){.      
1ec20 20 20 20 20 70 4e 65 77 2d 3e 69 52 69 67 68 74      pNew->iRight
1ec30 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 45 78 70  JoinTable = pExp
1ec40 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  r->iRightJoinTab
1ec50 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78  le;.          Ex
1ec60 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 4e  prSetProperty(pN
1ec70 65 77 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  ew, EP_FromJoin)
1ec80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1ec90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1eca0 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
1ecb0 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 20  ;.        pExpr 
1ecc0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a  = pNew;.      }.
1ecd0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1ece0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
1ecf0 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57  ==TK_IF_NULL_ROW
1ed00 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
1ed10 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c  e==pSubst->iTabl
1ed20 65 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  e ){.      pExpr
1ed30 2d 3e 69 54 61 62 6c 65 20 3d 20 70 53 75 62 73  ->iTable = pSubs
1ed40 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20  t->iNewTable;.  
1ed50 20 20 7d 0a 20 20 20 20 70 45 78 70 72 2d 3e 70    }.    pExpr->p
1ed60 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78 70 72  Left = substExpr
1ed70 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e  (pSubst, pExpr->
1ed80 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 45 78 70  pLeft);.    pExp
1ed90 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73  r->pRight = subs
1eda0 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 45  tExpr(pSubst, pE
1edb0 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
1edc0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1edd0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1ede0 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
1edf0 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28      substSelect(
1ee00 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 78  pSubst, pExpr->x
1ee10 2e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20 20  .pSelect, 1);.  
1ee20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1ee30 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75  ubstExprList(pSu
1ee40 62 73 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  bst, pExpr->x.pL
1ee50 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ist);.    }.  }.
1ee60 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a    return pExpr;.
1ee70 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
1ee80 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20 53  bstExprList(.  S
1ee90 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75  ubstContext *pSu
1eea0 62 73 74 2c 20 2f 2a 20 44 65 73 63 72 69 70 74  bst, /* Descript
1eeb0 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74  ion of the subst
1eec0 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  itution */.  Exp
1eed0 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20 20  rList *pList    
1eee0 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63     /* List to sc
1eef0 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20  an and in which 
1ef00 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
1ef10 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tes */.){.  int 
1ef20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
1ef30 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
1ef40 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
1ef50 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1ef60 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
1ef70 70 72 20 3d 20 73 75 62 73 74 45 78 70 72 28 70  pr = substExpr(p
1ef80 53 75 62 73 74 2c 20 70 4c 69 73 74 2d 3e 61 5b  Subst, pList->a[
1ef90 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 7d  i].pExpr);.  }.}
1efa0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
1efb0 73 74 53 65 6c 65 63 74 28 0a 20 20 53 75 62 73  stSelect(.  Subs
1efc0 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74  tContext *pSubst
1efd0 2c 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e  , /* Description
1efe0 20 6f 66 20 74 68 65 20 73 75 62 73 74 69 74 75   of the substitu
1eff0 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tion */.  Select
1f000 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1f010 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
1f020 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ent in which to 
1f030 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f  make substitutio
1f040 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 50 72  ns */.  int doPr
1f050 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ior           /*
1f060 20 44 6f 20 73 75 62 73 74 69 74 75 74 65 73 20   Do substitutes 
1f070 6f 6e 20 70 2d 3e 70 50 72 69 6f 72 20 74 6f 6f  on p->pPrior too
1f080 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74   */.){.  SrcList
1f090 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74   *pSrc;.  struct
1f0a0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1f0b0 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
1f0c0 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
1f0d0 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 75 62 73  ;.  do{.    subs
1f0e0 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74  tExprList(pSubst
1f0f0 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
1f100 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1f110 70 53 75 62 73 74 2c 20 70 2d 3e 70 47 72 6f 75  pSubst, p->pGrou
1f120 70 42 79 29 3b 0a 20 20 20 20 73 75 62 73 74 45  pBy);.    substE
1f130 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20  xprList(pSubst, 
1f140 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
1f150 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73    p->pHaving = s
1f160 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c  ubstExpr(pSubst,
1f170 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
1f180 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75    p->pWhere = su
1f190 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20  bstExpr(pSubst, 
1f1a0 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
1f1b0 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
1f1c0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
1f1d0 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  !=0 );.    for(i
1f1e0 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74  =pSrc->nSrc, pIt
1f1f0 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b  em=pSrc->a; i>0;
1f200 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
1f210 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63        substSelec
1f220 74 28 70 53 75 62 73 74 2c 20 70 49 74 65 6d 2d  t(pSubst, pItem-
1f230 3e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20 20  >pSelect, 1);.  
1f240 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66      if( pItem->f
1f250 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20  g.isTabFunc ){. 
1f260 20 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72         substExpr
1f270 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 49 74  List(pSubst, pIt
1f280 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 29  em->u1.pFuncArg)
1f290 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f2a0 20 20 7d 77 68 69 6c 65 28 20 64 6f 50 72 69 6f    }while( doPrio
1f2b0 72 20 26 26 20 28 70 20 3d 20 70 2d 3e 70 50 72  r && (p = p->pPr
1f2c0 69 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a 23 65 6e  ior)!=0 );.}.#en
1f2d0 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
1f2e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1f2f0 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
1f300 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
1f310 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  EW) */..#if !def
1f320 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1f330 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1f340 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1f350 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54  IT_VIEW)./*.** T
1f360 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
1f370 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20  mpts to flatten 
1f380 73 75 62 71 75 65 72 69 65 73 20 61 73 20 61 20  subqueries as a 
1f390 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69  performance opti
1f3a0 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  mization..** Thi
1f3b0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1f3c0 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20  s 1 if it makes 
1f3d0 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66  changes and 0 if
1f3e0 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f   no flattening o
1f3f0 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ccurs..**.** To 
1f400 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63  understand the c
1f410 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65  oncept of flatte
1f420 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74  ning, consider t
1f430 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1f440 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
1f450 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28   SELECT a FROM (
1f460 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
1f470 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
1f480 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a  100) WHERE a>5.*
1f490 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
1f4a0 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e   way of implemen
1f4b0 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20  ting this query 
1f4c0 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  is to execute th
1f4d0 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69  e.** subquery fi
1f4e0 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68  rst and store th
1f4f0 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74  e results in a t
1f500 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
1f510 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20  then.** run the 
1f520 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74  outer query on t
1f530 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61  hat temporary ta
1f540 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69  ble.  This requi
1f550 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65  res two.** passe
1f560 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e  s over the data.
1f570 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62    Furthermore, b
1f580 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f  ecause the tempo
1f590 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61  rary table.** ha
1f5a0 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68  s no indices, th
1f5b0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
1f5c0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1f5d0 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f  y cannot be.** o
1f5e0 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20  ptimized..**.** 
1f5f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
1f600 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65  empts to rewrite
1f610 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73   queries such as
1f620 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a   the above into.
1f630 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74  ** a single flat
1f640 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68   select, like th
1f650 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  is:.**.**     SE
1f660 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
1f670 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
1f680 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  0 AND a>5.**.** 
1f690 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
1f6a0 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70  ed for this simp
1f6b0 6c 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73  lification gives
1f6c0 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
1f6d0 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73  .** but only has
1f6e0 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74   to scan the dat
1f6f0 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63  a once.  And bec
1f700 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67  ause indices mig
1f710 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20  ht .** exist on 
1f720 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20  the table t1, a 
1f730 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66  complete scan of
1f740 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   the data might 
1f750 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a  be.** avoided..*
1f760 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20  *.** Flattening 
1f770 69 73 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68  is subject to th
1f780 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73  e following cons
1f790 74 72 61 69 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20  traints:.**.**  
1f7a0 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67  (**)  We no long
1f7b0 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c  er attempt to fl
1f7c0 61 74 74 65 6e 20 61 67 67 72 65 67 61 74 65 20  atten aggregate 
1f7d0 73 75 62 71 75 65 72 69 65 73 2e 20 57 61 73 3a  subqueries. Was:
1f7e0 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 73  .**        The s
1f7f0 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
1f800 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e  outer query cann
1f810 6f 74 20 62 6f 74 68 20 62 65 20 61 67 67 72 65  ot both be aggre
1f820 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  gates..**.**  (*
1f830 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72  *)  We no longer
1f840 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74   attempt to flat
1f850 74 65 6e 20 61 67 67 72 65 67 61 74 65 20 73 75  ten aggregate su
1f860 62 71 75 65 72 69 65 73 2e 20 57 61 73 3a 0a 2a  bqueries. Was:.*
1f870 2a 20 20 20 20 20 20 20 20 28 32 29 20 49 66 20  *        (2) If 
1f880 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
1f890 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68 65  an aggregate the
1f8a0 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 32 61 29  n.**        (2a)
1f8b0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1f8c0 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 20 6a   must not be a j
1f8d0 6f 69 6e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  oin and.**      
1f8e0 20 20 28 32 62 29 20 74 68 65 20 6f 75 74 65 72    (2b) the outer
1f8f0 20 71 75 65 72 79 20 6d 75 73 74 20 6e 6f 74 20   query must not 
1f900 75 73 65 20 73 75 62 71 75 65 72 69 65 73 0a 2a  use subqueries.*
1f910 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 74  *             ot
1f920 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65  her than the one
1f930 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
1f940 71 75 65 72 79 20 74 68 61 74 20 69 73 20 61 20  query that is a 
1f950 63 61 6e 64 69 64 61 74 65 0a 2a 2a 20 20 20 20  candidate.**    
1f960 20 20 20 20 20 20 20 20 20 66 6f 72 20 66 6c 61           for fla
1f970 74 74 65 6e 69 6e 67 2e 20 20 28 54 68 69 73 20  ttening.  (This 
1f980 69 73 20 64 75 65 20 74 6f 20 74 69 63 6b 65 74  is due to ticket
1f990 20 5b 32 66 37 31 37 30 64 37 33 62 66 39 61 62   [2f7170d73bf9ab
1f9a0 66 38 30 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20  f80].**         
1f9b0 20 20 20 20 66 72 6f 6d 20 32 30 31 35 2d 30 32      from 2015-02
1f9c0 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 33  -09.).**.**   (3
1f9d0 29 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  )  If the subque
1f9e0 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
1f9f0 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46  operand of a LEF
1fa00 54 20 4a 4f 49 4e 20 74 68 65 6e 0a 2a 2a 20 20  T JOIN then.**  
1fa10 20 20 20 20 20 20 28 33 61 29 20 74 68 65 20 73        (3a) the s
1fa20 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  ubquery may not 
1fa30 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a 2a  be a join and.**
1fa40 20 20 20 20 20 20 20 20 28 33 62 29 20 74 68 65          (3b) the
1fa50 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1fa60 74 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  the subquery may
1fa70 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 76   not contain a v
1fa80 69 72 74 75 61 6c 0a 2a 2a 20 20 20 20 20 20 20  irtual.**       
1fa90 20 20 20 20 20 20 74 61 62 6c 65 20 61 6e 64 0a        table and.
1faa0 2a 2a 20 20 20 20 20 20 20 20 28 33 63 29 20 74  **        (3c) t
1fab0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  he outer query m
1fac0 61 79 20 6e 6f 74 20 62 65 20 61 6e 20 61 67 67  ay not be an agg
1fad0 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  regate..**.**   
1fae0 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (4)  The subquer
1faf0 79 20 63 61 6e 20 6e 6f 74 20 62 65 20 44 49 53  y can not be DIS
1fb00 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  TINCT..**.**  (*
1fb10 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74  *)  At one point
1fb20 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34   restrictions (4
1fb30 29 20 61 6e 64 20 28 35 29 20 64 65 66 69 6e 65  ) and (5) define
1fb40 64 20 61 20 73 75 62 73 65 74 20 6f 66 20 44 49  d a subset of DI
1fb50 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20 20  STINCT.**       
1fb60 20 73 75 62 2d 71 75 65 72 69 65 73 20 74 68 61   sub-queries tha
1fb70 74 20 77 65 72 65 20 65 78 63 6c 75 64 65 64 20  t were excluded 
1fb80 66 72 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d 69  from this optimi
1fb90 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72 69 63 74  zation. Restrict
1fba0 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 28  ion .**        (
1fbb0 34 29 20 68 61 73 20 73 69 6e 63 65 20 62 65 65  4) has since bee
1fbc0 6e 20 65 78 70 61 6e 64 65 64 20 74 6f 20 65 78  n expanded to ex
1fbd0 63 6c 75 64 65 20 61 6c 6c 20 44 49 53 54 49 4e  clude all DISTIN
1fbe0 43 54 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  CT subqueries..*
1fbf0 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e  *.**  (**)  We n
1fc00 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74  o longer attempt
1fc10 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72   to flatten aggr
1fc20 65 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73  egate subqueries
1fc30 2e 20 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20  .  Was:.**      
1fc40 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1fc50 79 20 69 73 20 61 67 67 72 65 67 61 74 65 2c 20  y is aggregate, 
1fc60 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1fc70 6d 61 79 20 6e 6f 74 20 62 65 20 44 49 53 54 49  may not be DISTI
1fc80 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29  NCT..**.**   (7)
1fc90 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 6d    The subquery m
1fca0 75 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d 20  ust have a FROM 
1fcb0 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20  clause.  TODO:  
1fcc0 46 6f 72 20 73 75 62 71 75 65 72 69 65 73 20 77  For subqueries w
1fcd0 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20  ithout.**       
1fce0 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20   A FROM clause, 
1fcf0 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20  consider adding 
1fd00 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 69  a FROM clause wi
1fd10 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a  th the special.*
1fd20 2a 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 73  *        table s
1fd30 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74 20  qlite_once that 
1fd40 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69  consists of a si
1fd50 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e  ngle row contain
1fd60 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  ing a.**        
1fd70 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a  single NULL..**.
1fd80 2a 2a 20 20 20 28 38 29 20 20 49 66 20 74 68 65  **   (8)  If the
1fd90 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c   subquery uses L
1fda0 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75  IMIT then the ou
1fdb0 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f  ter query may no
1fdc0 74 20 62 65 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a  t be a join..**.
1fdd0 2a 2a 20 20 20 28 39 29 20 20 49 66 20 74 68 65  **   (9)  If the
1fde0 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c   subquery uses L
1fdf0 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75  IMIT then the ou
1fe00 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f  ter query may no
1fe10 74 20 62 65 20 61 67 67 72 65 67 61 74 65 2e 0a  t be aggregate..
1fe20 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65 73  **.**  (**)  Res
1fe30 74 72 69 63 74 69 6f 6e 20 28 31 30 29 20 77 61  triction (10) wa
1fe40 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
1fe50 68 65 20 63 6f 64 65 20 6f 6e 20 32 30 30 35 2d  he code on 2005-
1fe60 30 32 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a 20  02-05 but we.** 
1fe70 20 20 20 20 20 20 20 61 63 63 69 64 65 6e 74 6c         accidentl
1fe80 79 20 63 61 72 72 69 65 64 20 74 68 65 20 63 6f  y carried the co
1fe90 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64 20 75 6e  mment forward un
1fea0 74 69 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e 20  til 2014-09-15. 
1feb0 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20   Original.**    
1fec0 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 3a 20      constraint: 
1fed0 22 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79  "If the subquery
1fee0 20 69 73 20 61 67 67 72 65 67 61 74 65 20 74 68   is aggregate th
1fef0 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  en the outer que
1ff00 72 79 20 0a 2a 2a 20 20 20 20 20 20 20 20 6d 61  ry .**        ma
1ff10 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e  y not use LIMIT.
1ff20 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54  ".**.**  (11)  T
1ff30 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
1ff40 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1ff50 6d 61 79 20 6e 6f 74 20 62 6f 74 68 20 68 61 76  may not both hav
1ff60 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1ff70 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20  es..**.**  (**) 
1ff80 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64   Not implemented
1ff90 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f  .  Subsumed into
1ffa0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29   restriction (3)
1ffb0 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75 73 6c  .  Was previousl
1ffc0 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73 65  y.**        a se
1ffd0 70 61 72 61 74 65 20 72 65 73 74 72 69 63 74 69  parate restricti
1ffe0 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f 6d  on deriving from
1fff0 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a   ticket #350..**
20000 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20 73  .**  (13)  The s
20010 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65  ubquery and oute
20020 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  r query may not 
20030 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a  both use LIMIT..
20040 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65  **.**  (14)  The
20050 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f   subquery may no
20060 74 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a  t use OFFSET..**
20070 0a 2a 2a 20 20 28 31 35 29 20 20 49 66 20 74 68  .**  (15)  If th
20080 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
20090 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f   part of a compo
200a0 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
200b0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73   the.**        s
200c0 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  ubquery may not 
200d0 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 20 20 20  use LIMIT..**   
200e0 20 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74       (See ticket
200f0 20 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65   #2339 and ticke
20100 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e  t [02a8e81d44]).
20110 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 49 66  .**.**  (16)  If
20120 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
20130 20 69 73 20 61 67 67 72 65 67 61 74 65 2c 20 74   is aggregate, t
20140 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 79  hen the subquery
20150 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20 20 20 20   may not.**     
20160 20 20 20 75 73 65 20 4f 52 44 45 52 20 42 59 2e     use ORDER BY.
20170 20 20 28 54 69 63 6b 65 74 20 23 32 39 34 32 29    (Ticket #2942)
20180 20 20 54 68 69 73 20 75 73 65 64 20 74 6f 20 6e    This used to n
20190 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20  ot matter.**    
201a0 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e 74      until we int
201b0 72 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f 75  roduced the grou
201c0 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63 74  p_concat() funct
201d0 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31  ion.  .**.**  (1
201e0 37 29 20 20 49 66 20 74 68 65 20 73 75 62 71 75  7)  If the subqu
201f0 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
20200 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 0a 2a  d select, then.*
20210 2a 20 20 20 20 20 20 20 20 28 31 37 61 29 20 61  *        (17a) a
20220 6c 6c 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72  ll compound oper
20230 61 74 6f 72 73 20 6d 75 73 74 20 62 65 20 61 20  ators must be a 
20240 55 4e 49 4f 4e 20 41 4c 4c 2c 20 61 6e 64 0a 2a  UNION ALL, and.*
20250 2a 20 20 20 20 20 20 20 20 28 31 37 62 29 20 6e  *        (17b) n
20260 6f 20 74 65 72 6d 73 20 77 69 74 68 69 6e 20 74  o terms within t
20270 68 65 20 73 75 62 71 75 65 72 79 20 63 6f 6d 70  he subquery comp
20280 6f 75 6e 64 20 6d 61 79 20 62 65 20 61 67 67 72  ound may be aggr
20290 65 67 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 20  egate.**        
202a0 20 20 20 20 20 20 6f 72 20 44 49 53 54 49 4e 43        or DISTINC
202b0 54 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  T, and.**       
202c0 20 28 31 37 63 29 20 65 76 65 72 79 20 74 65 72   (17c) every ter
202d0 6d 20 77 69 74 68 69 6e 20 74 68 65 20 73 75 62  m within the sub
202e0 71 75 65 72 79 20 63 6f 6d 70 6f 75 6e 64 20 6d  query compound m
202f0 75 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d 20  ust have a FROM 
20300 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  clause.**       
20310 20 28 31 37 64 29 20 74 68 65 20 6f 75 74 65 72   (17d) the outer
20320 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62   query may not b
20330 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
20340 20 20 28 31 37 64 31 29 20 61 67 67 72 65 67 61    (17d1) aggrega
20350 74 65 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  te, or.**       
20360 20 20 20 20 20 20 20 28 31 37 64 32 29 20 44 49         (17d2) DI
20370 53 54 49 4e 43 54 2c 20 6f 72 0a 2a 2a 20 20 20  STINCT, or.**   
20380 20 20 20 20 20 20 20 20 20 20 20 28 31 37 64 33             (17d3
20390 29 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ) a join..**.** 
203a0 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65 6e         The paren
203b0 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79 20  t and sub-query 
203c0 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45 52  may contain WHER
203d0 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a 65  E clauses. Subje
203e0 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20  ct to.**        
203f0 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33 29  rules (11), (13)
20400 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79 20   and (14), they 
20410 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  may also contain
20420 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20   ORDER BY,.**   
20430 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f       LIMIT and O
20440 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 20  FFSET clauses.  
20450 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61 6e  The subquery can
20460 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d 70  not use any comp
20470 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f  ound.**        o
20480 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74 68  perator other th
20490 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65 63  an UNION ALL bec
204a0 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74 68  ause all the oth
204b0 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  er compound.**  
204c0 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73 20        operators 
204d0 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64 20  have an implied 
204e0 44 49 53 54 49 4e 43 54 20 77 68 69 63 68 20 69  DISTINCT which i
204f0 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79 0a  s disallowed by.
20500 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74 72 69  **        restri
20510 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a  ction (4)..**.**
20520 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65 61          Also, ea
20530 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20  ch component of 
20540 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d 75  the sub-query mu
20550 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  st return the sa
20560 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20  me number.**    
20570 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63 6f      of result co
20580 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20 61  lumns. This is a
20590 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69 72  ctually a requir
205a0 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 6f  ement for any co
205b0 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20  mpound.**       
205c0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
205d0 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20 63  t, but all the c
205e0 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20 69 73  ode here does is
205f0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
20600 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 63  no.**        suc
20610 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62 2d  h (illegal) sub-
20620 71 75 65 72 79 20 69 73 20 66 6c 61 74 74 65 6e  query is flatten
20630 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ed. The caller w
20640 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a 2a  ill detect the.*
20650 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61 78 20  *        syntax 
20660 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72 6e  error and return
20670 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73 73   a detailed mess
20680 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29  age..**.**  (18)
20690 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65    If the sub-que
206a0 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
206b0 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c   select, then al
206c0 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  l terms of the.*
206d0 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 42  *        ORDER B
206e0 59 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  Y clause of the 
206f0 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20 73  parent must be s
20700 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  imple references
20710 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 63   to .**        c
20720 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 75  olumns of the su
20730 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
20740 28 31 39 29 20 20 49 66 20 74 68 65 20 73 75 62  (19)  If the sub
20750 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54  query uses LIMIT
20760 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20   then the outer 
20770 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a  query may not.**
20780 20 20 20 20 20 20 20 20 68 61 76 65 20 61 20 57          have a W
20790 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  HERE clause..**.
207a0 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74 68 65  **  (20)  If the
207b0 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
207c0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
207d0 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f   then it must no
207e0 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  t use.**        
207f0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
20800 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37  se.  Ticket #377
20810 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c  3.  We could rel
20820 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  ax this constrai
20830 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d  nt.**        som
20840 65 77 68 61 74 20 62 79 20 73 61 79 69 6e 67 20  ewhat by saying 
20850 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f  that the terms o
20860 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
20870 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20  lause must.**   
20880 20 20 20 20 20 61 70 70 65 61 72 20 61 73 20 75       appear as u
20890 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74  nmodified result
208a0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
208b0 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 75  outer query.  Bu
208c0 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 68  t we.**        h
208d0 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69  ave other optimi
208e0 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20  zations in mind 
208f0 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 61  to deal with tha
20900 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  t case..**.**  (
20910 32 31 29 20 20 49 66 20 74 68 65 20 73 75 62 71  21)  If the subq
20920 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54 20  uery uses LIMIT 
20930 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71  then the outer q
20940 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 0a  uery may not be.
20950 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e  **        DISTIN
20960 43 54 2e 20 20 28 53 65 65 20 74 69 63 6b 65 74  CT.  (See ticket
20970 20 5b 37 35 32 65 31 36 34 36 66 63 5d 29 2e 0a   [752e1646fc])..
20980 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54 68 65  **.**  (22)  The
20990 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f   subquery may no
209a0 74 20 62 65 20 61 20 72 65 63 75 72 73 69 76 65  t be a recursive
209b0 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a   CTE..**.**  (**
209c0 29 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f  )  Subsumed into
209d0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37   restriction (17
209e0 64 33 29 2e 20 20 57 61 73 3a 20 49 66 20 74 68  d3).  Was: If th
209f0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
20a00 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 72 65 63  .**        a rec
20a10 75 72 73 69 76 65 20 43 54 45 2c 20 74 68 65 6e  ursive CTE, then
20a20 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d   the sub-query m
20a30 61 79 20 6e 6f 74 20 62 65 20 61 20 63 6f 6d 70  ay not be a comp
20a40 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 20 20  ound query..**  
20a50 20 20 20 20 20 20 54 68 69 73 20 72 65 73 74 72        This restr
20a60 69 63 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73  iction is becaus
20a70 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74  e transforming t
20a80 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 70 61 72  he.**        par
20a90 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75 6e  ent to a compoun
20aa0 64 20 71 75 65 72 79 20 63 6f 6e 66 75 73 65 73  d query confuses
20ab0 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 68   the code that h
20ac0 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20  andles.**       
20ad0 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72 69   recursive queri
20ae0 65 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65 63  es in multiSelec
20af0 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  t()..**.**  (**)
20b00 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61    We no longer a
20b10 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74 65  ttempt to flatte
20b20 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71  n aggregate subq
20b30 75 65 72 69 65 73 2e 20 20 57 61 73 3a 0a 2a 2a  ueries.  Was:.**
20b40 20 20 20 20 20 20 20 20 54 68 65 20 73 75 62 71          The subq
20b50 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20  uery may not be 
20b60 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68 61  an aggregate tha
20b70 74 20 75 73 65 73 20 74 68 65 20 62 75 69 6c 74  t uses the built
20b80 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a 2a 2a  -in min() or .**
20b90 20 20 20 20 20 20 20 20 6f 72 20 6d 61 78 28 29          or max()
20ba0 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28 57 69   functions.  (Wi
20bb0 74 68 6f 75 74 20 74 68 69 73 20 72 65 73 74 72  thout this restr
20bc0 69 63 74 69 6f 6e 2c 20 61 20 71 75 65 72 79 20  iction, a query 
20bd0 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20 20 20  like:.**        
20be0 22 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28  "SELECT x FROM (
20bf0 53 45 4c 45 43 54 20 6d 61 78 28 79 29 2c 20 78  SELECT max(y), x
20c00 20 46 52 4f 4d 20 74 31 29 22 20 77 6f 75 6c 64   FROM t1)" would
20c10 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
20c20 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 74 75 72  .**        retur
20c30 6e 20 74 68 65 20 76 61 6c 75 65 20 58 20 66 6f  n the value X fo
20c40 72 20 77 68 69 63 68 20 59 20 77 61 73 20 6d 61  r which Y was ma
20c50 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 20 20 28  ximal.).**.**  (
20c60 32 35 29 20 20 49 66 20 65 69 74 68 65 72 20 74  25)  If either t
20c70 68 65 20 73 75 62 71 75 65 72 79 20 6f 72 20 74  he subquery or t
20c80 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
20c90 63 6f 6e 74 61 69 6e 73 20 61 20 77 69 6e 64 6f  contains a windo
20ca0 77 0a 2a 2a 20 20 20 20 20 20 20 20 66 75 6e 63  w.**        func
20cb0 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 65 6c 65  tion in the sele
20cc0 63 74 20 6c 69 73 74 20 6f 72 20 4f 52 44 45 52  ct list or ORDER
20cd0 20 42 59 20 63 6c 61 75 73 65 2c 20 66 6c 61 74   BY clause, flat
20ce0 74 65 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  tening.**       
20cf0 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
20d00 64 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  d..**.**.** In t
20d10 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
20d20 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
20d30 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
20d40 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
20d50 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  ** The subquery 
20d60 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46  is p->pSrc->a[iF
20d70 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20  rom].  isAgg is 
20d80 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65  true if the oute
20d90 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20  r query.** uses 
20da0 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
20db0 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
20dc0 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64  is not attempted
20dd0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
20de0 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65  s a no-op and re
20df0 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66  turns 0..** If f
20e00 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74  lattening is att
20e10 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74  empted this rout
20e20 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a  ine returns 1..*
20e30 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20  *.** All of the 
20e40 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79  expression analy
20e50 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f  sis must occur o
20e60 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72  n both the outer
20e70 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68   query and.** th
20e80 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72  e subquery befor
20e90 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  e this routine r
20ea0 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uns..*/.static i
20eb0 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65  nt flattenSubque
20ec0 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ry(.  Parse *pPa
20ed0 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
20ee0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
20ef0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
20f00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
20f10 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53  arent or outer S
20f20 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
20f30 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20  */.  int iFrom, 
20f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
20f50 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61  ex in p->pSrc->a
20f60 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  [] of the inner 
20f70 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  subquery */.  in
20f80 74 20 69 73 41 67 67 20 20 20 20 20 20 20 20 20  t isAgg         
20f90 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75     /* True if ou
20fa0 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20  ter SELECT uses 
20fb0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
20fc0 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ons */.){.  cons
20fd0 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75  t char *zSavedAu
20fe0 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72  thContext = pPar
20ff0 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
21000 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72  ;.  Select *pPar
21010 65 6e 74 3b 20 20 20 20 2f 2a 20 43 75 72 72 65  ent;    /* Curre
21020 6e 74 20 55 4e 49 4f 4e 20 41 4c 4c 20 74 65 72  nt UNION ALL ter
21030 6d 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 71  m of the other q
21040 75 65 72 79 20 2a 2f 0a 20 20 53 65 6c 65 63 74  uery */.  Select
21050 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a   *pSub;       /*
21060 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
21070 20 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a   or "subquery" *
21080 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
21090 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  1;      /* Point
210a0 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d  er to the rightm
210b0 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75  ost select in su
210c0 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63  b-query */.  Src
210d0 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
210e0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
210f0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
21100 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c   query */.  SrcL
21110 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20  ist *pSubSrc;   
21120 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
21130 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  se of the subque
21140 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ry */.  int iPar
21150 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56  ent;        /* V
21160 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
21170 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65  r of the pSub re
21180 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61  sult set temp ta
21190 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65  ble */.  int iNe
211a0 77 50 61 72 65 6e 74 20 3d 20 2d 31 3b 2f 2a 20  wParent = -1;/* 
211b0 52 65 70 6c 61 63 65 6d 65 6e 74 20 74 61 62 6c  Replacement tabl
211c0 65 20 66 6f 72 20 69 50 61 72 65 6e 74 20 2a 2f  e for iParent */
211d0 0a 20 20 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69  .  int isLeftJoi
211e0 6e 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69  n = 0; /* True i
211f0 66 20 70 53 75 62 20 69 73 20 74 68 65 20 72 69  f pSub is the ri
21200 67 68 74 20 73 69 64 65 20 6f 66 20 61 20 4c 45  ght side of a LE
21210 46 54 20 4a 4f 49 4e 20 2a 2f 20 20 20 20 0a 20  FT JOIN */    . 
21220 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
21230 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
21240 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nter */.  Expr *
21250 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
21260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
21270 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
21280 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
21290 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65  st_item *pSubite
212a0 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71  m;   /* The subq
212b0 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  uery */.  sqlite
212c0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
212d0 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  db;..  /* Check 
212e0 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65  to see if flatte
212f0 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
21300 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  d.  Return 0 if 
21310 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  not..  */.  asse
21320 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
21330 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d  sert( p->pPrior=
21340 3d 30 20 29 3b 0a 20 20 69 66 28 20 4f 70 74 69  =0 );.  if( Opti
21350 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
21360 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72  (db, SQLITE_Quer
21370 79 46 6c 61 74 74 65 6e 65 72 29 20 29 20 72 65  yFlattener) ) re
21380 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d  turn 0;.  pSrc =
21390 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
213a0 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f  rt( pSrc && iFro
213b0 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53  m>=0 && iFrom<pS
213c0 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53  rc->nSrc );.  pS
213d0 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e  ubitem = &pSrc->
213e0 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72  a[iFrom];.  iPar
213f0 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ent = pSubitem->
21400 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20  iCursor;.  pSub 
21410 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c  = pSubitem->pSel
21420 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ect;.  assert( p
21430 53 75 62 21 3d 30 20 29 3b 0a 0a 23 69 66 6e 64  Sub!=0 );..#ifnd
21440 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
21450 49 4e 44 4f 57 46 55 4e 43 0a 20 20 69 66 28 20  INDOWFUNC.  if( 
21460 70 2d 3e 70 57 69 6e 20 7c 7c 20 70 53 75 62 2d  p->pWin || pSub-
21470 3e 70 57 69 6e 20 29 20 72 65 74 75 72 6e 20 30  >pWin ) return 0
21480 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21490 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
214a0 6e 20 28 32 35 29 20 2a 2f 0a 23 65 6e 64 69 66  n (25) */.#endif
214b0 0a 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53  ..  pSubSrc = pS
214c0 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65  ub->pSrc;.  asse
214d0 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20  rt( pSubSrc );. 
214e0 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72   /* Prior to ver
214f0 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e  sion 3.1.2, when
21500 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
21510 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70  T had to be simp
21520 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20  le constants,.  
21530 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79  ** not arbitrary
21540 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65   expressions, we
21550 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f   allowed some co
21560 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54  mbining of LIMIT
21570 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a   and OFFSET.  **
21580 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63 6f   because they co
21590 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20  uld be computed 
215a0 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e  at compile-time.
215b0 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54    But when LIMIT
215c0 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a   and OFFSET.  **
215d0 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61 72   became arbitrar
215e0 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77  y expressions, w
215f0 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f  e were forced to
21600 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e   add restriction
21610 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20  s (13).  ** and 
21620 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70  (14). */.  if( p
21630 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
21640 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->pLimit ) retur
21650 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
21660 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
21670 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70   (13) */.  if( p
21680 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
21690 53 75 62 2d 3e 70 4c 69 6d 69 74 2d 3e 70 52 69  Sub->pLimit->pRi
216a0 67 68 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ght ) return 0; 
216b0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
216c0 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 28   (14) */.  if( (
216d0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
216e0 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26 26  _Compound)!=0 &&
216f0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b   pSub->pLimit ){
21700 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
21710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
21740 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f  triction (15) */
21750 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53  .  }.  if( pSubS
21760 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65  rc->nSrc==0 ) re
21770 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
21780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21790 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29   Restriction (7)
217a0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
217b0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
217c0 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e  istinct ) return
217d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
217e0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29   Restriction (4)
217f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
21800 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72 63  >pLimit && (pSrc
21810 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67  ->nSrc>1 || isAg
21820 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  g) ){.     retur
21830 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  n 0;         /* 
21840 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38 29  Restrictions (8)
21850 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  (9) */.  }.  if(
21860 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20   p->pOrderBy && 
21870 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
21880 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
21890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
218c0 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a  striction (11) *
218d0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67  /.  }.  if( isAg
218e0 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  g && pSub->pOrde
218f0 72 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20  rBy ) return 0; 
21900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21910 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
21920 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  6) */.  if( pSub
21930 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70  ->pLimit && p->p
21940 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30  Where ) return 0
21950 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
21960 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
21970 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  9) */.  if( pSub
21980 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d 3e  ->pLimit && (p->
21990 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
219a0 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20 20  stinct)!=0 ){.  
219b0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
219c0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
219d0 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a  ion (21) */.  }.
219e0 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46    if( pSub->selF
219f0 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63 75 72  lags & (SF_Recur
21a00 73 69 76 65 29 20 29 7b 0a 20 20 20 20 72 65 74  sive) ){.    ret
21a10 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69  urn 0; /* Restri
21a20 63 74 69 6f 6e 73 20 28 32 32 29 20 2a 2f 0a 20  ctions (22) */. 
21a30 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66   }..  /*.  ** If
21a40 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
21a50 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
21a60 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  nd of a LEFT JOI
21a70 4e 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  N, then the.  **
21a80 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f   subquery may no
21a90 74 20 62 65 20 61 20 6a 6f 69 6e 20 69 74 73 65  t be a join itse
21aa0 6c 66 20 28 33 61 29 2e 20 45 78 61 6d 70 6c 65  lf (3a). Example
21ab0 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20   of why this is 
21ac0 6e 6f 74 0a 20 20 2a 2a 20 61 6c 6c 6f 77 65 64  not.  ** allowed
21ad0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
21ae0 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45      t1 LEFT OUTE
21af0 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20  R JOIN (t2 JOIN 
21b00 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  t3).  **.  ** If
21b10 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20   we flatten the 
21b20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20  above, we would 
21b30 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  get.  **.  **   
21b40 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f        (t1 LEFT O
21b50 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f  UTER JOIN t2) JO
21b60 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20  IN t3.  **.  ** 
21b70 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20  which is not at 
21b80 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69  all the same thi
21b90 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ng..  **.  ** If
21ba0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
21bb0 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
21bc0 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  nd of a LEFT JOI
21bd0 4e 2c 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65  N, then the oute
21be0 72 0a 20 20 2a 2a 20 71 75 65 72 79 20 63 61 6e  r.  ** query can
21bf0 6e 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65 67  not be an aggreg
21c00 61 74 65 2e 20 28 33 63 29 20 20 54 68 69 73 20  ate. (3c)  This 
21c10 69 73 20 61 6e 20 61 72 74 69 66 61 63 74 20 6f  is an artifact o
21c20 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 61  f the way.  ** a
21c30 67 67 72 65 67 61 74 65 73 20 61 72 65 20 70 72  ggregates are pr
21c40 6f 63 65 73 73 65 64 20 2d 20 74 68 65 72 65 20  ocessed - there 
21c50 69 73 20 6e 6f 20 6d 65 63 68 61 6e 69 73 6d 20  is no mechanism 
21c60 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 0a  to determine if.
21c70 20 20 2a 2a 20 74 68 65 20 4c 45 46 54 20 4a 4f    ** the LEFT JO
21c80 49 4e 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  IN table should 
21c90 62 65 20 61 6c 6c 2d 4e 55 4c 4c 2e 0a 20 20 2a  be all-NULL..  *
21ca0 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 20  *.  ** See also 
21cb0 74 69 63 6b 65 74 73 20 23 33 30 36 2c 20 23 33  tickets #306, #3
21cc0 35 30 2c 20 61 6e 64 20 23 33 33 30 30 2e 0a 20  50, and #3300.. 
21cd0 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69   */.  if( (pSubi
21ce0 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  tem->fg.jointype
21cf0 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
21d00 29 7b 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f 69  ){.    isLeftJoi
21d10 6e 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  n = 1;.    if( p
21d20 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c  SubSrc->nSrc>1 |
21d30 7c 20 69 73 41 67 67 20 7c 7c 20 49 73 56 69 72  | isAgg || IsVir
21d40 74 75 61 6c 28 70 53 75 62 53 72 63 2d 3e 61 5b  tual(pSubSrc->a[
21d50 30 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  0].pTab) ){.    
21d60 20 20 2f 2a 20 20 28 33 61 29 20 20 20 20 20 20    /*  (3a)      
21d70 20 20 20 20 20 20 20 28 33 63 29 20 20 20 20 20         (3c)     
21d80 28 33 62 29 20 2a 2f 0a 20 20 20 20 20 20 72 65  (3b) */.      re
21d90 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
21da0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
21db0 45 58 54 52 41 5f 49 46 4e 55 4c 4c 52 4f 57 0a  EXTRA_IFNULLROW.
21dc0 20 20 65 6c 73 65 20 69 66 28 20 69 46 72 6f 6d    else if( iFrom
21dd0 3e 30 20 26 26 20 21 69 73 41 67 67 20 29 7b 0a  >0 && !isAgg ){.
21de0 20 20 20 20 2f 2a 20 53 65 74 74 69 6e 67 20 69      /* Setting i
21df0 73 4c 65 66 74 4a 6f 69 6e 20 74 6f 20 2d 31 20  sLeftJoin to -1 
21e00 63 61 75 73 65 73 20 4f 50 5f 49 66 4e 75 6c 6c  causes OP_IfNull
21e10 52 6f 77 20 6f 70 63 6f 64 65 73 20 74 6f 20 62  Row opcodes to b
21e20 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 0a  e generated for.
21e30 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72 65 66      ** every ref
21e40 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 72 65  erence to any re
21e50 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d  sult column from
21e60 20 73 75 62 71 75 65 72 79 20 69 6e 20 61 20 6a   subquery in a j
21e70 6f 69 6e 2c 20 65 76 65 6e 0a 20 20 20 20 2a 2a  oin, even.    **
21e80 20 74 68 6f 75 67 68 20 74 68 65 79 20 61 72 65   though they are
21e90 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20   not necessary. 
21ea0 20 54 68 69 73 20 77 69 6c 6c 20 73 74 72 65 73   This will stres
21eb0 73 2d 74 65 73 74 20 74 68 65 20 4f 50 5f 49 66  s-test the OP_If
21ec0 4e 75 6c 6c 52 6f 77 20 0a 20 20 20 20 2a 2a 20  NullRow .    ** 
21ed0 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 69  opcode. */.    i
21ee0 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 2d 31 3b 0a  sLeftJoin = -1;.
21ef0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
21f00 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37   Restriction (17
21f10 29 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  ): If the sub-qu
21f20 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
21f30 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69  d SELECT, then i
21f40 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20  t must.  ** use 
21f50 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41  only the UNION A
21f60 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64  LL operator. And
21f70 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d   none of the sim
21f80 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69  ple select queri
21f90 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b  es.  ** that mak
21fa0 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e  e up the compoun
21fb0 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c  d SELECT are all
21fc0 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65  owed to be aggre
21fd0 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74  gate or distinct
21fe0 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20  .  ** queries.. 
21ff0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
22000 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66  pPrior ){.    if
22010 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
22020 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
22030 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74   0;  /* Restrict
22040 69 6f 6e 20 28 32 30 29 20 2a 2f 0a 20 20 20 20  ion (20) */.    
22050 7d 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  }.    if( isAgg 
22060 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  || (p->selFlags 
22070 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
22080 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21  0 || pSrc->nSrc!
22090 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =1 ){.      retu
220a0 72 6e 20 30 3b 20 2f 2a 20 28 31 37 64 31 29 2c  rn 0; /* (17d1),
220b0 20 28 31 37 64 32 29 2c 20 6f 72 20 28 31 37 64   (17d2), or (17d
220c0 33 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  3) */.    }.    
220d0 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20  for(pSub1=pSub; 
220e0 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75  pSub1; pSub1=pSu
220f0 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  b1->pPrior){.   
22100 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53     testcase( (pS
22110 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
22120 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
22130 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
22140 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
22150 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75    testcase( (pSu
22160 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
22170 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
22180 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41  ggregate))==SF_A
22190 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20  ggregate );.    
221a0 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e    assert( pSub->
221b0 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20  pSrc!=0 );.     
221c0 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70   assert( pSub->p
221d0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 53  EList->nExpr==pS
221e0 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ub1->pEList->nEx
221f0 70 72 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pr );.      if( 
22200 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73  (pSub1->selFlags
22210 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
22220 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d  SF_Aggregate))!=
22230 30 20 20 20 20 2f 2a 20 28 31 37 62 29 20 2a 2f  0    /* (17b) */
22240 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62  .       || (pSub
22250 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75  1->pPrior && pSu
22260 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20  b1->op!=TK_ALL) 
22270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22280 2f 2a 20 28 31 37 61 29 20 2a 2f 0a 20 20 20 20  /* (17a) */.    
22290 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72     || pSub1->pSr
222a0 63 2d 3e 6e 53 72 63 3c 31 20 20 20 20 20 20 20  c->nSrc<1       
222b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31             /* (1
222d0 37 63 29 20 2a 2f 0a 20 20 20 20 20 20 29 7b 0a  7c) */.      ){.
222e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
222f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
22300 74 65 73 74 63 61 73 65 28 20 70 53 75 62 31 2d  testcase( pSub1-
22310 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b  >pSrc->nSrc>1 );
22320 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
22330 65 73 74 72 69 63 74 69 6f 6e 20 28 31 38 29 2e  estriction (18).
22340 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
22350 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
22360 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66   int ii;.      f
22370 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70  or(ii=0; ii<p->p
22380 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
22390 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  ii++){.        i
223a0 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  f( p->pOrderBy->
223b0 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  a[ii].u.x.iOrder
223c0 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72  ByCol==0 ) retur
223d0 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
223e0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 2d   }.  }..  /* Ex-
223f0 72 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33 29  restriction (23)
22400 3a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 6c 79 20  :.  ** The only 
22410 77 61 79 20 74 68 61 74 20 74 68 65 20 72 65 63  way that the rec
22420 75 72 73 69 76 65 20 70 61 72 74 20 6f 66 20 61  ursive part of a
22430 20 43 54 45 20 63 61 6e 20 63 6f 6e 74 61 69 6e   CTE can contain
22440 20 61 20 63 6f 6d 70 6f 75 6e 64 0a 20 20 2a 2a   a compound.  **
22450 20 73 75 62 71 75 65 72 79 20 69 73 20 66 6f 72   subquery is for
22460 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74 6f   the subquery to
22470 20 62 65 20 6f 6e 65 20 74 65 72 6d 20 6f 66 20   be one term of 
22480 61 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66 20  a join.  But if 
22490 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
224a0 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 74 68 65  y is a join, the
224b0 6e 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67  n the flattening
224c0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
224d0 6e 20 73 74 6f 70 70 65 64 20 62 79 0a 20 20 2a  n stopped by.  *
224e0 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * restriction (1
224f0 37 64 33 29 0a 20 20 2a 2f 0a 20 20 61 73 73 65  7d3).  */.  asse
22500 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  rt( (p->selFlags
22510 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 29   & SF_Recursive)
22520 3d 3d 30 20 7c 7c 20 70 53 75 62 2d 3e 70 50 72  ==0 || pSub->pPr
22530 69 6f 72 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 2a  ior==0 );..  /**
22540 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68 20  *** If we reach 
22550 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74  this point, flat
22560 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
22570 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45  ted. *****/.  SE
22580 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72  LECTTRACE(1,pPar
22590 73 65 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20 25  se,p,("flatten %
225a0 75 2e 25 70 20 66 72 6f 6d 20 74 65 72 6d 20 25  u.%p from term %
225b0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
225c0 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 73           pSub->s
225d0 65 6c 49 64 2c 20 70 53 75 62 2c 20 69 46 72 6f  elId, pSub, iFro
225e0 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 68 6f  m));..  /* Autho
225f0 72 69 7a 65 20 74 68 65 20 73 75 62 71 75 65 72  rize the subquer
22600 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a  y */.  pParse->z
22610 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53  AuthContext = pS
22620 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20  ubitem->zName;. 
22630 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73   TESTONLY(i =) s
22640 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
22650 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
22660 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b  ELECT, 0, 0, 0);
22670 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d  .  testcase( i==
22680 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20  SQLITE_DENY );. 
22690 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
226a0 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75  ntext = zSavedAu
226b0 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a  thContext;..  /*
226c0 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
226d0 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
226e0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
226f0 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73 74 72  , then (by restr
22700 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20  ictions.  ** 17 
22710 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69 74  and 18 above) it
22720 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e   must be a UNION
22730 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72   ALL and the par
22740 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a  ent query must .
22750 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66    ** be of the f
22760 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  orm:.  **.  **  
22770 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d     SELECT <expr-
22780 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62  list> FROM (<sub
22790 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d  -query>) <where-
227a0 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20  clause> .  **.  
227b0 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  ** followed by a
227c0 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d  ny ORDER BY, LIM
227d0 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54  IT and/or OFFSET
227e0 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62   clauses. This b
227f0 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65  lock.  ** create
22800 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20  s N-1 copies of 
22810 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
22820 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44   without any ORD
22830 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20  ER BY, LIMIT or 
22840 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61  .  ** OFFSET cla
22850 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74  uses and joins t
22860 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  hem to the left-
22870 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65  hand-side of the
22880 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75   original.  ** u
22890 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f  sing UNION ALL o
228a0 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69  perators. In thi
228b0 73 20 63 61 73 65 20 4e 20 69 73 20 74 68 65 20  s case N is the 
228c0 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65  number of simple
228d0 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61  .  ** select sta
228e0 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63  tements in the c
228f0 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72  ompound sub-quer
22900 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61  y..  **.  ** Exa
22910 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
22920 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46      SELECT a+1 F
22930 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20  ROM (.  **      
22940 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
22950 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  tab.  **        
22960 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
22970 20 20 20 20 20 20 53 45 4c 45 43 54 20 79 20 46        SELECT y F
22980 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20  ROM tab.  **    
22990 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
229a0 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
229b0 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74   abs(z*2) FROM t
229c0 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57  ab2.  **     ) W
229d0 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20  HERE a!=5 ORDER 
229e0 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  BY 1.  **.  ** T
229f0 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a  ransformed into:
22a00 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
22a10 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74  ELECT x+1 FROM t
22a20 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a  ab WHERE x+1!=5.
22a30 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41    **     UNION A
22a40 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  LL.  **     SELE
22a50 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20  CT y+1 FROM tab 
22a60 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a  WHERE y+1!=5.  *
22a70 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a  *     UNION ALL.
22a80 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
22a90 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20  abs(z*2)+1 FROM 
22aa0 74 61 62 32 20 57 48 45 52 45 20 61 62 73 28 7a  tab2 WHERE abs(z
22ab0 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  *2)+1!=5.  **   
22ac0 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a    ORDER BY 1.  *
22ad0 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74  *.  ** We call t
22ae0 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e  his the "compoun
22af0 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74  d-subquery flatt
22b00 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66  ening"..  */.  f
22b10 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50  or(pSub=pSub->pP
22b20 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62  rior; pSub; pSub
22b30 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a  =pSub->pPrior){.
22b40 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77      Select *pNew
22b50 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
22b60 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
22b70 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72  rderBy;.    Expr
22b80 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c   *pLimit = p->pL
22b90 69 6d 69 74 3b 0a 20 20 20 20 53 65 6c 65 63 74  imit;.    Select
22ba0 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50   *pPrior = p->pP
22bb0 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  rior;.    p->pOr
22bc0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  derBy = 0;.    p
22bd0 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20  ->pSrc = 0;.    
22be0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
22bf0 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
22c00 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
22c10 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
22c20 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e  , p, 0);.    p->
22c30 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
22c40 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
22c50 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20   = pOrderBy;.   
22c60 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b   p->pSrc = pSrc;
22c70 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  .    p->op = TK_
22c80 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ALL;.    if( pNe
22c90 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  w==0 ){.      p-
22ca0 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
22cb0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
22cc0 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20     pNew->pPrior 
22cd0 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
22ce0 69 66 28 20 70 50 72 69 6f 72 20 29 20 70 50 72  if( pPrior ) pPr
22cf0 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65  ior->pNext = pNe
22d00 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  w;.      pNew->p
22d10 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Next = p;.      
22d20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77  p->pPrior = pNew
22d30 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  ;.      SELECTTR
22d40 41 43 45 28 32 2c 70 50 61 72 73 65 2c 70 2c 28  ACE(2,pParse,p,(
22d50 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65  "compound-subque
22d60 72 79 20 66 6c 61 74 74 65 6e 65 72 22 0a 20 20  ry flattener".  
22d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d80 20 20 20 20 20 20 20 20 20 20 20 20 22 20 63 72              " cr
22d90 65 61 74 65 73 20 25 75 20 61 73 20 70 65 65 72  eates %u as peer
22da0 5c 6e 22 2c 70 4e 65 77 2d 3e 73 65 6c 49 64 29  \n",pNew->selId)
22db0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
22dc0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
22dd0 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  d ) return 1;.  
22de0 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c  }..  /* Begin fl
22df0 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72  attening the iFr
22e00 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74  om-th entry of t
22e10 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a  he FROM clause .
22e20 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65    ** in the oute
22e30 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  r query..  */.  
22e40 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70  pSub = pSub1 = p
22e50 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
22e60 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  ;..  /* Delete t
22e70 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62  he transient tab
22e80 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 73 73  le structure ass
22e90 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
22ea0 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20  .  ** subquery. 
22eb0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46   */.  sqlite3DbF
22ec0 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
22ed0 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
22ee0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
22ef0 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  , pSubitem->zNam
22f00 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
22f10 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
22f20 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75  ->zAlias);.  pSu
22f30 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  bitem->zDatabase
22f40 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
22f50 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70  ->zName = 0;.  p
22f60 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  Subitem->zAlias 
22f70 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
22f80 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20  >pSelect = 0;.. 
22f90 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69   /* Defer deleti
22fa0 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  ng the Table obj
22fb0 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ect associated w
22fc0 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  ith the.  ** sub
22fd0 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65  query until code
22fe0 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20   generation is. 
22ff0 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69   ** complete, si
23000 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20 73 74  nce there may st
23010 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70  ill exist Expr.p
23020 54 61 62 20 65 6e 74 72 69 65 73 20 74 68 61 74  Tab entries that
23030 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74  .  ** refer to t
23040 68 65 20 73 75 62 71 75 65 72 79 20 65 76 65 6e  he subquery even
23050 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e   after flattenin
23060 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34 36  g.  Ticket #3346
23070 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62  ..  **.  ** pSub
23080 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c  item->pTab is al
23090 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79  ways non-NULL by
230a0 20 74 65 73 74 20 72 65 73 74 72 69 63 74 69 6f   test restrictio
230b0 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61 62 6f  ns and tests abo
230c0 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41  ve..  */.  if( A
230d0 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d 3e  LWAYS(pSubitem->
230e0 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20  pTab!=0) ){.    
230f0 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c  Table *pTabToDel
23100 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61   = pSubitem->pTa
23110 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 54  b;.    if( pTabT
23120 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 3d 3d 31  oDel->nTabRef==1
23130 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20   ){.      Parse 
23140 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
23150 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
23160 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
23170 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78   pTabToDel->pNex
23180 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65  tZombie = pTople
23190 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b  vel->pZombieTab;
231a0 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c  .      pToplevel
231b0 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70  ->pZombieTab = p
231c0 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65  TabToDel;.    }e
231d0 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54  lse{.      pTabT
231e0 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 2d 2d 3b  oDel->nTabRef--;
231f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69  .    }.    pSubi
23200 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20  tem->pTab = 0;. 
23210 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
23220 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73  lowing loop runs
23230 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
23240 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e  erm in a compoun
23250 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d-subquery.  ** 
23260 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64  flattening (as d
23270 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e  escribed above).
23280 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e    If we are doin
23290 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69  g a different ki
232a0 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74  nd.  ** of flatt
232b0 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65  ening - a flatte
232c0 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  ning other than 
232d0 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75  a compound-subqu
232e0 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d  ery flattening -
232f0 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  .  ** then this 
23300 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f  loop only runs o
23310 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nce..  **.  ** T
23320 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61  his loop moves a
23330 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65  ll of the FROM e
23340 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73  lements of the s
23350 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
23360 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
23370 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
23380 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72  er query.  Befor
23390 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65  e doing this, re
233a0 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20  member.  ** the 
233b0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
233c0 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f  r the original o
233d0 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20  uter query FROM 
233e0 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20  element in.  ** 
233f0 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50  iParent.  The iP
23400 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c  arent cursor wil
23410 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e  l never be used.
23420 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64    Subsequent cod
23430 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e  e.  ** will scan
23440 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f   expressions loo
23450 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74  king for iParent
23460 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
23470 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f  replace.  ** tho
23480 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69  se references wi
23490 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  th expressions t
234a0 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74  hat resolve to t
234b0 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  he subquery FROM
234c0 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77  .  ** elements w
234d0 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e  e are now copyin
234e0 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  g in..  */.  for
234f0 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72  (pParent=p; pPar
23500 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61  ent; pParent=pPa
23510 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53  rent->pPrior, pS
23520 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29  ub=pSub->pPrior)
23530 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72  {.    int nSubSr
23540 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79  c;.    u8 jointy
23550 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62  pe = 0;.    pSub
23560 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
23570 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ;     /* FROM cl
23580 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79  ause of subquery
23590 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20   */.    nSubSrc 
235a0 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b  = pSubSrc->nSrc;
235b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
235c0 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79  erms in subquery
235d0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
235e0 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65      pSrc = pPare
235f0 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a  nt->pSrc;     /*
23600 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
23610 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
23620 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63  */..    if( pSrc
23630 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
23640 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20  ( pParent==p ); 
23650 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74   /* First time t
23660 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
23670 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  */.      jointyp
23680 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 66 67  e = pSubitem->fg
23690 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  .jointype;.    }
236a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
236b0 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29  rt( pParent!=p )
236c0 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75  ;  /* 2nd and su
236d0 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74  bsequent times t
236e0 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
236f0 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  */.      pSrc = 
23700 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
23710 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
23720 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
23730 20 70 53 72 63 3d 3d 30 20 29 20 62 72 65 61 6b   pSrc==0 ) break
23740 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
23750 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
23760 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
23770 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 20  subquery uses a 
23780 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74  single slot of t
23790 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
237a0 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20 20  f the outer.    
237b0 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74 68  ** query.  If th
237c0 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6d  e subquery has m
237d0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65  ore than one ele
237e0 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f 4d  ment in its FROM
237f0 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20   clause,.    ** 
23800 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65 20  then expand the 
23810 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f 20 6d  outer query to m
23820 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69 74  ake space for it
23830 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65   to hold all ele
23840 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20  ments.    ** of 
23850 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
23860 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d    **.    ** Exam
23870 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
23880 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
23890 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45 43  ROM tabA, (SELEC
238a0 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20 73  T * FROM sub1, s
238b0 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20 20  ub2), tabB;.    
238c0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 75  **.    ** The ou
238d0 74 65 72 20 71 75 65 72 79 20 68 61 73 20 33 20  ter query has 3 
238e0 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52 4f  slots in its FRO
238f0 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73  M clause.  One s
23900 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  lot of the.    *
23910 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 28 74  * outer query (t
23920 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20  he middle slot) 
23930 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  is used by the s
23940 75 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e 65  ubquery.  The ne
23950 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20  xt.    ** block 
23960 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78 70  of code will exp
23970 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
23980 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ery FROM clause 
23990 74 6f 20 34 20 73 6c 6f 74 73 2e 0a 20 20 20 20  to 4 slots..    
239a0 2a 2a 20 54 68 65 20 6d 69 64 64 6c 65 20 73 6c  ** The middle sl
239b0 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64 20 74  ot is expanded t
239c0 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f  o two slots in o
239d0 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70 61  rder to make spa
239e0 63 65 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  ce.    ** for th
239f0 65 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69  e two elements i
23a00 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
23a10 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
23a20 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
23a30 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20  ( nSubSrc>1 ){. 
23a40 20 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c 69       pSrc = sqli
23a50 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
23a60 65 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20  e(pParse, pSrc, 
23a70 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b  nSubSrc-1,iFrom+
23a80 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  1);.      if( pS
23a90 72 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rc==0 ) break;. 
23aa0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53       pParent->pS
23ab0 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 7d  rc = pSrc;.    }
23ac0 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65  ..    /* Transfe
23ad0 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  r the FROM claus
23ae0 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65  e terms from the
23af0 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74   subquery into t
23b00 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
23b10 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  query..    */.  
23b20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75    for(i=0; i<nSu
23b30 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bSrc; i++){.    
23b40 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
23b50 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e  elete(db, pSrc->
23b60 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e  a[i+iFrom].pUsin
23b70 67 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  g);.      assert
23b80 28 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f  ( pSrc->a[i+iFro
23b90 6d 5d 2e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d  m].fg.isTabFunc=
23ba0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 53 72 63  =0 );.      pSrc
23bb0 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
23bc0 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
23bd0 20 20 20 20 69 4e 65 77 50 61 72 65 6e 74 20 3d      iNewParent =
23be0 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2e 69   pSubSrc->a[i].i
23bf0 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 6d 65  Cursor;.      me
23c00 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61  mset(&pSubSrc->a
23c10 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  [i], 0, sizeof(p
23c20 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a  SubSrc->a[i]));.
23c30 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e      }.    pSrc->
23c40 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e  a[iFrom].fg.join
23c50 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b  type = jointype;
23c60 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62  .  .    /* Now b
23c70 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e  egin substitutin
23c80 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  g subquery resul
23c90 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t set expression
23ca0 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65  s for .    ** re
23cb0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
23cc0 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f  iParent in the o
23cd0 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20  uter query..    
23ce0 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70  ** .    ** Examp
23cf0 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
23d00 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20  *   SELECT a+5, 
23d10 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43  b*10 FROM (SELEC
23d20 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30  T x*3 AS a, y+10
23d30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57   AS b FROM t1) W
23d40 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a  HERE a>b;.    **
23d50 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
23d60 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
23d70 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
23d80 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20   __________/    
23d90 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20        /.    **  
23da0 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
23db0 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71  ________ outer q
23dc0 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  uery ___________
23dd0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23de0 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ___/.    **.    
23df0 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76  ** We look at ev
23e00 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
23e10 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
23e20 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  y and every plac
23e30 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20  e we see.    ** 
23e40 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "a" we substitut
23e50 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72  e "x*3" and ever
23e60 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22  y place we see "
23e70 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  b" we substitute
23e80 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a   "y+10"..    */.
23e90 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f      if( pSub->pO
23ea0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
23eb0 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
23ec0 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69  , any non-zero i
23ed0 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65  OrderByCol value
23ee0 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
23ef0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44  the.      ** ORD
23f00 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70  ER BY column exp
23f10 72 65 73 73 69 6f 6e 20 69 73 20 69 64 65 6e 74  ression is ident
23f20 69 63 61 6c 20 74 6f 20 74 68 65 20 69 4f 72 64  ical to the iOrd
23f30 65 72 42 79 43 6f 6c 27 74 68 0a 20 20 20 20 20  erByCol'th.     
23f40 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 72   ** expression r
23f50 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43  eturned by SELEC
23f60 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53 75 62  T statement pSub
23f70 2e 20 53 69 6e 63 65 20 74 68 65 73 65 20 76 61  . Since these va
23f80 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f  lues.      ** do
23f90 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
23fa0 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 63   correspond to c
23fb0 6f 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54  olumns in SELECT
23fc0 20 73 74 61 74 65 6d 65 6e 74 20 70 50 61 72 65   statement pPare
23fd0 6e 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72  nt,.      ** zer
23fe0 6f 20 74 68 65 6d 20 62 65 66 6f 72 65 20 74 72  o them before tr
23ff0 61 6e 73 66 65 72 69 6e 67 20 74 68 65 20 4f 52  ansfering the OR
24000 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  DER BY clause.. 
24010 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
24020 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69 73 20   Not doing this 
24030 6d 61 79 20 63 61 75 73 65 20 61 6e 20 65 72 72  may cause an err
24040 6f 72 20 69 66 20 61 20 73 75 62 73 65 71 75 65  or if a subseque
24050 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a  nt call to this.
24060 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
24070 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c  n attempts to fl
24080 61 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  atten a compound
24090 20 73 75 62 2d 71 75 65 72 79 20 69 6e 74 6f 20   sub-query into 
240a0 70 50 61 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a  pParent.      **
240b0 20 28 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74   (the only way t
240c0 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 69  his can happen i
240d0 73 20 69 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  s if the compoun
240e0 64 20 73 75 62 2d 71 75 65 72 79 20 69 73 0a 20  d sub-query is. 
240f0 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c       ** currentl
24100 79 20 70 61 72 74 20 6f 66 20 70 53 75 62 2d 3e  y part of pSub->
24110 70 53 72 63 29 2e 20 53 65 65 20 74 69 63 6b 65  pSrc). See ticke
24120 74 20 5b 64 31 31 61 36 65 39 30 38 66 5d 2e 20  t [d11a6e908f]. 
24130 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69   */.      ExprLi
24140 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
24150 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  Sub->pOrderBy;. 
24160 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
24170 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
24180 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
24190 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e  OrderBy->a[i].u.
241a0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20  x.iOrderByCol = 
241b0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
241c0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
241d0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
241e0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
241f0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
24200 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d  rBy;.      pSub-
24210 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
24220 20 20 20 7d 0a 20 20 20 20 70 57 68 65 72 65 20     }.    pWhere 
24230 3d 20 70 53 75 62 2d 3e 70 57 68 65 72 65 3b 0a  = pSub->pWhere;.
24240 20 20 20 20 70 53 75 62 2d 3e 70 57 68 65 72 65      pSub->pWhere
24250 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69 73   = 0;.    if( is
24260 4c 65 66 74 4a 6f 69 6e 3e 30 20 29 7b 0a 20 20  LeftJoin>0 ){.  
24270 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28      setJoinExpr(
24280 70 57 68 65 72 65 2c 20 69 4e 65 77 50 61 72 65  pWhere, iNewPare
24290 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nt);.    }.    p
242a0 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d  Parent->pWhere =
242b0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
242c0 64 62 2c 20 70 57 68 65 72 65 2c 20 70 50 61 72  db, pWhere, pPar
242d0 65 6e 74 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  ent->pWhere);.  
242e0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
242f0 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Failed==0 ){.   
24300 20 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20     SubstContext 
24310 78 3b 0a 20 20 20 20 20 20 78 2e 70 50 61 72 73  x;.      x.pPars
24320 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20  e = pParse;.    
24330 20 20 78 2e 69 54 61 62 6c 65 20 3d 20 69 50 61    x.iTable = iPa
24340 72 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e 69 4e  rent;.      x.iN
24350 65 77 54 61 62 6c 65 20 3d 20 69 4e 65 77 50 61  ewTable = iNewPa
24360 72 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e 69 73  rent;.      x.is
24370 4c 65 66 74 4a 6f 69 6e 20 3d 20 69 73 4c 65 66  LeftJoin = isLef
24380 74 4a 6f 69 6e 3b 0a 20 20 20 20 20 20 78 2e 70  tJoin;.      x.p
24390 45 4c 69 73 74 20 3d 20 70 53 75 62 2d 3e 70 45  EList = pSub->pE
243a0 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 75 62 73  List;.      subs
243b0 74 53 65 6c 65 63 74 28 26 78 2c 20 70 50 61 72  tSelect(&x, pPar
243c0 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ent, 0);.    }. 
243d0 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61   .    /* The fla
243e0 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20  ttened query is 
243f0 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68  distinct if eith
24400 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20  er the inner or 
24410 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72  the.    ** outer
24420 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e   query is distin
24430 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ct. .    */.    
24440 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67  pParent->selFlag
24450 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c  s |= pSub->selFl
24460 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
24470 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20  t;.  .    /*.   
24480 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46   ** SELECT ... F
24490 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20  ROM (SELECT ... 
244a0 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62  LIMIT a OFFSET b
244b0 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54  ) LIMIT x OFFSET
244c0 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   y;.    **.    *
244d0 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64  * One is tempted
244e0 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61   to try to add a
244f0 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e   and b to combin
24500 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42  e the limits.  B
24510 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64  ut this.    ** d
24520 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20  oes not work if 
24530 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20  either limit is 
24540 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f  negative..    */
24550 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
24560 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70  Limit ){.      p
24570 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d  Parent->pLimit =
24580 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20   pSub->pLimit;. 
24590 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69       pSub->pLimi
245a0 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 0;.    }.  }
245b0 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c  ..  /* Finially,
245c0 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73 20   delete what is 
245d0 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62 71  left of the subq
245e0 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a  uery and return.
245f0 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20    ** success..  
24600 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  */.  sqlite3Sele
24610 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75  ctDelete(db, pSu
24620 62 31 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54  b1);..#if SELECT
24630 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
24640 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
24650 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  tTrace & 0x100 )
24660 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  {.    SELECTTRAC
24670 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70  E(0x100,pParse,p
24680 2c 28 22 41 66 74 65 72 20 66 6c 61 74 74 65 6e  ,("After flatten
24690 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73  ing:\n"));.    s
246a0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
246b0 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
246c0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
246d0 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
246e0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
246f0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
24700 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
24710 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
24720 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75  */../*.** A stru
24730 63 74 75 72 65 20 74 6f 20 6b 65 65 70 20 74 72  cture to keep tr
24740 61 63 6b 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68  ack of all of th
24750 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20  e column values 
24760 74 68 61 74 20 61 72 65 20 66 69 78 65 64 20 74  that are fixed t
24770 6f 0a 2a 2a 20 61 20 6b 6e 6f 77 6e 20 76 61 6c  o.** a known val
24780 75 65 20 64 75 65 20 74 6f 20 57 48 45 52 45 20  ue due to WHERE 
24790 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
247a0 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 43  ts of the form C
247b0 4f 4c 55 4d 4e 3d 56 41 4c 55 45 2e 0a 2a 2f 0a  OLUMN=VALUE..*/.
247c0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57  typedef struct W
247d0 68 65 72 65 43 6f 6e 73 74 20 57 68 65 72 65 43  hereConst WhereC
247e0 6f 6e 73 74 3b 0a 73 74 72 75 63 74 20 57 68 65  onst;.struct Whe
247f0 72 65 43 6f 6e 73 74 20 7b 0a 20 20 50 61 72 73  reConst {.  Pars
24800 65 20 2a 70 50 61 72 73 65 3b 20 20 20 2f 2a 20  e *pParse;   /* 
24810 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
24820 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 3b  */.  int nConst;
24830 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
24840 66 6f 72 20 43 4f 4c 55 4d 4e 3d 43 4f 4e 53 54  for COLUMN=CONST
24850 41 4e 54 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69  ANT terms */.  i
24860 6e 74 20 6e 43 68 6e 67 3b 20 20 20 20 20 20 20  nt nChng;       
24870 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d  /* Number of tim
24880 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 73  es a constant is
24890 20 70 72 6f 70 61 67 61 74 65 64 20 2a 2f 0a 20   propagated */. 
248a0 20 45 78 70 72 20 2a 2a 61 70 45 78 70 72 3b 20   Expr **apExpr; 
248b0 20 20 2f 2a 20 5b 69 2a 32 5d 20 69 73 20 43 4f    /* [i*2] is CO
248c0 4c 55 4d 4e 20 61 6e 64 20 5b 69 2a 32 2b 31 5d  LUMN and [i*2+1]
248d0 20 69 73 20 56 41 4c 55 45 20 2a 2f 0a 7d 3b 0a   is VALUE */.};.
248e0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
248f0 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 43   entry to the pC
24900 6f 6e 73 74 20 6f 62 6a 65 63 74 2e 20 20 45 78  onst object.  Ex
24910 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 61 64 64  cept, do not add
24920 20 64 75 70 6c 69 63 61 74 65 0a 2a 2a 20 70 43   duplicate.** pC
24930 6f 6c 75 6d 6e 20 65 6e 74 69 72 65 73 2e 0a 2a  olumn entires..*
24940 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
24950 6e 73 74 49 6e 73 65 72 74 28 0a 20 20 57 68 65  nstInsert(.  Whe
24960 72 65 43 6f 6e 73 74 20 2a 70 43 6f 6e 73 74 2c  reConst *pConst,
24970 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65        /* The Whe
24980 72 65 43 6f 6e 73 74 20 69 6e 74 6f 20 77 68 69  reConst into whi
24990 63 68 20 77 65 20 61 72 65 20 69 6e 73 65 72 74  ch we are insert
249a0 69 6e 67 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ing */.  Expr *p
249b0 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20  Column,         
249c0 20 20 2f 2a 20 54 68 65 20 43 4f 4c 55 4d 4e 20    /* The COLUMN 
249d0 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6e 73  part of the cons
249e0 74 72 61 69 6e 74 20 2a 2f 0a 20 20 45 78 70 72  traint */.  Expr
249f0 20 2a 70 56 61 6c 75 65 20 20 20 20 20 20 20 20   *pValue        
24a00 20 20 20 20 20 2f 2a 20 54 68 65 20 56 41 4c 55       /* The VALU
24a10 45 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f  E part of the co
24a20 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20  nstraint */.){. 
24a30 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
24a40 28 20 70 43 6f 6c 75 6d 6e 2d 3e 6f 70 3d 3d 54  ( pColumn->op==T
24a50 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 0a 20 20 2f  K_COLUMN );..  /
24a60 2a 20 32 30 31 38 2d 31 30 2d 32 35 20 74 69 63  * 2018-10-25 tic
24a70 6b 65 74 20 5b 63 66 35 65 64 32 30 66 5d 0a 20  ket [cf5ed20f]. 
24a80 20 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   ** Make sure th
24a90 65 20 73 61 6d 65 20 70 43 6f 6c 75 6d 6e 20 69  e same pColumn i
24aa0 73 20 6e 6f 74 20 69 6e 73 65 72 74 65 64 20 6d  s not inserted m
24ab0 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 2a 2f  ore than once */
24ac0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43  .  for(i=0; i<pC
24ad0 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 3b 20 69 2b  onst->nConst; i+
24ae0 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 45 78  +){.    const Ex
24af0 70 72 20 2a 70 45 78 70 72 20 3d 20 70 43 6f 6e  pr *pExpr = pCon
24b00 73 74 2d 3e 61 70 45 78 70 72 5b 69 2a 32 5d 3b  st->apExpr[i*2];
24b10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
24b20 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
24b30 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  N );.    if( pEx
24b40 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 43 6f 6c  pr->iTable==pCol
24b50 75 6d 6e 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20  umn->iTable.    
24b60 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
24b70 6d 6e 3d 3d 70 43 6f 6c 75 6d 6e 2d 3e 69 43 6f  mn==pColumn->iCo
24b80 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20  lumn.    ){.    
24b90 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 41 6c    return;  /* Al
24ba0 72 65 61 64 79 20 70 72 65 73 65 6e 74 2e 20 20  ready present.  
24bb0 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  Return without d
24bc0 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 2a  oing anything. *
24bd0 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  /.    }.  }..  p
24be0 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2b 2b 3b  Const->nConst++;
24bf0 0a 20 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70  .  pConst->apExp
24c00 72 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  r = sqlite3DbRea
24c10 6c 6c 6f 63 4f 72 46 72 65 65 28 70 43 6f 6e 73  llocOrFree(pCons
24c20 74 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  t->pParse->db, p
24c30 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 2c 0a 20  Const->apExpr,. 
24c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c50 20 20 20 20 20 20 20 20 70 43 6f 6e 73 74 2d 3e          pConst->
24c60 6e 43 6f 6e 73 74 2a 32 2a 73 69 7a 65 6f 66 28  nConst*2*sizeof(
24c70 45 78 70 72 2a 29 29 3b 0a 20 20 69 66 28 20 70  Expr*));.  if( p
24c80 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 3d 3d 30  Const->apExpr==0
24c90 20 29 7b 0a 20 20 20 20 70 43 6f 6e 73 74 2d 3e   ){.    pConst->
24ca0 6e 43 6f 6e 73 74 20 3d 20 30 3b 0a 20 20 7d 65  nConst = 0;.  }e
24cb0 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 45 78 70  lse{.    if( Exp
24cc0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 56 61  rHasProperty(pVa
24cd0 6c 75 65 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c  lue, EP_FixedCol
24ce0 29 20 29 20 70 56 61 6c 75 65 20 3d 20 70 56 61  ) ) pValue = pVa
24cf0 6c 75 65 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  lue->pLeft;.    
24d00 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b 70  pConst->apExpr[p
24d10 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2a 32 2d  Const->nConst*2-
24d20 32 5d 20 3d 20 70 43 6f 6c 75 6d 6e 3b 0a 20 20  2] = pColumn;.  
24d30 20 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72    pConst->apExpr
24d40 5b 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2a  [pConst->nConst*
24d50 32 2d 31 5d 20 3d 20 70 56 61 6c 75 65 3b 0a 20  2-1] = pValue;. 
24d60 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64   }.}../*.** Find
24d70 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 43 4f   all terms of CO
24d80 4c 55 4d 4e 3d 56 41 4c 55 45 20 6f 72 20 56 41  LUMN=VALUE or VA
24d90 4c 55 45 3d 43 4f 4c 55 4d 4e 20 69 6e 20 70 45  LUE=COLUMN in pE
24da0 78 70 72 20 77 68 65 72 65 20 56 41 4c 55 45 0a  xpr where VALUE.
24db0 2a 2a 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  ** is a constant
24dc0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
24dd0 77 68 65 72 65 20 74 68 65 20 74 65 72 6d 20 6d  where the term m
24de0 75 73 74 20 62 65 20 74 72 75 65 20 62 65 63 61  ust be true beca
24df0 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 70 61 72  use it.** is par
24e00 74 20 6f 66 20 74 68 65 20 41 4e 44 2d 63 6f 6e  t of the AND-con
24e10 6e 65 63 74 65 64 20 74 65 72 6d 73 20 6f 66 20  nected terms of 
24e20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  the expression. 
24e30 20 46 6f 72 20 65 61 63 68 20 74 65 72 6d 0a 2a   For each term.*
24e40 2a 20 66 6f 75 6e 64 2c 20 61 64 64 20 69 74 20  * found, add it 
24e50 74 6f 20 74 68 65 20 70 43 6f 6e 73 74 20 73 74  to the pConst st
24e60 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
24e70 69 63 20 76 6f 69 64 20 66 69 6e 64 43 6f 6e 73  ic void findCons
24e80 74 49 6e 57 68 65 72 65 28 57 68 65 72 65 43 6f  tInWhere(WhereCo
24e90 6e 73 74 20 2a 70 43 6f 6e 73 74 2c 20 45 78 70  nst *pConst, Exp
24ea0 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70  r *pExpr){.  Exp
24eb0 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66  r *pRight, *pLef
24ec0 74 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  t;.  if( pExpr==
24ed0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
24ee0 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
24ef0 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
24f00 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a  Join) ) return;.
24f10 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
24f20 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 66  =TK_AND ){.    f
24f30 69 6e 64 43 6f 6e 73 74 49 6e 57 68 65 72 65 28  indConstInWhere(
24f40 70 43 6f 6e 73 74 2c 20 70 45 78 70 72 2d 3e 70  pConst, pExpr->p
24f50 52 69 67 68 74 29 3b 0a 20 20 20 20 66 69 6e 64  Right);.    find
24f60 43 6f 6e 73 74 49 6e 57 68 65 72 65 28 70 43 6f  ConstInWhere(pCo
24f70 6e 73 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  nst, pExpr->pLef
24f80 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
24f90 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d    }.  if( pExpr-
24fa0 3e 6f 70 21 3d 54 4b 5f 45 51 20 29 20 72 65 74  >op!=TK_EQ ) ret
24fb0 75 72 6e 3b 0a 20 20 70 52 69 67 68 74 20 3d 20  urn;.  pRight = 
24fc0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
24fd0 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e   pLeft = pExpr->
24fe0 70 4c 65 66 74 3b 0a 20 20 61 73 73 65 72 74 28  pLeft;.  assert(
24ff0 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20   pRight!=0 );.  
25000 61 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30  assert( pLeft!=0
25010 20 29 3b 0a 20 20 69 66 28 20 70 52 69 67 68 74   );.  if( pRight
25020 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
25030 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72     && !ExprHasPr
25040 6f 70 65 72 74 79 28 70 52 69 67 68 74 2c 20 45  operty(pRight, E
25050 50 5f 46 69 78 65 64 43 6f 6c 29 0a 20 20 20 26  P_FixedCol).   &
25060 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
25070 6f 6e 73 74 61 6e 74 28 70 4c 65 66 74 29 0a 20  onstant(pLeft). 
25080 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 42 69    && sqlite3IsBi
25090 6e 61 72 79 28 73 71 6c 69 74 65 33 42 69 6e 61  nary(sqlite3Bina
250a0 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
250b0 28 70 43 6f 6e 73 74 2d 3e 70 50 61 72 73 65 2c  (pConst->pParse,
250c0 70 4c 65 66 74 2c 70 52 69 67 68 74 29 29 0a 20  pLeft,pRight)). 
250d0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 49 6e 73   ){.    constIns
250e0 65 72 74 28 70 43 6f 6e 73 74 2c 20 70 52 69 67  ert(pConst, pRig
250f0 68 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d 65  ht, pLeft);.  }e
25100 6c 73 65 0a 20 20 69 66 28 20 70 4c 65 66 74 2d  lse.  if( pLeft-
25110 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
25120 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f    && !ExprHasPro
25130 70 65 72 74 79 28 70 4c 65 66 74 2c 20 45 50 5f  perty(pLeft, EP_
25140 46 69 78 65 64 43 6f 6c 29 0a 20 20 20 26 26 20  FixedCol).   && 
25150 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
25160 73 74 61 6e 74 28 70 52 69 67 68 74 29 0a 20 20  stant(pRight).  
25170 20 26 26 20 73 71 6c 69 74 65 33 49 73 42 69 6e   && sqlite3IsBin
25180 61 72 79 28 73 71 6c 69 74 65 33 42 69 6e 61 72  ary(sqlite3Binar
25190 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
251a0 70 43 6f 6e 73 74 2d 3e 70 50 61 72 73 65 2c 70  pConst->pParse,p
251b0 4c 65 66 74 2c 70 52 69 67 68 74 29 29 0a 20 20  Left,pRight)).  
251c0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 49 6e 73 65  ){.    constInse
251d0 72 74 28 70 43 6f 6e 73 74 2c 20 70 4c 65 66 74  rt(pConst, pLeft
251e0 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 7d  , pRight);.  }.}
251f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
25200 61 20 57 61 6c 6b 65 72 20 65 78 70 72 65 73 73  a Walker express
25210 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 2e 20 20 70  ion callback.  p
25220 45 78 70 72 20 69 73 20 61 20 63 61 6e 64 69 64  Expr is a candid
25230 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  ate expression.*
25240 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64  * to be replaced
25250 20 62 79 20 61 20 76 61 6c 75 65 2e 20 20 49 66   by a value.  If
25260 20 70 45 78 70 72 20 69 73 20 65 71 75 69 76 61   pExpr is equiva
25270 6c 65 6e 74 20 74 6f 20 6f 6e 65 20 6f 66 20 74  lent to one of t
25280 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6e 61  he.** columns na
25290 6d 65 64 20 69 6e 20 70 57 61 6c 6b 65 72 2d 3e  med in pWalker->
252a0 75 2e 70 43 6f 6e 73 74 2c 20 74 68 65 6e 20 6f  u.pConst, then o
252b0 76 65 72 77 72 69 74 65 20 69 74 20 77 69 74 68  verwrite it with
252c0 20 69 74 73 0a 2a 2a 20 63 6f 72 72 65 73 70 6f   its.** correspo
252d0 6e 64 69 6e 67 20 76 61 6c 75 65 2e 0a 2a 2f 0a  nding value..*/.
252e0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 70 61  static int propa
252f0 67 61 74 65 43 6f 6e 73 74 61 6e 74 45 78 70 72  gateConstantExpr
25300 52 65 77 72 69 74 65 28 57 61 6c 6b 65 72 20 2a  Rewrite(Walker *
25310 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
25320 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Expr){.  int i;.
25330 20 20 57 68 65 72 65 43 6f 6e 73 74 20 2a 70 43    WhereConst *pC
25340 6f 6e 73 74 3b 0a 20 20 69 66 28 20 70 45 78 70  onst;.  if( pExp
25350 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
25360 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
25370 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28 20 45 78  ntinue;.  if( Ex
25380 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
25390 78 70 72 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c  xpr, EP_FixedCol
253a0 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ) ) return WRC_C
253b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 70 43 6f 6e 73  ontinue;.  pCons
253c0 74 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  t = pWalker->u.p
253d0 43 6f 6e 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30  Const;.  for(i=0
253e0 3b 20 69 3c 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e  ; i<pConst->nCon
253f0 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  st; i++){.    Ex
25400 70 72 20 2a 70 43 6f 6c 75 6d 6e 20 3d 20 70 43  pr *pColumn = pC
25410 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b 69 2a 32  onst->apExpr[i*2
25420 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 75  ];.    if( pColu
25430 6d 6e 3d 3d 70 45 78 70 72 20 29 20 63 6f 6e 74  mn==pExpr ) cont
25440 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43  inue;.    if( pC
25450 6f 6c 75 6d 6e 2d 3e 69 54 61 62 6c 65 21 3d 70  olumn->iTable!=p
25460 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 20 63  Expr->iTable ) c
25470 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
25480 20 70 43 6f 6c 75 6d 6e 2d 3e 69 43 6f 6c 75 6d   pColumn->iColum
25490 6e 21 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n!=pExpr->iColum
254a0 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
254b0 20 20 2f 2a 20 41 20 6d 61 74 63 68 20 69 73 20    /* A match is 
254c0 66 6f 75 6e 64 2e 20 20 41 64 64 20 74 68 65 20  found.  Add the 
254d0 45 50 5f 46 69 78 65 64 43 6f 6c 20 70 72 6f 70  EP_FixedCol prop
254e0 65 72 74 79 20 2a 2f 0a 20 20 20 20 70 43 6f 6e  erty */.    pCon
254f0 73 74 2d 3e 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20  st->nChng++;.   
25500 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72   ExprClearProper
25510 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4c 65 61  ty(pExpr, EP_Lea
25520 66 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74 50  f);.    ExprSetP
25530 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
25540 50 5f 46 69 78 65 64 43 6f 6c 29 3b 0a 20 20 20  P_FixedCol);.   
25550 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
25560 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pLeft==0 );.    
25570 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73  pExpr->pLeft = s
25580 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 43  qlite3ExprDup(pC
25590 6f 6e 73 74 2d 3e 70 50 61 72 73 65 2d 3e 64 62  onst->pParse->db
255a0 2c 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72  , pConst->apExpr
255b0 5b 69 2a 32 2b 31 5d 2c 20 30 29 3b 0a 20 20 20  [i*2+1], 0);.   
255c0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
255d0 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
255e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 57 48 45  }../*.** The WHE
255f0 52 45 2d 63 6c 61 75 73 65 20 63 6f 6e 73 74 61  RE-clause consta
25600 6e 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6f  nt propagation o
25610 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a  ptimization..**.
25620 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20  ** If the WHERE 
25630 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
25640 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72  terms of the for
25650 6d 20 43 4f 4c 55 4d 4e 3d 43 4f 4e 53 54 41 4e  m COLUMN=CONSTAN
25660 54 20 6f 72 0a 2a 2a 20 43 4f 4e 53 54 41 4e 54  T or.** CONSTANT
25670 3d 43 4f 4c 55 4d 4e 20 74 68 61 74 20 6d 75 73  =COLUMN that mus
25680 74 20 62 65 20 74 72 65 65 20 28 69 6e 20 6f 74  t be tree (in ot
25690 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68  her words, if th
256a0 65 20 74 65 72 6d 73 20 74 6f 70 2d 6c 65 76 65  e terms top-leve
256b0 6c 0a 2a 2a 20 41 4e 44 2d 63 6f 6e 6e 65 63 74  l.** AND-connect
256c0 65 64 20 74 65 72 6d 73 20 74 68 61 74 20 61 72  ed terms that ar
256d0 65 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20  e not part of a 
256e0 4f 4e 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 61  ON clause from a
256f0 20 4c 45 46 54 20 4a 4f 49 4e 29 0a 2a 2a 20 74   LEFT JOIN).** t
25700 68 65 6e 20 74 68 72 6f 75 67 68 6f 75 74 20 74  hen throughout t
25710 68 65 20 71 75 65 72 79 20 72 65 70 6c 61 63 65  he query replace
25720 20 61 6c 6c 20 6f 74 68 65 72 20 6f 63 63 75 72   all other occur
25730 72 65 6e 63 65 73 20 6f 66 20 43 4f 4c 55 4d 4e  rences of COLUMN
25740 0a 2a 2a 20 77 69 74 68 20 43 4f 4e 53 54 41 4e  .** with CONSTAN
25750 54 20 77 69 74 68 69 6e 20 74 68 65 20 57 48 45  T within the WHE
25760 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  RE clause..**.**
25770 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   For example, th
25780 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  e query:.**.**  
25790 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
257a0 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45  M t1, t2, t3 WHE
257b0 52 45 20 74 31 2e 61 3d 33 39 20 41 4e 44 20 74  RE t1.a=39 AND t
257c0 32 2e 62 3d 74 31 2e 61 20 41 4e 44 20 74 33 2e  2.b=t1.a AND t3.
257d0 63 3d 74 32 2e 62 0a 2a 2a 0a 2a 2a 20 49 73 20  c=t2.b.**.** Is 
257e0 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  transformed into
257f0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 53 45 4c 45  .**.**      SELE
25800 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32  CT * FROM t1, t2
25810 2c 20 74 33 20 57 48 45 52 45 20 74 31 2e 61 3d  , t3 WHERE t1.a=
25820 33 39 20 41 4e 44 20 74 32 2e 62 3d 33 39 20 41  39 AND t2.b=39 A
25830 4e 44 20 74 33 2e 63 3d 33 39 0a 2a 2a 0a 2a 2a  ND t3.c=39.**.**
25840 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
25850 61 6e 79 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  any transformati
25860 6f 6e 73 20 77 68 65 72 65 20 6d 61 64 65 20 61  ons where made a
25870 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e  nd false if not.
25880 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  .**.** Implement
25890 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 43 6f 6e  ation note:  Con
258a0 73 74 61 6e 74 20 70 72 6f 70 61 67 61 74 69 6f  stant propagatio
258b0 6e 20 69 73 20 74 72 69 63 6b 79 20 64 75 65 20  n is tricky due 
258c0 74 6f 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 61  to affinity.** a
258d0 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  nd collating seq
258e0 75 65 6e 63 65 20 69 6e 74 65 72 61 63 74 69 6f  uence interactio
258f0 6e 73 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68  ns.  Consider th
25900 69 73 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  is example:.**.*
25910 2a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  *    CREATE TABL
25920 45 20 74 31 28 61 20 49 4e 54 2c 62 20 54 45 58  E t1(a INT,b TEX
25930 54 29 3b 0a 2a 2a 20 20 20 20 49 4e 53 45 52 54  T);.**    INSERT
25940 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
25950 31 32 33 2c 27 30 31 32 33 27 29 3b 0a 2a 2a 20  123,'0123');.** 
25960 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
25970 20 74 31 20 57 48 45 52 45 20 61 3d 31 32 33 20   t1 WHERE a=123 
25980 41 4e 44 20 62 3d 61 3b 0a 2a 2a 20 20 20 20 53  AND b=a;.**    S
25990 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
259a0 57 48 45 52 45 20 61 3d 31 32 33 20 41 4e 44 20  WHERE a=123 AND 
259b0 62 3d 31 32 33 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  b=123;.**.** The
259c0 20 74 77 6f 20 53 45 4c 45 43 54 20 73 74 61 74   two SELECT stat
259d0 65 6d 65 6e 74 73 20 61 62 6f 76 65 20 73 68 6f  ements above sho
259e0 75 6c 64 20 72 65 74 75 72 6e 20 64 69 66 66 65  uld return diffe
259f0 72 65 6e 74 20 61 6e 73 77 65 72 73 2e 20 20 62  rent answers.  b
25a00 3d 61 0a 2a 2a 20 69 73 20 61 6c 77 61 79 20 74  =a.** is alway t
25a10 72 75 65 20 62 65 63 61 75 73 65 20 74 68 65 20  rue because the 
25a20 63 6f 6d 70 61 72 69 73 6f 6e 20 75 73 65 73 20  comparison uses 
25a30 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
25a40 2c 20 62 75 74 20 62 3d 31 32 33 0a 2a 2a 20 69  , but b=123.** i
25a50 73 20 66 61 6c 73 65 20 62 65 63 61 75 73 65 20  s false because 
25a60 69 74 20 75 73 65 73 20 74 65 78 74 20 61 66 66  it uses text aff
25a70 69 6e 69 74 79 20 61 6e 64 20 27 30 31 32 33 27  inity and '0123'
25a80 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61 6d 65   is not the same
25a90 20 61 73 20 27 31 32 33 27 2e 0a 2a 2a 20 54 6f   as '123'..** To
25aa0 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
25ab0 73 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  s, the expressio
25ac0 6e 20 74 72 65 65 20 69 73 20 6e 6f 74 20 61 63  n tree is not ac
25ad0 74 75 61 6c 6c 79 20 63 68 61 6e 67 65 64 20 66  tually changed f
25ae0 72 6f 6d 0a 2a 2a 20 22 62 3d 61 22 20 74 6f 20  rom.** "b=a" to 
25af0 22 62 3d 31 32 33 22 20 62 75 74 20 72 61 74 68  "b=123" but rath
25b00 65 72 20 74 68 65 20 22 61 22 20 69 6e 20 22 62  er the "a" in "b
25b10 3d 61 22 20 69 73 20 74 61 67 67 65 64 20 77 69  =a" is tagged wi
25b20 74 68 20 45 50 5f 46 69 78 65 64 43 6f 6c 0a 2a  th EP_FixedCol.*
25b30 2a 20 61 6e 64 20 74 68 65 20 22 31 32 33 22 20  * and the "123" 
25b40 76 61 6c 75 65 20 69 73 20 68 75 6e 67 20 6f 66  value is hung of
25b50 66 20 6f 66 20 74 68 65 20 70 4c 65 66 74 20 70  f of the pLeft p
25b60 6f 69 6e 74 65 72 2e 20 20 43 6f 64 65 20 67 65  ointer.  Code ge
25b70 6e 65 72 61 74 6f 72 0a 2a 2a 20 72 6f 75 74 69  nerator.** routi
25b80 6e 65 73 20 6b 6e 6f 77 20 74 6f 20 67 65 6e 65  nes know to gene
25b90 72 61 74 65 20 74 68 65 20 63 6f 6e 73 74 61 6e  rate the constan
25ba0 74 20 22 31 32 33 22 20 69 6e 73 74 65 61 64 20  t "123" instead 
25bb0 6f 66 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68  of looking up th
25bc0 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  e.** column valu
25bd0 65 2e 20 20 41 6c 73 6f 2c 20 74 6f 20 61 76 6f  e.  Also, to avo
25be0 69 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 70 72 6f  id collation pro
25bf0 62 6c 65 6d 73 2c 20 74 68 69 73 20 6f 70 74 69  blems, this opti
25c00 6d 69 7a 61 74 69 6f 6e 20 69 73 0a 2a 2a 20 6f  mization is.** o
25c10 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66  nly attempted if
25c20 20 74 68 65 20 22 61 3d 31 32 33 22 20 74 65 72   the "a=123" ter
25c30 6d 20 75 73 65 73 20 74 68 65 20 64 65 66 61 75  m uses the defau
25c40 6c 74 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74  lt BINARY collat
25c50 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
25c60 6e 74 20 70 72 6f 70 61 67 61 74 65 43 6f 6e 73  nt propagateCons
25c70 74 61 6e 74 73 28 0a 20 20 50 61 72 73 65 20 2a  tants(.  Parse *
25c80 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 54 68 65  pParse,   /* The
25c90 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
25ca0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 20   */.  Select *p 
25cb0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71 75         /* The qu
25cc0 65 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ery in which to 
25cd0 70 72 6f 70 61 67 61 74 65 20 63 6f 6e 73 74 61  propagate consta
25ce0 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  nts */.){.  Wher
25cf0 65 43 6f 6e 73 74 20 78 3b 0a 20 20 57 61 6c 6b  eConst x;.  Walk
25d00 65 72 20 77 3b 0a 20 20 69 6e 74 20 6e 43 68 6e  er w;.  int nChn
25d10 67 20 3d 20 30 3b 0a 20 20 78 2e 70 50 61 72 73  g = 0;.  x.pPars
25d20 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 64 6f  e = pParse;.  do
25d30 7b 0a 20 20 20 20 78 2e 6e 43 6f 6e 73 74 20 3d  {.    x.nConst =
25d40 20 30 3b 0a 20 20 20 20 78 2e 6e 43 68 6e 67 20   0;.    x.nChng 
25d50 3d 20 30 3b 0a 20 20 20 20 78 2e 61 70 45 78 70  = 0;.    x.apExp
25d60 72 20 3d 20 30 3b 0a 20 20 20 20 66 69 6e 64 43  r = 0;.    findC
25d70 6f 6e 73 74 49 6e 57 68 65 72 65 28 26 78 2c 20  onstInWhere(&x, 
25d80 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
25d90 69 66 28 20 78 2e 6e 43 6f 6e 73 74 20 29 7b 0a  if( x.nConst ){.
25da0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 77 2c        memset(&w,
25db0 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a   0, sizeof(w));.
25dc0 20 20 20 20 20 20 77 2e 70 50 61 72 73 65 20 3d        w.pParse =
25dd0 20 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 77   pParse;.      w
25de0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
25df0 20 70 72 6f 70 61 67 61 74 65 43 6f 6e 73 74 61   propagateConsta
25e00 6e 74 45 78 70 72 52 65 77 72 69 74 65 3b 0a 20  ntExprRewrite;. 
25e10 20 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61       w.xSelectCa
25e20 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  llback = sqlite3
25e30 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b 0a  SelectWalkNoop;.
25e40 20 20 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43        w.xSelectC
25e50 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20  allback2 = 0;.  
25e60 20 20 20 20 77 2e 77 61 6c 6b 65 72 44 65 70 74      w.walkerDept
25e70 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 2e 75  h = 0;.      w.u
25e80 2e 70 43 6f 6e 73 74 20 3d 20 26 78 3b 0a 20 20  .pConst = &x;.  
25e90 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45      sqlite3WalkE
25ea0 78 70 72 28 26 77 2c 20 70 2d 3e 70 57 68 65 72  xpr(&w, p->pWher
25eb0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
25ec0 33 44 62 46 72 65 65 28 78 2e 70 50 61 72 73 65  3DbFree(x.pParse
25ed0 2d 3e 64 62 2c 20 78 2e 61 70 45 78 70 72 29 3b  ->db, x.apExpr);
25ee0 0a 20 20 20 20 20 20 6e 43 68 6e 67 20 2b 3d 20  .      nChng += 
25ef0 78 2e 6e 43 68 6e 67 3b 0a 20 20 20 20 7d 0a 20  x.nChng;.    }. 
25f00 20 7d 77 68 69 6c 65 28 20 78 2e 6e 43 68 6e 67   }while( x.nChng
25f10 20 29 3b 20 20 0a 20 20 72 65 74 75 72 6e 20 6e   );  .  return n
25f20 43 68 6e 67 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  Chng;.}..#if !de
25f30 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
25f40 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
25f50 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
25f60 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20  MIT_VIEW)./*.** 
25f70 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 72  Make copies of r
25f80 65 6c 65 76 61 6e 74 20 57 48 45 52 45 20 63 6c  elevant WHERE cl
25f90 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 74 68  ause terms of th
25fa0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 6e  e outer query in
25fb0 74 6f 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20  to.** the WHERE 
25fc0 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65  clause of subque
25fd0 72 79 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a  ry.  Example:.**
25fe0 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
25ff0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41  FROM (SELECT a A
26000 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52  S x, c-d AS y FR
26010 4f 4d 20 74 31 29 20 57 48 45 52 45 20 78 3d 35  OM t1) WHERE x=5
26020 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a   AND y=10;.**.**
26030 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   Transformed int
26040 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  o:.**.**    SELE
26050 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT * FROM (SELEC
26060 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53  T a AS x, c-d AS
26070 20 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   y FROM t1 WHERE
26080 20 61 3d 35 20 41 4e 44 20 63 2d 64 3d 31 30 29   a=5 AND c-d=10)
26090 0a 2a 2a 20 20 20 20 20 57 48 45 52 45 20 78 3d  .**     WHERE x=
260a0 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a  5 AND y=10;.**.*
260b0 2a 20 54 68 65 20 68 6f 70 65 20 69 73 20 74 68  * The hope is th
260c0 61 74 20 74 68 65 20 74 65 72 6d 73 20 61 64 64  at the terms add
260d0 65 64 20 74 6f 20 74 68 65 20 69 6e 6e 65 72 20  ed to the inner 
260e0 71 75 65 72 79 20 77 69 6c 6c 20 6d 61 6b 65 20  query will make 
260f0 69 74 20 6d 6f 72 65 0a 2a 2a 20 65 66 66 69 63  it more.** effic
26100 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e  ient..**.** Do n
26110 6f 74 20 61 74 74 65 6d 70 74 20 74 68 69 73 20  ot attempt this 
26120 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 3a  optimization if:
26130 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 28 2a 2a  .**.**   (1) (**
26140 20 54 68 69 73 20 72 65 73 74 72 69 63 74 69 6f   This restrictio
26150 6e 20 77 61 73 20 72 65 6d 6f 76 65 64 20 6f 6e  n was removed on
26160 20 32 30 31 37 2d 30 39 2d 32 39 2e 20 20 57 65   2017-09-29.  We
26170 20 75 73 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20   used to.**     
26180 20 20 20 20 20 20 64 69 73 61 6c 6c 6f 77 20 74        disallow t
26190 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
261a0 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 73   for aggregate s
261b0 75 62 71 75 65 72 69 65 73 2c 20 62 75 74 20 6e  ubqueries, but n
261c0 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
261d0 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 20 62 79  it is allowed by
261e0 20 70 75 74 74 69 6e 67 20 74 68 65 20 65 78 74   putting the ext
261f0 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20  ra terms on the 
26200 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a  HAVING clause..*
26210 2a 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20  *           The 
26220 61 64 64 65 64 20 48 41 56 49 4e 47 20 63 6c 61  added HAVING cla
26230 75 73 65 20 69 73 20 70 6f 69 6e 74 6c 65 73 73  use is pointless
26240 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
26250 20 6c 61 63 6b 73 0a 2a 2a 20 20 20 20 20 20 20   lacks.**       
26260 20 20 20 20 61 20 47 52 4f 55 50 20 42 59 20 63      a GROUP BY c
26270 6c 61 75 73 65 2e 20 20 42 75 74 20 73 75 63 68  lause.  But such
26280 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65   a HAVING clause
26290 20 69 73 20 61 6c 73 6f 20 68 61 72 6d 6c 65 73   is also harmles
262a0 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 73  s.**           s
262b0 6f 20 74 68 65 72 65 20 64 6f 65 73 20 6e 6f 74  o there does not
262c0 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 61 6e   appear to be an
262d0 79 20 72 65 61 73 6f 6e 20 74 6f 20 61 64 64 20  y reason to add 
262e0 65 78 74 72 61 20 6c 6f 67 69 63 0a 2a 2a 20 20  extra logic.**  
262f0 20 20 20 20 20 20 20 20 20 74 6f 20 73 75 70 70           to supp
26300 72 65 73 73 20 69 74 2e 20 2a 2a 29 0a 2a 2a 0a  ress it. **).**.
26310 2a 2a 20 20 20 28 32 29 20 54 68 65 20 69 6e 6e  **   (2) The inn
26320 65 72 20 71 75 65 72 79 20 69 73 20 74 68 65 20  er query is the 
26330 72 65 63 75 72 73 69 76 65 20 70 61 72 74 20 6f  recursive part o
26340 66 20 61 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65  f a common table
26350 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
26360 2a 2a 20 20 20 28 33 29 20 54 68 65 20 69 6e 6e  **   (3) The inn
26370 65 72 20 71 75 65 72 79 20 68 61 73 20 61 20 4c  er query has a L
26380 49 4d 49 54 20 63 6c 61 75 73 65 20 28 73 69 6e  IMIT clause (sin
26390 63 65 20 74 68 65 20 63 68 61 6e 67 65 73 20 74  ce the changes t
263a0 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 20  o the WHERE.**  
263b0 20 20 20 20 20 63 6c 61 75 73 65 20 77 6f 75 6c       clause woul
263c0 64 20 63 68 61 6e 67 65 20 74 68 65 20 6d 65 61  d change the mea
263d0 6e 69 6e 67 20 6f 66 20 74 68 65 20 4c 49 4d 49  ning of the LIMI
263e0 54 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20  T)..**.**   (4) 
263f0 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  The inner query 
26400 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  is the right ope
26410 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a  rand of a LEFT J
26420 4f 49 4e 20 61 6e 64 20 74 68 65 0a 2a 2a 20 20  OIN and the.**  
26430 20 20 20 20 20 65 78 70 72 65 73 73 69 6f 6e 20       expression 
26440 74 6f 20 62 65 20 70 75 73 68 65 64 20 64 6f 77  to be pushed dow
26450 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20  n does not come 
26460 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75  from the ON clau
26470 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f 6e 20 74  se.**       on t
26480 68 61 74 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 2a  hat LEFT JOIN..*
26490 2a 0a 2a 2a 20 20 20 28 35 29 20 54 68 65 20 57  *.**   (5) The W
264a0 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72  HERE clause expr
264b0 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65  ession originate
264c0 73 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  s in the ON or U
264d0 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20 20  SING clause.**  
264e0 20 20 20 20 20 6f 66 20 61 20 4c 45 46 54 20 4a       of a LEFT J
264f0 4f 49 4e 20 77 68 65 72 65 20 69 43 75 72 73 6f  OIN where iCurso
26500 72 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67  r is not the rig
26510 68 74 2d 68 61 6e 64 20 74 61 62 6c 65 20 6f 66  ht-hand table of
26520 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 6c   that.**       l
26530 65 66 74 20 6a 6f 69 6e 2e 20 20 41 6e 20 65 78  eft join.  An ex
26540 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
26550 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 0a         SELECT *.
26560 2a 2a 20 20 20 20 20 20 20 20 20 20 20 46 52 4f  **           FRO
26570 4d 20 28 53 45 4c 45 43 54 20 31 20 41 53 20 61  M (SELECT 1 AS a
26580 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  1 UNION ALL SELE
26590 43 54 20 32 29 20 41 53 20 61 61 0a 2a 2a 20 20  CT 2) AS aa.**  
265a0 20 20 20 20 20 20 20 20 20 4a 4f 49 4e 20 28 53           JOIN (S
265b0 45 4c 45 43 54 20 31 20 41 53 20 62 32 20 55 4e  ELECT 1 AS b2 UN
265c0 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 32  ION ALL SELECT 2
265d0 29 20 41 53 20 62 62 20 4f 4e 20 28 61 31 3d 62  ) AS bb ON (a1=b
265e0 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  2).**           
265f0 4c 45 46 54 20 4a 4f 49 4e 20 28 53 45 4c 45 43  LEFT JOIN (SELEC
26600 54 20 38 20 41 53 20 63 33 20 55 4e 49 4f 4e 20  T 8 AS c3 UNION 
26610 41 4c 4c 20 53 45 4c 45 43 54 20 39 29 20 41 53  ALL SELECT 9) AS
26620 20 63 63 20 4f 4e 20 28 62 32 3d 32 29 3b 0a 2a   cc ON (b2=2);.*
26630 2a 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20 63  *.**       The c
26640 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 69 73  orrect answer is
26650 20 74 68 72 65 65 20 72 6f 77 73 3a 20 20 28 31   three rows:  (1
26660 2c 31 2c 4e 55 4c 4c 29 2c 28 32 2c 32 2c 38 29  ,1,NULL),(2,2,8)
26670 2c 28 32 2c 32 2c 39 29 2e 0a 2a 2a 20 20 20 20  ,(2,2,9)..**    
26680 20 20 20 42 75 74 20 69 66 20 74 68 65 20 28 62     But if the (b
26690 32 3d 32 29 20 74 65 72 6d 20 77 65 72 65 20 74  2=2) term were t
266a0 6f 20 62 65 20 70 75 73 68 65 64 20 64 6f 77 6e  o be pushed down
266b0 20 69 6e 74 6f 20 74 68 65 20 62 62 20 73 75 62   into the bb sub
266c0 71 75 65 72 79 2c 0a 2a 2a 20 20 20 20 20 20 20  query,.**       
266d0 74 68 65 6e 20 74 68 65 20 28 31 2c 31 2c 4e 55  then the (1,1,NU
266e0 4c 4c 29 20 72 6f 77 20 77 6f 75 6c 64 20 62 65  LL) row would be
266f0 20 73 75 70 70 72 65 73 73 65 64 2e 0a 2a 2a 0a   suppressed..**.
26700 2a 2a 20 20 20 28 36 29 20 54 68 65 20 69 6e 6e  **   (6) The inn
26710 65 72 20 71 75 65 72 79 20 66 65 61 74 75 72 65  er query feature
26720 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 77 69  s one or more wi
26730 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 73 20 28  ndow-functions (
26740 73 69 6e 63 65 20 0a 2a 2a 20 20 20 20 20 20 20  since .**       
26750 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 57  changes to the W
26760 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74  HERE clause of t
26770 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 63  he inner query c
26780 6f 75 6c 64 20 63 68 61 6e 67 65 20 74 68 65 20  ould change the 
26790 0a 2a 2a 20 20 20 20 20 20 20 77 69 6e 64 6f 77  .**       window
267a0 20 6f 76 65 72 20 77 68 69 63 68 20 77 69 6e 64   over which wind
267b0 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65  ow functions are
267c0 20 63 61 6c 63 75 6c 61 74 65 64 29 2e 0a 2a 2a   calculated)..**
267d0 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20  .** Return 0 if 
267e0 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  no changes are m
267f0 61 64 65 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f  ade and non-zero
26800 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   if one or more 
26810 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20  WHERE clause.** 
26820 74 65 72 6d 73 20 61 72 65 20 64 75 70 6c 69 63  terms are duplic
26830 61 74 65 64 20 69 6e 74 6f 20 74 68 65 20 73 75  ated into the su
26840 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  bquery..*/.stati
26850 63 20 69 6e 74 20 70 75 73 68 44 6f 77 6e 57 68  c int pushDownWh
26860 65 72 65 54 65 72 6d 73 28 0a 20 20 50 61 72 73  ereTerms(.  Pars
26870 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
26880 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
26890 78 74 20 28 66 6f 72 20 6d 61 6c 6c 6f 63 28 29  xt (for malloc()
268a0 20 61 6e 64 20 65 72 72 6f 72 20 72 65 70 6f 72   and error repor
268b0 74 69 6e 67 29 20 2a 2f 0a 20 20 53 65 6c 65 63  ting) */.  Selec
268c0 74 20 2a 70 53 75 62 71 2c 20 20 20 20 20 20 20  t *pSubq,       
268d0 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
268e0 20 77 68 6f 73 65 20 57 48 45 52 45 20 63 6c 61   whose WHERE cla
268f0 75 73 65 20 69 73 20 74 6f 20 62 65 20 61 75 67  use is to be aug
26900 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  mented */.  Expr
26910 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
26920 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
26930 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
26940 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  er query */.  in
26950 74 20 69 43 75 72 73 6f 72 2c 20 20 20 20 20 20  t iCursor,      
26960 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
26970 6d 62 65 72 20 6f 66 20 74 68 65 20 73 75 62 71  mber of the subq
26980 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73  uery */.  int is
26990 4c 65 66 74 4a 6f 69 6e 20 20 20 20 20 20 20 20  LeftJoin        
269a0 2f 2a 20 54 72 75 65 20 69 66 20 70 53 75 62 71  /* True if pSubq
269b0 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 65   is the right te
269c0 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  rm of a LEFT JOI
269d0 4e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  N */.){.  Expr *
269e0 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 43 68 6e  pNew;.  int nChn
269f0 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 57 68  g = 0;.  if( pWh
26a00 65 72 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ere==0 ) return 
26a10 30 3b 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e  0;.  if( pSubq->
26a20 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
26a30 63 75 72 73 69 76 65 20 29 20 72 65 74 75 72 6e  cursive ) return
26a40 20 30 3b 20 20 2f 2a 20 72 65 73 74 72 69 63 74   0;  /* restrict
26a50 69 6f 6e 20 28 32 29 20 2a 2f 0a 0a 23 69 66 6e  ion (2) */..#ifn
26a60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
26a70 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 69 66 28  WINDOWFUNC.  if(
26a80 20 70 53 75 62 71 2d 3e 70 57 69 6e 20 29 20 72   pSubq->pWin ) r
26a90 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 72  eturn 0;    /* r
26aa0 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20 2a  estriction (6) *
26ab0 2f 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  /.#endif..#ifdef
26ac0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
26ad0 2f 2a 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73  /* Only the firs
26ae0 74 20 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70  t term of a comp
26af0 6f 75 6e 64 20 63 61 6e 20 68 61 76 65 20 61 20  ound can have a 
26b00 57 49 54 48 20 63 6c 61 75 73 65 2e 20 20 42 75  WITH clause.  Bu
26b10 74 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65  t make.  ** sure
26b20 20 6e 6f 20 6f 74 68 65 72 20 74 65 72 6d 73 20   no other terms 
26b30 61 72 65 20 6d 61 72 6b 65 64 20 53 46 5f 52 65  are marked SF_Re
26b40 63 75 72 73 69 76 65 20 69 6e 20 63 61 73 65 20  cursive in case 
26b50 73 6f 6d 65 74 68 69 6e 67 20 63 68 61 6e 67 65  something change
26b60 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66 75  s.  ** in the fu
26b70 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20  ture..  */.  {. 
26b80 20 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 20 20     Select *pX;  
26b90 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 75 62  .    for(pX=pSub
26ba0 71 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 50  q; pX; pX=pX->pP
26bb0 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 61 73 73  rior){.      ass
26bc0 65 72 74 28 20 28 70 58 2d 3e 73 65 6c 46 6c 61  ert( (pX->selFla
26bd0 67 73 20 26 20 28 53 46 5f 52 65 63 75 72 73 69  gs & (SF_Recursi
26be0 76 65 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  ve))==0 );.    }
26bf0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
26c00 66 28 20 70 53 75 62 71 2d 3e 70 4c 69 6d 69 74  f( pSubq->pLimit
26c10 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
26c20 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74  n 0; /* restrict
26c30 69 6f 6e 20 28 33 29 20 2a 2f 0a 20 20 7d 0a 20  ion (3) */.  }. 
26c40 20 77 68 69 6c 65 28 20 70 57 68 65 72 65 2d 3e   while( pWhere->
26c50 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20  op==TK_AND ){.  
26c60 20 20 6e 43 68 6e 67 20 2b 3d 20 70 75 73 68 44    nChng += pushD
26c70 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 70 50  ownWhereTerms(pP
26c80 61 72 73 65 2c 20 70 53 75 62 71 2c 20 70 57 68  arse, pSubq, pWh
26c90 65 72 65 2d 3e 70 52 69 67 68 74 2c 0a 20 20 20  ere->pRight,.   
26ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43 75               iCu
26cc0 72 73 6f 72 2c 20 69 73 4c 65 66 74 4a 6f 69 6e  rsor, isLeftJoin
26cd0 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  );.    pWhere = 
26ce0 70 57 68 65 72 65 2d 3e 70 4c 65 66 74 3b 0a 20  pWhere->pLeft;. 
26cf0 20 7d 0a 20 20 69 66 28 20 69 73 4c 65 66 74 4a   }.  if( isLeftJ
26d00 6f 69 6e 0a 20 20 20 26 26 20 28 45 78 70 72 48  oin.   && (ExprH
26d10 61 73 50 72 6f 70 65 72 74 79 28 70 57 68 65 72  asProperty(pWher
26d20 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3d 3d  e,EP_FromJoin)==
26d30 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57  0.         || pW
26d40 68 65 72 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  here->iRightJoin
26d50 54 61 62 6c 65 21 3d 69 43 75 72 73 6f 72 29 0a  Table!=iCursor).
26d60 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
26d70 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f  0; /* restrictio
26d80 6e 20 28 34 29 20 2a 2f 0a 20 20 7d 0a 20 20 69  n (4) */.  }.  i
26d90 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
26da0 74 79 28 70 57 68 65 72 65 2c 45 50 5f 46 72 6f  ty(pWhere,EP_Fro
26db0 6d 4a 6f 69 6e 29 20 26 26 20 70 57 68 65 72 65  mJoin) && pWhere
26dc0 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
26dd0 65 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  e!=iCursor ){.  
26de0 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72    return 0; /* r
26df0 65 73 74 72 69 63 74 69 6f 6e 20 28 35 29 20 2a  estriction (5) *
26e00 2f 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  /.  }.  if( sqli
26e10 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f  te3ExprIsTableCo
26e20 6e 73 74 61 6e 74 28 70 57 68 65 72 65 2c 20 69  nstant(pWhere, i
26e30 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 6e  Cursor) ){.    n
26e40 43 68 6e 67 2b 2b 3b 0a 20 20 20 20 77 68 69 6c  Chng++;.    whil
26e50 65 28 20 70 53 75 62 71 20 29 7b 0a 20 20 20 20  e( pSubq ){.    
26e60 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 78    SubstContext x
26e70 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  ;.      pNew = s
26e80 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
26e90 61 72 73 65 2d 3e 64 62 2c 20 70 57 68 65 72 65  arse->db, pWhere
26ea0 2c 20 30 29 3b 0a 20 20 20 20 20 20 75 6e 73 65  , 0);.      unse
26eb0 74 4a 6f 69 6e 45 78 70 72 28 70 4e 65 77 2c 20  tJoinExpr(pNew, 
26ec0 2d 31 29 3b 0a 20 20 20 20 20 20 78 2e 70 50 61  -1);.      x.pPa
26ed0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
26ee0 20 20 20 20 78 2e 69 54 61 62 6c 65 20 3d 20 69      x.iTable = i
26ef0 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e  Cursor;.      x.
26f00 69 4e 65 77 54 61 62 6c 65 20 3d 20 69 43 75 72  iNewTable = iCur
26f10 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69 73 4c  sor;.      x.isL
26f20 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 0a 20 20 20  eftJoin = 0;.   
26f30 20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20 70 53     x.pEList = pS
26f40 75 62 71 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ubq->pEList;.   
26f50 20 20 20 70 4e 65 77 20 3d 20 73 75 62 73 74 45     pNew = substE
26f60 78 70 72 28 26 78 2c 20 70 4e 65 77 29 3b 0a 20  xpr(&x, pNew);. 
26f70 20 20 20 20 20 69 66 28 20 70 53 75 62 71 2d 3e       if( pSubq->
26f80 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
26f90 67 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20 20  gregate ){.     
26fa0 20 20 20 70 53 75 62 71 2d 3e 70 48 61 76 69 6e     pSubq->pHavin
26fb0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  g = sqlite3ExprA
26fc0 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nd(pParse->db, p
26fd0 53 75 62 71 2d 3e 70 48 61 76 69 6e 67 2c 20 70  Subq->pHaving, p
26fe0 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  New);.      }els
26ff0 65 7b 0a 20 20 20 20 20 20 20 20 70 53 75 62 71  e{.        pSubq
27000 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
27010 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65  e3ExprAnd(pParse
27020 2d 3e 64 62 2c 20 70 53 75 62 71 2d 3e 70 57 68  ->db, pSubq->pWh
27030 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  ere, pNew);.    
27040 20 20 7d 0a 20 20 20 20 20 20 70 53 75 62 71 20    }.      pSubq 
27050 3d 20 70 53 75 62 71 2d 3e 70 50 72 69 6f 72 3b  = pSubq->pPrior;
27060 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
27070 75 72 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 23 65 6e  urn nChng;.}.#en
27080 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
27090 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
270a0 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
270b0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
270c0 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  EW) */../*.** Th
270d0 65 20 70 46 75 6e 63 20 69 73 20 74 68 65 20 6f  e pFunc is the o
270e0 6e 6c 79 20 61 67 67 72 65 67 61 74 65 20 66 75  nly aggregate fu
270f0 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 71 75  nction in the qu
27100 65 72 79 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  ery.  Check to s
27110 65 65 0a 2a 2a 20 69 66 20 74 68 65 20 71 75 65  ee.** if the que
27120 72 79 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  ry is a candidat
27130 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d 61  e for the min/ma
27140 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  x optimization. 
27150 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 71 75  .**.** If the qu
27160 65 72 79 20 69 73 20 61 20 63 61 6e 64 69 64 61  ery is a candida
27170 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d  te for the min/m
27180 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  ax optimization,
27190 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20 2a 70 70   then set.** *pp
271a0 4d 69 6e 4d 61 78 20 74 6f 20 62 65 20 61 6e 20  MinMax to be an 
271b0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
271c0 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 74  to be used for t
271d0 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  he optimization.
271e0 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 65 69  ** and return ei
271f0 74 68 65 72 20 57 48 45 52 45 5f 4f 52 44 45 52  ther WHERE_ORDER
27200 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f  BY_MIN or WHERE_
27210 4f 52 44 45 52 42 59 5f 4d 41 58 20 64 65 70 65  ORDERBY_MAX depe
27220 6e 64 69 6e 67 20 6f 6e 0a 2a 2a 20 77 68 65 74  nding on.** whet
27230 68 65 72 20 70 46 75 6e 63 20 69 73 20 61 20 6d  her pFunc is a m
27240 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75  in() or max() fu
27250 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
27260 20 74 68 65 20 71 75 65 72 79 20 69 73 20 6e 6f   the query is no
27270 74 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  t a candidate fo
27280 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70  r the min/max op
27290 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 72 65 74 75  timization, retu
272a0 72 6e 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45  rn.** WHERE_ORDE
272b0 52 42 59 5f 4e 4f 52 4d 41 4c 20 28 77 68 69 63  RBY_NORMAL (whic
272c0 68 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 29 2e  h must be zero).
272d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
272e0 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c  ine must be call
272f0 65 64 20 61 66 74 65 72 20 61 67 67 72 65 67 61  ed after aggrega
27300 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 68 61 76  te functions hav
27310 65 20 62 65 65 6e 0a 2a 2a 20 6c 6f 63 61 74 65  e been.** locate
27320 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 65  d but before the
27330 69 72 20 61 72 67 75 6d 65 6e 74 73 20 68 61 76  ir arguments hav
27340 65 20 62 65 65 6e 20 73 75 62 6a 65 63 74 65 64  e been subjected
27350 20 74 6f 20 61 67 67 72 65 67 61 74 65 0a 2a 2a   to aggregate.**
27360 20 61 6e 61 6c 79 73 69 73 2e 0a 2a 2f 0a 73 74   analysis..*/.st
27370 61 74 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75  atic u8 minMaxQu
27380 65 72 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ery(sqlite3 *db,
27390 20 45 78 70 72 20 2a 70 46 75 6e 63 2c 20 45 78   Expr *pFunc, Ex
273a0 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e 4d 61  prList **ppMinMa
273b0 78 29 7b 0a 20 20 69 6e 74 20 65 52 65 74 20 3d  x){.  int eRet =
273c0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
273d0 4f 52 4d 41 4c 3b 20 20 20 20 20 20 2f 2a 20 52  ORMAL;      /* R
273e0 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  eturn value */. 
273f0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
27400 74 20 3d 20 70 46 75 6e 63 2d 3e 78 2e 70 4c 69  t = pFunc->x.pLi
27410 73 74 3b 20 20 20 20 2f 2a 20 41 72 67 75 6d 65  st;    /* Argume
27420 6e 74 73 20 74 6f 20 61 67 67 20 66 75 6e 63 74  nts to agg funct
27430 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
27440 68 61 72 20 2a 7a 46 75 6e 63 3b 20 20 20 20 20  har *zFunc;     
27450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27460 2a 20 4e 61 6d 65 20 6f 66 20 61 67 67 72 65 67  * Name of aggreg
27470 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 70 46 75  ate function pFu
27480 6e 63 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  nc */.  ExprList
27490 20 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20 75 38   *pOrderBy;.  u8
274a0 20 73 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20 61   sortOrder;..  a
274b0 73 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78  ssert( *ppMinMax
274c0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
274d0 20 70 46 75 6e 63 2d 3e 6f 70 3d 3d 54 4b 5f 41   pFunc->op==TK_A
274e0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
274f0 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 7c   if( pEList==0 |
27500 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  | pEList->nExpr!
27510 3d 31 20 29 20 72 65 74 75 72 6e 20 65 52 65 74  =1 ) return eRet
27520 3b 0a 20 20 7a 46 75 6e 63 20 3d 20 70 46 75 6e  ;.  zFunc = pFun
27530 63 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 69  c->u.zToken;.  i
27540 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
27550 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29 3d  p(zFunc, "min")=
27560 3d 30 20 29 7b 0a 20 20 20 20 65 52 65 74 20 3d  =0 ){.    eRet =
27570 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
27580 49 4e 3b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65  IN;.    sortOrde
27590 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53  r = SQLITE_SO_AS
275a0 43 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  C;.  }else if( s
275b0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46  qlite3StrICmp(zF
275c0 75 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29  unc, "max")==0 )
275d0 7b 0a 20 20 20 20 65 52 65 74 20 3d 20 57 48 45  {.    eRet = WHE
275e0 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a  RE_ORDERBY_MAX;.
275f0 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20      sortOrder = 
27600 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3b 0a  SQLITE_SO_DESC;.
27610 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
27620 75 72 6e 20 65 52 65 74 3b 0a 20 20 7d 0a 20 20  urn eRet;.  }.  
27630 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 4f 72 64  *ppMinMax = pOrd
27640 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
27650 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 45  prListDup(db, pE
27660 4c 69 73 74 2c 20 30 29 3b 0a 20 20 61 73 73 65  List, 0);.  asse
27670 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20  rt( pOrderBy!=0 
27680 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
27690 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4f 72  led );.  if( pOr
276a0 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42 79  derBy ) pOrderBy
276b0 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
276c0 20 3d 20 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20   = sortOrder;.  
276d0 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a  return eRet;.}..
276e0 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74  /*.** The select
276f0 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
27700 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
27710 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 67  rgument is an ag
27720 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a  gregate query..*
27730 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  * The second arg
27740 75 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73 73  ument is the ass
27750 6f 63 69 61 74 65 64 20 61 67 67 72 65 67 61 74  ociated aggregat
27760 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54  e-info object. T
27770 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
27780 20 74 65 73 74 73 20 69 66 20 74 68 65 20 53 45   tests if the SE
27790 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 66  LECT is of the f
277a0 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  orm:.**.**   SEL
277b0 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
277c0 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68  M <tbl>.**.** wh
277d0 65 72 65 20 74 61 62 6c 65 20 69 73 20 61 20 64  ere table is a d
277e0 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20 6e  atabase table, n
277f0 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20  ot a sub-select 
27800 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68 65 20  or view. If the 
27810 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61  query.** does ma
27820 74 63 68 20 74 68 69 73 20 70 61 74 74 65 72 6e  tch this pattern
27830 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72  , then a pointer
27840 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62   to the Table ob
27850 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e  ject representin
27860 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65  g.** <tbl> is re
27870 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
27880 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  e, 0 is returned
27890 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62 6c  ..*/.static Tabl
278a0 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74  e *isSimpleCount
278b0 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67 49  (Select *p, AggI
278c0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
278d0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
278e0 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20   Expr *pExpr;.. 
278f0 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47 72   assert( !p->pGr
27900 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28 20  oupBy );..  if( 
27910 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e  p->pWhere || p->
27920 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  pEList->nExpr!=1
27930 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d   .   || p->pSrc-
27940 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70  >nSrc!=1 || p->p
27950 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
27960 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  t.  ){.    retur
27970 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20  n 0;.  }.  pTab 
27980 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
27990 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d 20  pTab;.  pExpr = 
279a0 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
279b0 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28  pExpr;.  assert(
279c0 20 70 54 61 62 20 26 26 20 21 70 54 61 62 2d 3e   pTab && !pTab->
279d0 70 53 65 6c 65 63 74 20 26 26 20 70 45 78 70 72  pSelect && pExpr
279e0 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69 72   );..  if( IsVir
279f0 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74  tual(pTab) ) ret
27a00 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78  urn 0;.  if( pEx
27a10 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46  pr->op!=TK_AGG_F
27a20 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e  UNCTION ) return
27a30 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   0;.  if( NEVER(
27a40 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d  pAggInfo->nFunc=
27a50 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  =0) ) return 0;.
27a60 20 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f 2d    if( (pAggInfo-
27a70 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d  >aFunc[0].pFunc-
27a80 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c 49 54  >funcFlags&SQLIT
27a90 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30  E_FUNC_COUNT)==0
27aa0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
27ab0 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26  f( pExpr->flags&
27ac0 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65  EP_Distinct ) re
27ad0 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72  turn 0;..  retur
27ae0 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
27af0 20 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c   If the source-l
27b00 69 73 74 20 69 74 65 6d 20 70 61 73 73 65 64 20  ist item passed 
27b10 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 77  as an argument w
27b20 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74  as augmented wit
27b30 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20  h an.** INDEXED 
27b40 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
27b50 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  try to locate th
27b60 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 64 65  e specified inde
27b70 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 77  x. If there.** w
27b80 61 73 20 73 75 63 68 20 61 20 63 6c 61 75 73 65  as such a clause
27b90 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20 69   and the named i
27ba0 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20 66  ndex cannot be f
27bb0 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  ound, return .**
27bc0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e   SQLITE_ERROR an
27bd0 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  d leave an error
27be0 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68 65   in pParse. Othe
27bf0 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65 20  rwise, populate 
27c00 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65  .** pFrom->pInde
27c10 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  x and return SQL
27c20 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
27c30 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c  qlite3IndexedByL
27c40 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50 61  ookup(Parse *pPa
27c50 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c  rse, struct SrcL
27c60 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29  ist_item *pFrom)
27c70 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70  {.  if( pFrom->p
27c80 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 66 67  Tab && pFrom->fg
27c90 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 7b 0a  .isIndexedBy ){.
27ca0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
27cb0 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
27cc0 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 65     char *zIndexe
27cd0 64 42 79 20 3d 20 70 46 72 6f 6d 2d 3e 75 31 2e  dBy = pFrom->u1.
27ce0 7a 49 6e 64 65 78 65 64 42 79 3b 0a 20 20 20 20  zIndexedBy;.    
27cf0 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
27d00 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
27d10 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20 20  pIndex; .       
27d20 20 70 49 64 78 20 26 26 20 73 71 6c 69 74 65 33   pIdx && sqlite3
27d30 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e  StrICmp(pIdx->zN
27d40 61 6d 65 2c 20 7a 49 6e 64 65 78 65 64 42 79 29  ame, zIndexedBy)
27d50 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 3d  ; .        pIdx=
27d60 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20  pIdx->pNext.    
27d70 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64 78  );.    if( !pIdx
27d80 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
27d90 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
27da0 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78  , "no such index
27db0 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 65 64 42  : %s", zIndexedB
27dc0 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  y, 0);.      pPa
27dd0 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
27de0 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   = 1;.      retu
27df0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
27e00 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d  .    }.    pFrom
27e10 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20 70 49 64  ->pIBIndex = pId
27e20 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  x;.  }.  return 
27e30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a  SQLITE_OK;.}./*.
27e40 2a 2a 20 44 65 74 65 63 74 20 63 6f 6d 70 6f 75  ** Detect compou
27e50 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nd SELECT statem
27e60 65 6e 74 73 20 74 68 61 74 20 75 73 65 20 61 6e  ents that use an
27e70 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
27e80 20 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74   with .** an alt
27e90 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69  ernative collati
27ea0 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a  ng sequence..**.
27eb0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e  **    SELECT ...
27ec0 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20   FROM t1 EXCEPT 
27ed0 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
27ee0 74 32 20 4f 52 44 45 52 20 42 59 20 2e 2e 20 43  t2 ORDER BY .. C
27ef0 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a  OLLATE ....**.**
27f00 20 54 68 65 73 65 20 61 72 65 20 72 65 77 72 69   These are rewri
27f10 74 74 65 6e 20 61 73 20 61 20 73 75 62 71 75 65  tten as a subque
27f20 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  ry:.**.**    SEL
27f30 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45  ECT * FROM (SELE
27f40 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45  CT ... FROM t1 E
27f50 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e  XCEPT SELECT ...
27f60 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20   FROM t2).**    
27f70 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f   ORDER BY ... CO
27f80 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  LLATE ....**.** 
27f90 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74  This transformat
27fa0 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79  ion is necessary
27fb0 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 75 6c   because the mul
27fc0 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
27fd0 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f  ) routine.** abo
27fe0 76 65 20 74 68 61 74 20 67 65 6e 65 72 61 74 65  ve that generate
27ff0 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61  s the code for a
28000 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
28010 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42   with an ORDER B
28020 59 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73  Y clause.** uses
28030 20 61 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74   a merge algorit
28040 68 6d 20 74 68 61 74 20 72 65 71 75 69 72 65 73  hm that requires
28050 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74   the same collat
28060 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 6e 20  ing sequence on 
28070 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f  the.** result co
28080 6c 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68 65 20  lumns as on the 
28090 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
280a0 20 20 53 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20    See ticket.** 
280b0 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74  http://www.sqlit
280c0 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36  e.org/src/info/6
280d0 37 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20  709574d2a.**.** 
280e0 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74  This transformat
280f0 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64  ion is only need
28100 65 64 20 66 6f 72 20 45 58 43 45 50 54 2c 20 49  ed for EXCEPT, I
28110 4e 54 45 52 53 45 43 54 2c 20 61 6e 64 20 55 4e  NTERSECT, and UN
28120 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f  ION..** The UNIO
28130 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77  N ALL operator w
28140 6f 72 6b 73 20 66 69 6e 65 20 77 69 74 68 20 6d  orks fine with m
28150 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
28160 79 28 29 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a  y() even when.**
28170 20 74 68 65 72 65 20 61 72 65 20 43 4f 4c 4c 41   there are COLLA
28180 54 45 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  TE terms in the 
28190 4f 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61  ORDER BY..*/.sta
281a0 74 69 63 20 69 6e 74 20 63 6f 6e 76 65 72 74 43  tic int convertC
281b0 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53  ompoundSelectToS
281c0 75 62 71 75 65 72 79 28 57 61 6c 6b 65 72 20 2a  ubquery(Walker *
281d0 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
281e0 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
281f0 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
28200 53 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20 73 71  Select *pX;.  sq
28210 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74 72  lite3 *db;.  str
28220 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
28230 6d 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73 74 20  m *a;.  SrcList 
28240 2a 70 4e 65 77 53 72 63 3b 0a 20 20 50 61 72 73  *pNewSrc;.  Pars
28250 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b  e *pParse;.  Tok
28260 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28  en dummy;..  if(
28270 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20   p->pPrior==0 ) 
28280 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
28290 6e 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f  nue;.  if( p->pO
282a0 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75  rderBy==0 ) retu
282b0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
282c0 0a 20 20 66 6f 72 28 70 58 3d 70 3b 20 70 58 20  .  for(pX=p; pX 
282d0 26 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41  && (pX->op==TK_A
282e0 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  LL || pX->op==TK
282f0 5f 53 45 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d  _SELECT); pX=pX-
28300 3e 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28  >pPrior){}.  if(
28310 20 70 58 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   pX==0 ) return 
28320 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
28330 61 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  a = p->pOrderBy-
28340 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70  >a;.  for(i=p->p
28350 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31  OrderBy->nExpr-1
28360 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
28370 20 20 69 66 28 20 61 5b 69 5d 2e 70 45 78 70 72    if( a[i].pExpr
28380 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
28390 6c 61 74 65 20 29 20 62 72 65 61 6b 3b 0a 20 20  late ) break;.  
283a0 7d 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65  }.  if( i<0 ) re
283b0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
283c0 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72  e;..  /* If we r
283d0 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
283e0 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   that means the 
283f0 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
28400 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a  s required. */..
28410 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b    pParse = pWalk
28420 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62  er->pParse;.  db
28430 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
28440 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
28450 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
28460 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
28470 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
28480 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
28490 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d  t;.  memset(&dum
284a0 6d 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75  my, 0, sizeof(du
284b0 6d 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53 72 63  mmy));.  pNewSrc
284c0 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
284d0 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28  tAppendFromTerm(
284e0 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75  pParse,0,0,0,&du
284f0 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20  mmy,pNew,0,0);. 
28500 20 69 66 28 20 70 4e 65 77 53 72 63 3d 3d 30 20   if( pNewSrc==0 
28510 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
28520 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70  rt;.  *pNew = *p
28530 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e  ;.  p->pSrc = pN
28540 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69  ewSrc;.  p->pELi
28550 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
28560 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
28570 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70  e, 0, sqlite3Exp
28580 72 28 64 62 2c 20 54 4b 5f 41 53 54 45 52 49 53  r(db, TK_ASTERIS
28590 4b 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20  K, 0));.  p->op 
285a0 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70  = TK_SELECT;.  p
285b0 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20  ->pWhere = 0;.  
285c0 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d  pNew->pGroupBy =
285d0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76   0;.  pNew->pHav
285e0 69 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ing = 0;.  pNew-
285f0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
28600 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
28610 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a    p->pNext = 0;.
28620 20 20 70 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a    p->pWith = 0;.
28630 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
28640 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20   ~SF_Compound;. 
28650 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c   assert( (p->sel
28660 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76 65  Flags & SF_Conve
28670 72 74 65 64 29 3d 3d 30 20 29 3b 0a 20 20 70 2d  rted)==0 );.  p-
28680 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
28690 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 61 73 73  Converted;.  ass
286a0 65 72 74 28 20 70 4e 65 77 2d 3e 70 50 72 69 6f  ert( pNew->pPrio
286b0 72 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e  r!=0 );.  pNew->
286c0 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
286d0 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  pNew;.  pNew->pL
286e0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  imit = 0;.  retu
286f0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
28700 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
28710 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 46 52  to see if the FR
28720 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70  OM clause term p
28730 46 72 6f 6d 20 68 61 73 20 74 61 62 6c 65 2d 76  From has table-v
28740 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 0a 2a  alued function.*
28750 2a 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 49 66  * arguments.  If
28760 20 69 74 20 64 6f 65 73 2c 20 6c 65 61 76 65 20   it does, leave 
28770 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
28780 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
28790 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
287a0 6f 2c 20 73 69 6e 63 65 20 70 46 72 6f 6d 20 69  o, since pFrom i
287b0 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f  s not allowed to
287c0 20 62 65 20 61 20 74 61 62 6c 65 2d 76 61 6c 75   be a table-valu
287d0 65 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ed function..*/.
287e0 73 74 61 74 69 63 20 69 6e 74 20 63 61 6e 6e 6f  static int canno
287f0 74 42 65 46 75 6e 63 74 69 6f 6e 28 50 61 72 73  tBeFunction(Pars
28800 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63  e *pParse, struc
28810 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
28820 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46  pFrom){.  if( pF
28830 72 6f 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  rom->fg.isTabFun
28840 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  c ){.    sqlite3
28850 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
28860 20 22 27 25 73 27 20 69 73 20 6e 6f 74 20 61 20   "'%s' is not a 
28870 66 75 6e 63 74 69 6f 6e 22 2c 20 70 46 72 6f 6d  function", pFrom
28880 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
28890 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
288a0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64  turn 0;.}..#ifnd
288b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
288c0 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  TE./*.** Argumen
288d0 74 20 70 57 69 74 68 20 28 77 68 69 63 68 20 6d  t pWith (which m
288e0 61 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e  ay be NULL) poin
288f0 74 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c  ts to a linked l
28900 69 73 74 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a  ist of nested .*
28910 2a 20 57 49 54 48 20 63 6f 6e 74 65 78 74 73 2c  * WITH contexts,
28920 20 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f   from inner to o
28930 75 74 65 72 6d 6f 73 74 2e 20 49 66 20 74 68 65  utermost. If the
28940 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65   table identifie
28950 64 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c  d by .** FROM cl
28960 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 70 49 74  ause element pIt
28970 65 6d 20 69 73 20 72 65 61 6c 6c 79 20 61 20 63  em is really a c
28980 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72  ommon-table-expr
28990 65 73 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a  ession (CTE) .**
289a0 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70   then return a p
289b0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 43 54  ointer to the CT
289c0 45 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72  E definition for
289d0 20 74 68 61 74 20 74 61 62 6c 65 2e 20 4f 74 68   that table. Oth
289e0 65 72 77 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e  erwise.** return
289f0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
28a00 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65  a non-NULL value
28a10 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 73 65   is returned, se
28a20 74 20 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f 20  t *ppContext to 
28a30 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 57 69 74  point to the Wit
28a40 68 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74  h.** object that
28a50 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 43 54   the returned CT
28a60 45 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f  E belongs to..*/
28a70 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 43  .static struct C
28a80 74 65 20 2a 73 65 61 72 63 68 57 69 74 68 28 0a  te *searchWith(.
28a90 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20    With *pWith,  
28aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ab0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 6e    /* Current inn
28ac0 65 72 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75  ermost WITH clau
28ad0 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
28ae0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
28af0 65 6d 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  em,     /* FROM 
28b00 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 74  clause element t
28b10 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57  o resolve */.  W
28b20 69 74 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20  ith **ppContext 
28b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28b40 2a 20 4f 55 54 3a 20 57 49 54 48 20 63 6c 61 75  * OUT: WITH clau
28b50 73 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  se return value 
28b60 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b  belongs to */.){
28b70 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
28b80 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 49 74 65  Name;.  if( pIte
28b90 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20  m->zDatabase==0 
28ba0 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65  && (zName = pIte
28bb0 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  m->zName)!=0 ){.
28bc0 20 20 20 20 57 69 74 68 20 2a 70 3b 0a 20 20 20      With *p;.   
28bd0 20 66 6f 72 28 70 3d 70 57 69 74 68 3b 20 70 3b   for(p=pWith; p;
28be0 20 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20   p=p->pOuter){. 
28bf0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
28c00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
28c10 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCte; i++){.    
28c20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
28c30 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d  trICmp(zName, p-
28c40 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  >a[i].zName)==0 
28c50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70  ){.          *pp
28c60 43 6f 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20 20  Context = p;.   
28c70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70         return &p
28c80 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  ->a[i];.        
28c90 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
28ca0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
28cb0 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20 67  }../* The code g
28cc0 65 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74 61 69  enerator maintai
28cd0 6e 73 20 61 20 73 74 61 63 6b 20 6f 66 20 61 63  ns a stack of ac
28ce0 74 69 76 65 20 57 49 54 48 20 63 6c 61 75 73 65  tive WITH clause
28cf0 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e  s.** with the in
28d00 6e 65 72 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c  ner-most WITH cl
28d10 61 75 73 65 20 62 65 69 6e 67 20 61 74 20 74 68  ause being at th
28d20 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
28d30 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ck..**.** This r
28d40 6f 75 74 69 6e 65 20 70 75 73 68 65 73 20 74 68  outine pushes th
28d50 65 20 57 49 54 48 20 63 6c 61 75 73 65 20 70 61  e WITH clause pa
28d60 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
28d70 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f  nd argument.** o
28d80 6e 74 6f 20 74 68 65 20 74 6f 70 20 6f 66 20 74  nto the top of t
28d90 68 65 20 73 74 61 63 6b 2e 20 49 66 20 61 72 67  he stack. If arg
28da0 75 6d 65 6e 74 20 62 46 72 65 65 20 69 73 20 74  ument bFree is t
28db0 72 75 65 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a  rue, then this.*
28dc0 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 77 69  * WITH clause wi
28dd0 6c 6c 20 6e 65 76 65 72 20 62 65 20 70 6f 70 70  ll never be popp
28de0 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63  ed from the stac
28df0 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  k. In this case 
28e00 69 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20  it.** should be 
28e10 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  freed along with
28e20 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
28e30 74 2e 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65  t. In other case
28e40 73 2c 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65  s, when.** bFree
28e50 3d 3d 30 2c 20 74 68 65 20 57 69 74 68 20 6f 62  ==0, the With ob
28e60 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 66 72 65  ject will be fre
28e70 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
28e80 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61  e SELECT .** sta
28e90 74 65 6d 65 6e 74 20 77 69 74 68 20 77 68 69 63  tement with whic
28ea0 68 20 69 74 20 69 73 20 61 73 73 6f 63 69 61 74  h it is associat
28eb0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
28ec0 74 65 33 57 69 74 68 50 75 73 68 28 50 61 72 73  te3WithPush(Pars
28ed0 65 20 2a 70 50 61 72 73 65 2c 20 57 69 74 68 20  e *pParse, With 
28ee0 2a 70 57 69 74 68 2c 20 75 38 20 62 46 72 65 65  *pWith, u8 bFree
28ef0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 62 46 72  ){.  assert( bFr
28f00 65 65 3d 3d 30 20 7c 7c 20 28 70 50 61 72 73 65  ee==0 || (pParse
28f10 2d 3e 70 57 69 74 68 3d 3d 30 20 26 26 20 70 50  ->pWith==0 && pP
28f20 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46 72 65  arse->pWithToFre
28f30 65 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70  e==0) );.  if( p
28f40 57 69 74 68 20 29 7b 0a 20 20 20 20 61 73 73 65  With ){.    asse
28f50 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74  rt( pParse->pWit
28f60 68 21 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20  h!=pWith );.    
28f70 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20  pWith->pOuter = 
28f80 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20  pParse->pWith;. 
28f90 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
28fa0 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 69 66   = pWith;.    if
28fb0 28 20 62 46 72 65 65 20 29 20 70 50 61 72 73 65  ( bFree ) pParse
28fc0 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 20 3d 20  ->pWithToFree = 
28fd0 70 57 69 74 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pWith;.  }.}../*
28fe0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
28ff0 6e 20 63 68 65 63 6b 73 20 69 66 20 61 72 67 75  n checks if argu
29000 6d 65 6e 74 20 70 46 72 6f 6d 20 72 65 66 65 72  ment pFrom refer
29010 73 20 74 6f 20 61 20 43 54 45 20 64 65 63 6c 61  s to a CTE decla
29020 72 65 64 20 62 79 20 0a 2a 2a 20 61 20 57 49 54  red by .** a WIT
29030 48 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20  H clause on the 
29040 73 74 61 63 6b 20 63 75 72 72 65 6e 74 6c 79 20  stack currently 
29050 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20 74 68  maintained by th
29060 65 20 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a  e parser. And,.*
29070 2a 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 70  * if currently p
29080 72 6f 63 65 73 73 69 6e 67 20 61 20 43 54 45 20  rocessing a CTE 
29090 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 20 69  expression, if i
290a0 74 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65  t is a recursive
290b0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f  .** reference to
290c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 43 54 45   the current CTE
290d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d  ..**.** If pFrom
290e0 20 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68   falls into eith
290f0 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 63 61  er of the two ca
29100 74 65 67 6f 72 69 65 73 20 61 62 6f 76 65 2c 20  tegories above, 
29110 70 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61  pFrom->pTab.** a
29120 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  nd other fields 
29130 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61 63  are populated ac
29140 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65 20 63  cordingly. The c
29150 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 68 65  aller should che
29160 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54  ck.** (pFrom->pT
29170 61 62 21 3d 30 29 20 74 6f 20 64 65 74 65 72 6d  ab!=0) to determ
29180 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
29190 6f 74 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  ot a successful 
291a0 6d 61 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75  match.** was fou
291b0 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65  nd..**.** Whethe
291c0 72 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63 68  r or not a match
291d0 20 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54   is found, SQLIT
291e0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
291f0 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20   if no error.** 
29200 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72  occurs. If an er
29210 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20  ror does occur, 
29220 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
29230 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
29240 65 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e 64 20  e.** parser and 
29250 73 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20  some error code 
29260 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
29270 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
29280 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 74  /.static int wit
29290 68 45 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65  hExpand(.  Walke
292a0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73  r *pWalker, .  s
292b0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
292c0 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50  em *pFrom.){.  P
292d0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
292e0 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
292f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
29300 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74  pParse->db;.  st
29310 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 3b 20  ruct Cte *pCte; 
29320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29330 20 4d 61 74 63 68 65 64 20 43 54 45 20 28 6f 72   Matched CTE (or
29340 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63   NULL if no matc
29350 68 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57  h) */.  With *pW
29360 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ith;            
29370 20 20 20 20 20 20 20 20 2f 2a 20 57 49 54 48 20          /* WITH 
29380 63 6c 61 75 73 65 20 74 68 61 74 20 70 43 74 65  clause that pCte
29390 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a   belongs to */..
293a0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
293b0 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70  >pTab==0 );..  p
293c0 43 74 65 20 3d 20 73 65 61 72 63 68 57 69 74 68  Cte = searchWith
293d0 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 2c 20  (pParse->pWith, 
293e0 70 46 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a  pFrom, &pWith);.
293f0 20 20 69 66 28 20 70 43 74 65 20 29 7b 0a 20 20    if( pCte ){.  
29400 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
29410 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
29420 69 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  ist;.    Select 
29430 2a 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63  *pSel;.    Selec
29440 74 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20  t *pLeft;       
29450 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74           /* Left
29460 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
29470 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  tement */.    in
29480 74 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 3b  t bMayRecursive;
29490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
294a0 72 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20  rue if compound 
294b0 6a 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20  joined by UNION 
294c0 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74  [ALL] */.    Wit
294d0 68 20 2a 70 53 61 76 65 64 57 69 74 68 3b 20 20  h *pSavedWith;  
294e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
294f0 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  itial value of p
29500 50 61 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a  Parse->pWith */.
29510 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 74 65 2d  .    /* If pCte-
29520 3e 7a 43 74 65 45 72 72 20 69 73 20 6e 6f 6e 2d  >zCteErr is non-
29530 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69  NULL at this poi
29540 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  nt, then this is
29550 20 61 6e 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20   an illegal.    
29560 2a 2a 20 72 65 63 75 72 73 69 76 65 20 72 65 66  ** recursive ref
29570 65 72 65 6e 63 65 20 74 6f 20 43 54 45 20 70 43  erence to CTE pC
29580 74 65 2e 20 4c 65 61 76 65 20 61 6e 20 65 72 72  te. Leave an err
29590 6f 72 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  or in pParse and
295a0 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65   return.    ** e
295b0 61 72 6c 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a  arly. If pCte->z
295c0 43 74 65 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20  CteErr is NULL, 
295d0 74 68 65 6e 20 74 68 69 73 20 69 73 20 6e 6f 74  then this is not
295e0 20 61 20 72 65 63 75 72 73 69 76 65 20 72 65 66   a recursive ref
295f0 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49  erence..    ** I
29600 6e 20 74 68 69 73 20 63 61 73 65 2c 20 70 72 6f  n this case, pro
29610 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ceed.  */.    if
29620 28 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20  ( pCte->zCteErr 
29630 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29640 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
29650 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 2c 20   pCte->zCteErr, 
29660 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCte->zName);.  
29670 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29680 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
29690 20 20 20 69 66 28 20 63 61 6e 6e 6f 74 42 65 46     if( cannotBeF
296a0 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  unction(pParse, 
296b0 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20  pFrom) ) return 
296c0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20  SQLITE_ERROR;.. 
296d0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
296e0 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
296f0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
29700 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
29710 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
29720 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20  zeof(Table));.  
29730 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
29740 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
29750 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62  ;.    pTab->nTab
29760 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 54 61  Ref = 1;.    pTa
29770 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  b->zName = sqlit
29780 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
29790 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Cte->zName);.   
297a0 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
297b0 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f  1;.    pTab->nRo
297c0 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61  wLogEst = 200; a
297d0 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69  ssert( 200==sqli
297e0 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37  te3LogEst(104857
297f0 36 29 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e  6) );.    pTab->
29800 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45  tabFlags |= TF_E
29810 70 68 65 6d 65 72 61 6c 20 7c 20 54 46 5f 4e 6f  phemeral | TF_No
29820 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20  VisibleRowid;.  
29830 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74    pFrom->pSelect
29840 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
29850 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 70 53  Dup(db, pCte->pS
29860 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 69  elect, 0);.    i
29870 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
29880 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  led ) return SQL
29890 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
298a0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
298b0 6d 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20  m->pSelect );.. 
298c0 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
298d0 68 69 73 20 69 73 20 61 20 72 65 63 75 72 73 69  his is a recursi
298e0 76 65 20 43 54 45 2e 20 2a 2f 0a 20 20 20 20 70  ve CTE. */.    p
298f0 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
29900 6c 65 63 74 3b 0a 20 20 20 20 62 4d 61 79 52 65  lect;.    bMayRe
29910 63 75 72 73 69 76 65 20 3d 20 28 20 70 53 65 6c  cursive = ( pSel
29920 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ->op==TK_ALL || 
29930 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  pSel->op==TK_UNI
29940 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 62 4d  ON );.    if( bM
29950 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  ayRecursive ){. 
29960 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
29970 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
29980 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
29990 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f  ->pSrc;.      fo
299a0 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e  r(i=0; i<pSrc->n
299b0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
299c0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
299d0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
299e0 26 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pSrc->a[i];.   
299f0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
29a00 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 0a 20 20  zDatabase==0 .  
29a10 20 20 20 20 20 20 20 26 26 20 70 49 74 65 6d 2d         && pItem-
29a20 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20 20 20 20 20  >zName!=0 .     
29a30 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65      && 0==sqlite
29a40 33 53 74 72 49 43 6d 70 28 70 49 74 65 6d 2d 3e  3StrICmp(pItem->
29a50 7a 4e 61 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e 61  zName, pCte->zNa
29a60 6d 65 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  me).          ){
29a70 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d  .          pItem
29a80 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20  ->pTab = pTab;. 
29a90 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
29aa0 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 3d  fg.isRecursive =
29ab0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54   1;.          pT
29ac0 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20  ab->nTabRef++;. 
29ad0 20 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e 73           pSel->s
29ae0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65  elFlags |= SF_Re
29af0 63 75 72 73 69 76 65 3b 0a 20 20 20 20 20 20 20  cursive;.       
29b00 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
29b10 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e  ..    /* Only on
29b20 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65  e recursive refe
29b30 72 65 6e 63 65 20 69 73 20 70 65 72 6d 69 74 74  rence is permitt
29b40 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69 66 28 20  ed. */ .    if( 
29b50 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e 32 20  pTab->nTabRef>2 
29b60 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29b70 45 72 72 6f 72 4d 73 67 28 0a 20 20 20 20 20 20  ErrorMsg(.      
29b80 20 20 20 20 70 50 61 72 73 65 2c 20 22 6d 75 6c      pParse, "mul
29b90 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  tiple references
29ba0 20 74 6f 20 72 65 63 75 72 73 69 76 65 20 74 61   to recursive ta
29bb0 62 6c 65 3a 20 25 73 22 2c 20 70 43 74 65 2d 3e  ble: %s", pCte->
29bc0 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  zName.      );. 
29bd0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
29be0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
29bf0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
29c00 2d 3e 6e 54 61 62 52 65 66 3d 3d 31 20 7c 7c 20  ->nTabRef==1 || 
29c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70  .            ((p
29c20 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46  Sel->selFlags&SF
29c30 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20 70  _Recursive) && p
29c40 54 61 62 2d 3e 6e 54 61 62 52 65 66 3d 3d 32 20  Tab->nTabRef==2 
29c50 29 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a  ));..    pCte->z
29c60 43 74 65 45 72 72 20 3d 20 22 63 69 72 63 75 6c  CteErr = "circul
29c70 61 72 20 72 65 66 65 72 65 6e 63 65 3a 20 25 73  ar reference: %s
29c80 22 3b 0a 20 20 20 20 70 53 61 76 65 64 57 69 74  ";.    pSavedWit
29c90 68 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74  h = pParse->pWit
29ca0 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  h;.    pParse->p
29cb0 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20  With = pWith;.  
29cc0 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73    if( bMayRecurs
29cd0 69 76 65 20 29 7b 0a 20 20 20 20 20 20 53 65 6c  ive ){.      Sel
29ce0 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 53  ect *pPrior = pS
29cf0 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  el->pPrior;.    
29d00 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
29d10 2d 3e 70 57 69 74 68 3d 3d 30 20 29 3b 0a 20 20  ->pWith==0 );.  
29d20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 57 69 74      pPrior->pWit
29d30 68 20 3d 20 70 53 65 6c 2d 3e 70 57 69 74 68 3b  h = pSel->pWith;
29d40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61  .      sqlite3Wa
29d50 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
29d60 2c 20 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 20  , pPrior);.     
29d70 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d   pPrior->pWith =
29d80 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
29d90 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
29da0 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
29db0 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pSel);.    }.   
29dc0 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
29dd0 20 70 57 69 74 68 3b 0a 0a 20 20 20 20 66 6f 72   pWith;..    for
29de0 28 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65  (pLeft=pSel; pLe
29df0 66 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66  ft->pPrior; pLef
29e00 74 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29  t=pLeft->pPrior)
29e10 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70  ;.    pEList = p
29e20 4c 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  Left->pEList;.  
29e30 20 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c    if( pCte->pCol
29e40 73 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  s ){.      if( p
29e50 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
29e60 3e 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e 70 43  >nExpr!=pCte->pC
29e70 6f 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ols->nExpr ){.  
29e80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
29e90 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
29ea0 61 62 6c 65 20 25 73 20 68 61 73 20 25 64 20 76  able %s has %d v
29eb0 61 6c 75 65 73 20 66 6f 72 20 25 64 20 63 6f 6c  alues for %d col
29ec0 75 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20 20 20  umns",.         
29ed0 20 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20     pCte->zName, 
29ee0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  pEList->nExpr, p
29ef0 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70  Cte->pCols->nExp
29f00 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  r.        );.   
29f10 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69       pParse->pWi
29f20 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b  th = pSavedWith;
29f30 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
29f40 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
29f50 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 4c 69      }.      pELi
29f60 73 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73  st = pCte->pCols
29f70 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
29f80 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
29f90 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
29fa0 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e  pEList, &pTab->n
29fb0 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c  Col, &pTab->aCol
29fc0 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52  );.    if( bMayR
29fd0 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
29fe0 20 20 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c 46    if( pSel->selF
29ff0 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73  lags & SF_Recurs
2a000 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ive ){.        p
2a010 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22  Cte->zCteErr = "
2a020 6d 75 6c 74 69 70 6c 65 20 72 65 63 75 72 73 69  multiple recursi
2a030 76 65 20 72 65 66 65 72 65 6e 63 65 73 3a 20 25  ve references: %
2a040 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  s";.      }else{
2a050 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a  .        pCte->z
2a060 43 74 65 45 72 72 20 3d 20 22 72 65 63 75 72 73  CteErr = "recurs
2a070 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 6e  ive reference in
2a080 20 61 20 73 75 62 71 75 65 72 79 3a 20 25 73 22   a subquery: %s"
2a090 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a0a0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
2a0b0 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29  t(pWalker, pSel)
2a0c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 74 65  ;.    }.    pCte
2a0d0 2d 3e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a 20  ->zCteErr = 0;. 
2a0e0 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
2a0f0 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20   = pSavedWith;. 
2a100 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
2a110 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
2a120 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2a130 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20  _OMIT_CTE./*.** 
2a140 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 70 61  If the SELECT pa
2a150 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
2a160 6e 64 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20  nd argument has 
2a170 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20 57 49  an associated WI
2a180 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 70  TH .** clause, p
2a190 6f 70 20 69 74 20 66 72 6f 6d 20 74 68 65 20 73  op it from the s
2a1a0 74 61 63 6b 20 73 74 6f 72 65 64 20 61 73 20 70  tack stored as p
2a1b0 61 72 74 20 6f 66 20 74 68 65 20 50 61 72 73 65  art of the Parse
2a1c0 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
2a1d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2a1e0 75 73 65 64 20 61 73 20 74 68 65 20 78 53 65 6c  used as the xSel
2a1f0 65 63 74 43 61 6c 6c 62 61 63 6b 32 28 29 20 63  ectCallback2() c
2a200 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73 71  allback by.** sq
2a210 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
2a220 64 28 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e 67  d() when walking
2a230 20 61 20 53 45 4c 45 43 54 20 74 72 65 65 20 74   a SELECT tree t
2a240 6f 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65 0a  o resolve table.
2a250 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74 68  ** names and oth
2a260 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  er FROM clause e
2a270 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61  lements. .*/.sta
2a280 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 50  tic void selectP
2a290 6f 70 57 69 74 68 28 57 61 6c 6b 65 72 20 2a 70  opWith(Walker *p
2a2a0 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
2a2b0 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
2a2c0 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
2a2d0 50 61 72 73 65 3b 0a 20 20 69 66 28 20 4f 4b 5f  Parse;.  if( OK_
2a2e0 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70  IF_ALWAYS_TRUE(p
2a2f0 50 61 72 73 65 2d 3e 70 57 69 74 68 29 20 26 26  Parse->pWith) &&
2a300 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b   p->pPrior==0 ){
2a310 0a 20 20 20 20 57 69 74 68 20 2a 70 57 69 74 68  .    With *pWith
2a320 20 3d 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74   = findRightmost
2a330 28 70 29 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20  (p)->pWith;.    
2a340 69 66 28 20 70 57 69 74 68 21 3d 30 20 29 7b 0a  if( pWith!=0 ){.
2a350 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2a360 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57 69  arse->pWith==pWi
2a370 74 68 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  th );.      pPar
2a380 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
2a390 68 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20 7d  h->pOuter;.    }
2a3a0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  .  }.}.#else.#de
2a3b0 66 69 6e 65 20 73 65 6c 65 63 74 50 6f 70 57 69  fine selectPopWi
2a3c0 74 68 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  th 0.#endif../*.
2a3d0 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 5f 69  ** The SrcList_i
2a3e0 74 65 6d 20 73 74 72 75 63 74 75 72 65 20 70 61  tem structure pa
2a3f0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
2a400 6e 64 20 61 72 67 75 6d 65 6e 74 20 72 65 70 72  nd argument repr
2a410 65 73 65 6e 74 73 20 61 0a 2a 2a 20 73 75 62 2d  esents a.** sub-
2a420 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
2a430 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
2a440 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
2a450 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  This function.**
2a460 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 70   allocates and p
2a470 6f 70 75 6c 61 74 65 73 20 74 68 65 20 53 72 63  opulates the Src
2a480 4c 69 73 74 5f 69 74 65 6d 2e 70 54 61 62 20 6f  List_item.pTab o
2a490 62 6a 65 63 74 2e 20 49 66 20 73 75 63 63 65 73  bject. If succes
2a4a0 73 66 75 6c 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  sful,.** SQLITE_
2a4b0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
2a4c0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e  Otherwise, if an
2a4d0 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e   OOM error is en
2a4e0 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 53 51  countered,.** SQ
2a4f0 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 69  LITE_NOMEM..*/.i
2a500 6e 74 20 73 71 6c 69 74 65 33 45 78 70 61 6e 64  nt sqlite3Expand
2a510 53 75 62 71 75 65 72 79 28 50 61 72 73 65 20 2a  Subquery(Parse *
2a520 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53  pParse, struct S
2a530 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
2a540 6f 6d 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  om){.  Select *p
2a550 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
2a560 6c 65 63 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70  lect;.  Table *p
2a570 54 61 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Tab;..  assert( 
2a580 70 53 65 6c 20 29 3b 0a 20 20 70 46 72 6f 6d 2d  pSel );.  pFrom-
2a590 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73  >pTab = pTab = s
2a5a0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
2a5b0 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
2a5c0 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
2a5d0 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
2a5e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2a5f0 45 4d 3b 0a 20 20 70 54 61 62 2d 3e 6e 54 61 62  EM;.  pTab->nTab
2a600 52 65 66 20 3d 20 31 3b 0a 20 20 69 66 28 20 70  Ref = 1;.  if( p
2a610 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a  From->zAlias ){.
2a620 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20      pTab->zName 
2a630 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
2a640 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 46  p(pParse->db, pF
2a650 72 6f 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  rom->zAlias);.  
2a660 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 62 2d  }else{.    pTab-
2a670 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
2a680 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
2a690 64 62 2c 20 22 73 75 62 71 75 65 72 79 5f 25 75  db, "subquery_%u
2a6a0 22 2c 20 70 53 65 6c 2d 3e 73 65 6c 49 64 29 3b  ", pSel->selId);
2a6b0 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 53  .  }.  while( pS
2a6c0 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53  el->pPrior ){ pS
2a6d0 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f  el = pSel->pPrio
2a6e0 72 3b 20 7d 0a 20 20 73 71 6c 69 74 65 33 43 6f  r; }.  sqlite3Co
2a6f0 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
2a700 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e  t(pParse, pSel->
2a710 70 45 4c 69 73 74 2c 26 70 54 61 62 2d 3e 6e 43  pEList,&pTab->nC
2a720 6f 6c 2c 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b  ol,&pTab->aCol);
2a730 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d  .  pTab->iPKey =
2a740 20 2d 31 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f   -1;.  pTab->nRo
2a750 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61  wLogEst = 200; a
2a760 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69  ssert( 200==sqli
2a770 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37  te3LogEst(104857
2a780 36 29 20 29 3b 0a 20 20 70 54 61 62 2d 3e 74 61  6) );.  pTab->ta
2a790 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68  bFlags |= TF_Eph
2a7a0 65 6d 65 72 61 6c 3b 0a 0a 20 20 72 65 74 75 72  emeral;..  retur
2a7b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2a7c0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2a7d0 6e 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20 63  ne is a Walker c
2a7e0 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78 70  allback for "exp
2a7f0 61 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43 54  anding" a SELECT
2a800 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22   statement..** "
2a810 45 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73  Expanding" means
2a820 20 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f   to do the follo
2a830 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  wing:.**.**    (
2a840 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44  1)  Make sure VD
2a850 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
2a860 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69  s have been assi
2a870 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a  gned to every.**
2a880 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74           element
2a890 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
2a8a0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  use..**.**    (2
2a8b0 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  )  Fill in the p
2a8c0 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61  TabList->a[].pTa
2a8d0 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  b fields in the 
2a8e0 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a  SrcList that .**
2a8f0 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73           defines
2a900 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57   FROM clause.  W
2a910 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61 72  hen views appear
2a920 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2a930 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  use,.**         
2a940 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61  fill pTabList->a
2a950 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20  [].pSelect with 
2a960 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45  a copy of the SE
2a970 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a  LECT statement.*
2a980 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69  *         that i
2a990 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69  mplements the vi
2a9a0 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d  ew.  A copy is m
2a9b0 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27  ade of the view'
2a9c0 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20  s SELECT.**     
2a9d0 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f      statement so
2a9e0 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65   that we can fre
2a9f0 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65  ely modify or de
2aa00 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d  lete that statem
2aa10 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77  ent.**         w
2aa20 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20  ithout worrying 
2aa30 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70  about messing up
2aa40 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
2aa50 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a  representation.*
2aa60 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65  *         of the
2aa70 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   view..**.**    
2aa80 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20 74  (3)  Add terms t
2aa90 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
2aaa0 73 65 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74  se to accommodat
2aab0 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65  e the NATURAL ke
2aac0 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20  yword.**        
2aad0 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68   on joins and th
2aae0 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  e ON and USING c
2aaf0 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a  lause of joins..
2ab00 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63  **.**    (4)  Sc
2ab10 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63  an the list of c
2ab20 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
2ab30 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74  sult set (pEList
2ab40 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20  ) looking.**    
2ab50 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63       for instanc
2ab60 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70  es of the "*" op
2ab70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41  erator or the TA
2ab80 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  BLE.* operator..
2ab90 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f  **         If fo
2aba0 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68  und, expand each
2abb0 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79   "*" to be every
2abc0 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79   column in every
2abd0 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20   table.**       
2abe0 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f    and TABLE.* to
2abf0 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
2ac00 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f   in TABLE..**.*/
2ac10 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65  .static int sele
2ac20 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b 65  ctExpander(Walke
2ac30 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
2ac40 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20  ct *p){.  Parse 
2ac50 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
2ac60 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74  r->pParse;.  int
2ac70 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c   i, j, k;.  SrcL
2ac80 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
2ac90 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
2aca0 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  t;.  struct SrcL
2acb0 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b  ist_item *pFrom;
2acc0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2acd0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45   pParse->db;.  E
2ace0 78 70 72 20 2a 70 45 2c 20 2a 70 52 69 67 68 74  xpr *pE, *pRight
2acf0 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75 31 36 20  , *pExpr;.  u16 
2ad00 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65  selFlags = p->se
2ad10 6c 46 6c 61 67 73 3b 0a 20 20 75 33 32 20 65 6c  lFlags;.  u32 el
2ad20 69 73 74 46 6c 61 67 73 20 3d 20 30 3b 0a 0a 20  istFlags = 0;.. 
2ad30 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
2ad40 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 69  SF_Expanded;.  i
2ad50 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
2ad60 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75  led  ){.    retu
2ad70 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
2ad80 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  }.  assert( p->p
2ad90 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Src!=0 );.  if( 
2ada0 28 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 45  (selFlags & SF_E
2adb0 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20  xpanded)!=0 ){. 
2adc0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
2add0 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c  une;.  }.  pTabL
2ade0 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
2adf0 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
2ae00 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 57 69  ist;.  sqlite3Wi
2ae10 74 68 50 75 73 68 28 70 50 61 72 73 65 2c 20 70  thPush(pParse, p
2ae20 2d 3e 70 57 69 74 68 2c 20 30 29 3b 0a 0a 20 20  ->pWith, 0);..  
2ae30 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72  /* Make sure cur
2ae40 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
2ae50 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
2ae60 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e  o all entries in
2ae70 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
2ae80 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c  lause of the SEL
2ae90 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  ECT statement.. 
2aea0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63   */.  sqlite3Src
2aeb0 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
2aec0 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
2aed0 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  st);..  /* Look 
2aee0 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e  up every table n
2aef0 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d  amed in the FROM
2af00 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
2af10 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20  elect.  If.  ** 
2af20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  an entry of the 
2af30 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61  FROM clause is a
2af40 20 73 75 62 71 75 65 72 79 20 69 6e 73 74 65 61   subquery instea
2af50 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  d of a table or 
2af60 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  view,.  ** then 
2af70 63 72 65 61 74 65 20 61 20 74 72 61 6e 73 69 65  create a transie
2af80 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
2af90 72 65 20 74 6f 20 64 65 73 63 72 69 62 65 20 74  re to describe t
2afa0 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a  he subquery..  *
2afb0 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72  /.  for(i=0, pFr
2afc0 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
2afd0 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
2afe0 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
2aff0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
2b000 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
2b010 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73  rom->fg.isRecurs
2b020 69 76 65 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d  ive==0 || pFrom-
2b030 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20  >pTab!=0 );.    
2b040 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73  if( pFrom->fg.is
2b050 52 65 63 75 72 73 69 76 65 20 29 20 63 6f 6e 74  Recursive ) cont
2b060 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
2b070 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
2b080 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
2b090 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
2b0a0 69 66 28 20 77 69 74 68 45 78 70 61 6e 64 28 70  if( withExpand(p
2b0b0 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29 20 29  Walker, pFrom) )
2b0c0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
2b0d0 74 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d  t;.    if( pFrom
2b0e0 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c 73 65  ->pTab ) {} else
2b0f0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
2b100 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20  pFrom->zName==0 
2b110 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
2b120 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
2b130 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
2b140 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  el = pFrom->pSel
2b150 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20  ect;.      /* A 
2b160 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
2b170 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
2b180 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
2b190 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 21 3d    assert( pSel!=
2b1a0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
2b1b0 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
2b1c0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  0 );.      if( s
2b1d0 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
2b1e0 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 20  (pWalker, pSel) 
2b1f0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
2b200 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  rt;.      if( sq
2b210 6c 69 74 65 33 45 78 70 61 6e 64 53 75 62 71 75  lite3ExpandSubqu
2b220 65 72 79 28 70 50 61 72 73 65 2c 20 70 46 72 6f  ery(pParse, pFro
2b230 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  m) ) return WRC_
2b240 41 62 6f 72 74 3b 0a 23 65 6e 64 69 66 0a 20 20  Abort;.#endif.  
2b250 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
2b260 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61  * An ordinary ta
2b270 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65  ble or view name
2b280 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2b290 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  use */.      ass
2b2a0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
2b2b0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72  ==0 );.      pFr
2b2c0 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
2b2d0 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
2b2e0 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c  ableItem(pParse,
2b2f0 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20   0, pFrom);.    
2b300 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
2b310 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
2b320 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
2b330 2d 3e 6e 54 61 62 52 65 66 3e 3d 30 78 66 66 66  ->nTabRef>=0xfff
2b340 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  f ){.        sql
2b350 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2b360 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72  rse, "too many r
2b370 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25  eferences to \"%
2b380 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c  s\": max 65535",
2b390 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62  .           pTab
2b3a0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
2b3b0 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
2b3c0 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
2b3d0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
2b3e0 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d     }.      pTab-
2b3f0 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20  >nTabRef++;.    
2b400 20 20 69 66 28 20 21 49 73 56 69 72 74 75 61 6c    if( !IsVirtual
2b410 28 70 54 61 62 29 20 26 26 20 63 61 6e 6e 6f 74  (pTab) && cannot
2b420 42 65 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  BeFunction(pPars
2b430 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20  e, pFrom) ){.   
2b440 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
2b450 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 23  Abort;.      }.#
2b460 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
2b470 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
2b480 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54   !defined (SQLIT
2b490 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2b4a0 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 49  BLE).      if( I
2b4b0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 7c  sVirtual(pTab) |
2b4c0 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
2b4d0 29 7b 0a 20 20 20 20 20 20 20 20 69 31 36 20 6e  ){.        i16 n
2b4e0 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Col;.        if(
2b4f0 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
2b500 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
2b510 65 2c 20 70 54 61 62 29 20 29 20 72 65 74 75 72  e, pTab) ) retur
2b520 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
2b530 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
2b540 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  om->pSelect==0 )
2b550 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d  ;.        pFrom-
2b560 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
2b570 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
2b580 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30  pTab->pSelect, 0
2b590 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20  );.        nCol 
2b5a0 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  = pTab->nCol;.  
2b5b0 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c        pTab->nCol
2b5c0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 73   = -1;.        s
2b5d0 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
2b5e0 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d  (pWalker, pFrom-
2b5f0 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
2b600 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20     pTab->nCol = 
2b610 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65  nCol;.      }.#e
2b620 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
2b630 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  /* Locate the in
2b640 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74 68 65  dex named by the
2b650 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
2b660 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20  se, if any. */. 
2b670 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e     if( sqlite3In
2b680 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50  dexedByLookup(pP
2b690 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a  arse, pFrom) ){.
2b6a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
2b6b0 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20  _Abort;.    }.  
2b6c0 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  }..  /* Process 
2b6d0 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73  NATURAL keywords
2b6e0 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49  , and ON and USI
2b6f0 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f  NG clauses of jo
2b700 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
2b710 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2b720 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73   || sqliteProces
2b730 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29  sJoin(pParse, p)
2b740 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
2b750 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20  RC_Abort;.  }.. 
2b760 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a   /* For every "*
2b770 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e  " that occurs in
2b780 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   the column list
2b790 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d  , insert the nam
2b7a0 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63  es of.  ** all c
2b7b0 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61  olumns in all ta
2b7c0 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65  bles.  And for e
2b7d0 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73  very TABLE.* ins
2b7e0 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20  ert the names.  
2b7f0 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  ** of all column
2b800 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65  s in TABLE.  The
2b810 20 70 61 72 73 65 72 20 69 6e 73 65 72 74 65 64   parser inserted
2b820 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65   a special expre
2b830 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20  ssion.  ** with 
2b840 74 68 65 20 54 4b 5f 41 53 54 45 52 49 53 4b 20  the TK_ASTERISK 
2b850 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63  operator for eac
2b860 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f  h "*" that it fo
2b870 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  und in the colum
2b880 6e 0a 20 20 2a 2a 20 6c 69 73 74 2e 20 20 54 68  n.  ** list.  Th
2b890 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
2b8a0 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63   just has to loc
2b8b0 61 74 65 20 74 68 65 20 54 4b 5f 41 53 54 45 52  ate the TK_ASTER
2b8c0 49 53 4b 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  ISK.  ** express
2b8d0 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 20  ions and expand 
2b8e0 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20  each one to the 
2b8f0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75  list of all colu
2b900 6d 6e 73 20 69 6e 0a 20 20 2a 2a 20 61 6c 6c 20  mns in.  ** all 
2b910 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
2b920 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70  * The first loop
2b930 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20   just checks to 
2b940 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65  see if there are
2b950 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f   any "*" operato
2b960 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65  rs.  ** that nee
2b970 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a  d expanding..  *
2b980 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70  /.  for(k=0; k<p
2b990 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
2b9a0 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20 70 45 4c  +){.    pE = pEL
2b9b0 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b  ist->a[k].pExpr;
2b9c0 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
2b9d0 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62  =TK_ASTERISK ) b
2b9e0 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74  reak;.    assert
2b9f0 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54  ( pE->op!=TK_DOT
2ba00 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d   || pE->pRight!=
2ba10 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2ba20 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20   pE->op!=TK_DOT 
2ba30 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30  || (pE->pLeft!=0
2ba40 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f   && pE->pLeft->o
2ba50 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20  p==TK_ID) );.   
2ba60 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
2ba70 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68  DOT && pE->pRigh
2ba80 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49  t->op==TK_ASTERI
2ba90 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  SK ) break;.    
2baa0 65 6c 69 73 74 46 6c 61 67 73 20 7c 3d 20 70 45  elistFlags |= pE
2bab0 2d 3e 66 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 69  ->flags;.  }.  i
2bac0 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  f( k<pEList->nEx
2bad0 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  pr ){.    /*.   
2bae0 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65   ** If we get he
2baf0 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  re it means the 
2bb00 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61  result set conta
2bb10 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
2bb20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  "*".    ** opera
2bb30 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
2bb40 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20  o be expanded.  
2bb50 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
2bb60 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  h expression.   
2bb70 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
2bb80 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64  t set and expand
2bb90 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65   them one by one
2bba0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72  ..    */.    str
2bbb0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
2bbc0 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61  m *a = pEList->a
2bbd0 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
2bbe0 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e  pNew = 0;.    in
2bbf0 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65  t flags = pParse
2bc00 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  ->db->flags;.   
2bc10 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d   int longNames =
2bc20 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
2bc30 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
2bc40 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
2bc50 20 20 20 20 20 20 20 20 26 26 20 28 66 6c 61 67          && (flag
2bc60 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74  s & SQLITE_Short
2bc70 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20  ColNames)==0;.. 
2bc80 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45     for(k=0; k<pE
2bc90 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
2bca0 29 7b 0a 20 20 20 20 20 20 70 45 20 3d 20 61 5b  ){.      pE = a[
2bcb0 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  k].pExpr;.      
2bcc0 65 6c 69 73 74 46 6c 61 67 73 20 7c 3d 20 70 45  elistFlags |= pE
2bcd0 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 70  ->flags;.      p
2bce0 52 69 67 68 74 20 3d 20 70 45 2d 3e 70 52 69 67  Right = pE->pRig
2bcf0 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ht;.      assert
2bd00 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54  ( pE->op!=TK_DOT
2bd10 20 7c 7c 20 70 52 69 67 68 74 21 3d 30 20 29 3b   || pRight!=0 );
2bd20 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  .      if( pE->o
2bd30 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20  p!=TK_ASTERISK. 
2bd40 20 20 20 20 20 20 26 26 20 28 70 45 2d 3e 6f 70        && (pE->op
2bd50 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67  !=TK_DOT || pRig
2bd60 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52  ht->op!=TK_ASTER
2bd70 49 53 4b 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  ISK).      ){.  
2bd80 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61        /* This pa
2bd90 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73  rticular express
2bda0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ion does not nee
2bdb0 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
2bdc0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2bdd0 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
2bde0 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
2bdf0 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  d(pParse, pNew, 
2be00 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[k].pExpr);.   
2be10 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
2be20 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
2be30 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
2be40 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a  ].zName = a[k].z
2be50 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
2be60 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
2be70 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61  xpr-1].zSpan = a
2be80 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20  [k].zSpan;.     
2be90 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20       a[k].zName 
2bea0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61  = 0;.          a
2beb0 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20  [k].zSpan = 0;. 
2bec0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2bed0 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b   a[k].pExpr = 0;
2bee0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2bef0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78        /* This ex
2bf00 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a  pression is a "*
2bf10 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22  " or a "TABLE.*"
2bf20 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
2bf30 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61  .        ** expa
2bf40 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nded. */.       
2bf50 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d   int tableSeen =
2bf60 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20   0;      /* Set 
2bf70 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20  to 1 when TABLE 
2bf80 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20  matches */.     
2bf90 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20     char *zTName 
2bfa0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 74 65  = 0;       /* te
2bfb0 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41  xt of name of TA
2bfc0 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  BLE */.        i
2bfd0 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
2bfe0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  T ){.          a
2bff0 73 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74  ssert( pE->pLeft
2c000 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
2c010 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
2c020 73 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c  sProperty(pE->pL
2c030 65 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  eft, EP_IntValue
2c040 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) );.          z
2c050 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66  TName = pE->pLef
2c060 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  t->u.zToken;.   
2c070 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
2c080 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
2c090 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
2c0a0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
2c0b0 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
2c0c0 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
2c0d0 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
2c0e0 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63  .          Selec
2c0f0 74 20 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d  t *pSub = pFrom-
2c100 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
2c110 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61      char *zTabNa
2c120 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69  me = pFrom->zAli
2c130 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  as;.          co
2c140 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d  nst char *zSchem
2c150 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  aName = 0;.     
2c160 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20       int iDb;.  
2c170 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
2c180 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
2c190 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20         zTabName 
2c1a0 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
2c1b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c1c0 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
2c1d0 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61  locFailed ) brea
2c1e0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  k;.          if(
2c1f0 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75   pSub==0 || (pSu
2c200 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
2c210 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20  _NestedFrom)==0 
2c220 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
2c230 53 75 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Sub = 0;.       
2c240 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
2c250 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
2c260 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61  p(zTName, zTabNa
2c270 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
2c280 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2c290 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2c2a0 20 20 20 20 20 20 20 20 20 20 20 20 69 44 62 20              iDb 
2c2b0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
2c2c0 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
2c2d0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
2c2e0 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61         zSchemaNa
2c2f0 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62  me = iDb>=0 ? db
2c300 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
2c310 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20  ame : "*";.     
2c320 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2c330 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
2c340 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
2c350 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
2c360 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43  zName = pTab->aC
2c370 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol[j].zName;.   
2c380 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
2c390 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65  Colname;  /* The
2c3a0 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e   computed column
2c3b0 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
2c3c0 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72       char *zToFr
2c3d0 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65  ee;   /* Malloce
2c3e0 64 20 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65  d string that ne
2c3f0 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  eds to be freed 
2c400 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  */.            T
2c410 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20  oken sColname;  
2c420 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75  /* Computed colu
2c430 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b  mn name as a tok
2c440 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20  en */..         
2c450 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65     assert( zName
2c460 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2c470 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 70 53  if( zTName && pS
2c480 75 62 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ub.             
2c490 26 26 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53  && sqlite3MatchS
2c4a0 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45  panName(pSub->pE
2c4b0 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e  List->a[j].zSpan
2c4c0 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d  , 0, zTName, 0)=
2c4d0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  =0.            )
2c4e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2c4f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2c500 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2c510 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c       /* If a col
2c520 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73  umn is marked as
2c530 20 27 68 69 64 64 65 6e 27 2c 20 6f 6d 69 74 20   'hidden', omit 
2c540 69 74 20 66 72 6f 6d 20 74 68 65 20 65 78 70 61  it from the expa
2c550 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 20  nded.           
2c560 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c   ** result-set l
2c570 69 73 74 20 75 6e 6c 65 73 73 20 74 68 65 20 53  ist unless the S
2c580 45 4c 45 43 54 20 68 61 73 20 74 68 65 20 53 46  ELECT has the SF
2c590 5f 49 6e 63 6c 75 64 65 48 69 64 64 65 6e 0a 20  _IncludeHidden. 
2c5a0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 69             ** bi
2c5b0 74 20 73 65 74 2e 0a 20 20 20 20 20 20 20 20 20  t set..         
2c5c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2c5d0 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
2c5e0 67 73 20 26 20 53 46 5f 49 6e 63 6c 75 64 65 48  gs & SF_IncludeH
2c5f0 69 64 64 65 6e 29 3d 3d 30 0a 20 20 20 20 20 20  idden)==0.      
2c600 20 20 20 20 20 20 20 26 26 20 49 73 48 69 64 64         && IsHidd
2c610 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e  enColumn(&pTab->
2c620 61 43 6f 6c 5b 6a 5d 29 20 0a 20 20 20 20 20 20  aCol[j]) .      
2c630 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2c640 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2c650 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2c660 20 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65             table
2c670 53 65 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20  Seen = 1;..     
2c680 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26         if( i>0 &
2c690 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  & zTName==0 ){. 
2c6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2c6b0 20 28 70 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e   (pFrom->fg.join
2c6c0 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
2c6d0 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  L)!=0.          
2c6e0 20 20 20 20 20 20 26 26 20 74 61 62 6c 65 41 6e        && tableAn
2c6f0 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61  dColumnIndex(pTa
2c700 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c  bList, i, zName,
2c710 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20 20 20   0, 0).         
2c720 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2c730 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
2c740 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d  NATURAL join, om
2c750 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75  it the join colu
2c760 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  mns from the .  
2c770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
2c780 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 72 69   table to the ri
2c790 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ght of the join 
2c7a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
2c7b0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2c7c0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2c7d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
2c7e0 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
2c7f0 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c  x(pFrom->pUsing,
2c800 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20   zName)>=0 ){.  
2c810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c820 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20   In a join with 
2c830 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20  a USING clause, 
2c840 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  omit columns in 
2c850 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
2c860 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61      ** using cla
2c870 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62  use from the tab
2c880 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e  le on the right.
2c890 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2c8a0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2c8b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2c8c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c8d0 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d          pRight =
2c8e0 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
2c8f0 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a   TK_ID, zName);.
2c900 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
2c910 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  name = zName;.  
2c920 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65            zToFre
2c930 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
2c940 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73     if( longNames
2c950 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   || pTabList->nS
2c960 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  rc>1 ){.        
2c970 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
2c980 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
2c990 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   pLeft = sqlite3
2c9a0 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20  Expr(db, TK_ID, 
2c9b0 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20  zTabName);.     
2c9c0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
2c9d0 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
2c9e0 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c  arse, TK_DOT, pL
2c9f0 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
2ca00 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2ca10 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20  zSchemaName ){. 
2ca20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2ca30 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
2ca40 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53  pr(db, TK_ID, zS
2ca50 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20  chemaName);.    
2ca60 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2ca70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
2ca80 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
2ca90 20 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a   pLeft, pExpr);.
2caa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2cab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2cac0 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20  ( longNames ){. 
2cad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
2cae0 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  Colname = sqlite
2caf0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
2cb00 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  .%s", zTabName, 
2cb10 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
2cb20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20          zToFree 
2cb30 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20  = zColname;.    
2cb40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2cb50 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2cb60 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
2cb70 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  pr = pRight;.   
2cb80 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2cb90 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
2cba0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
2cbb0 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77  end(pParse, pNew
2cbc0 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
2cbd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b        sqlite3Tok
2cbe0 65 6e 49 6e 69 74 28 26 73 43 6f 6c 6e 61 6d 65  enInit(&sColname
2cbf0 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20  , zColname);.   
2cc00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2cc10 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28  ExprListSetName(
2cc20 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73  pParse, pNew, &s
2cc30 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  Colname, 0);.   
2cc40 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
2cc50 77 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67  w && (p->selFlag
2cc60 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f  s & SF_NestedFro
2cc70 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)!=0 ){.       
2cc80 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
2cc90 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58 20  prList_item *pX 
2cca0 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d  = &pNew->a[pNew-
2ccb0 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20  >nExpr-1];.     
2ccc0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75           if( pSu
2ccd0 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  b ){.           
2cce0 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d       pX->zSpan =
2ccf0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
2cd00 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  (db, pSub->pELis
2cd10 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a  t->a[j].zSpan);.
2cd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd30 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53  testcase( pX->zS
2cd40 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pan==0 );.      
2cd50 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2cd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2cd70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74  X->zSpan = sqlit
2cd80 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
2cd90 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20 20  s.%s.%s",.      
2cda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cdc0 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65       zSchemaName
2cdd0 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c  , zTabName, zCol
2cde0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
2cdf0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2ce00 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b   pX->zSpan==0 );
2ce10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2ce20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2ce30 58 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20  X->bSpanIsTab = 
2ce40 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
2ce50 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2ce60 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
2ce70 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20  ToFree);.       
2ce80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2ce90 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c         if( !tabl
2cea0 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  eSeen ){.       
2ceb0 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b     if( zTName ){
2cec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2ced0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2cee0 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
2cef0 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65  ble: %s", zTName
2cf00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
2cf10 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2cf20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2cf30 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c  pParse, "no tabl
2cf40 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a  es specified");.
2cf50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2cf60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2cf70 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
2cf80 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
2cf90 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  , pEList);.    p
2cfa0 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b  ->pEList = pNew;
2cfb0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 45  .  }.  if( p->pE
2cfc0 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20  List ){.    if( 
2cfd0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
2cfe0 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
2cff0 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
2d000 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2d010 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2d020 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75  , "too many colu
2d030 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65  mns in result se
2d040 74 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  t");.      retur
2d050 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
2d060 20 7d 0a 20 20 20 20 69 66 28 20 28 65 6c 69 73   }.    if( (elis
2d070 74 46 6c 61 67 73 20 26 20 28 45 50 5f 48 61 73  tFlags & (EP_Has
2d080 46 75 6e 63 7c 45 50 5f 53 75 62 71 75 65 72 79  Func|EP_Subquery
2d090 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ))!=0 ){.      p
2d0a0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
2d0b0 5f 43 6f 6d 70 6c 65 78 52 65 73 75 6c 74 3b 0a  _ComplexResult;.
2d0c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2d0d0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2d0e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20  .}../*.** No-op 
2d0f0 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20  routine for the 
2d100 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65  parse-tree walke
2d110 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  r..**.** When th
2d120 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
2d130 65 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61  e Walker.xExprCa
2d140 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72  llback then expr
2d150 65 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20  ession trees.** 
2d160 61 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f  are walked witho
2d170 75 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62  ut any actions b
2d180 65 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61  eing taken at ea
2d190 63 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d  ch node.  Presum
2d1a0 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68  ably,.** when th
2d1b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
2d1c0 65 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45  ed for Walker.xE
2d1d0 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e  xprCallback then
2d1e0 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c   .** Walker.xSel
2d1f0 65 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73  ectCallback is s
2d200 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69  et to do somethi
2d210 6e 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76  ng useful for ev
2d220 65 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79  ery .** subquery
2d230 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 74   in the parser t
2d240 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ree..*/.int sqli
2d250 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 28  te3ExprWalkNoop(
2d260 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c  Walker *NotUsed,
2d270 20 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29   Expr *NotUsed2)
2d280 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
2d290 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
2d2a0 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
2d2b0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2d2c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20  .}../*.** No-op 
2d2d0 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20  routine for the 
2d2e0 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65  parse-tree walke
2d2f0 72 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61  r for SELECT sta
2d300 74 65 6d 65 6e 74 73 2e 0a 2a 2a 20 73 75 62 71  tements..** subq
2d310 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73  uery in the pars
2d320 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20  er tree..*/.int 
2d330 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
2d340 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f  kNoop(Walker *No
2d350 74 55 73 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e  tUsed, Select *N
2d360 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  otUsed2){.  UNUS
2d370 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
2d380 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
2d390 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
2d3a0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 20  ontinue;.}..#if 
2d3b0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
2d3c0 2a 2a 20 41 6c 77 61 79 73 20 61 73 73 65 72 74  ** Always assert
2d3d0 2e 20 20 54 68 69 73 20 78 53 65 6c 65 63 74 43  .  This xSelectC
2d3e0 61 6c 6c 62 61 63 6b 32 20 69 6d 70 6c 65 6d 65  allback2 impleme
2d3f0 6e 74 61 74 69 6f 6e 20 70 72 6f 76 65 73 20 74  ntation proves t
2d400 68 61 74 20 74 68 65 0a 2a 2a 20 78 53 65 6c 65  hat the.** xSele
2d410 63 74 43 61 6c 6c 62 61 63 6b 32 20 69 73 20 6e  ctCallback2 is n
2d420 65 76 65 72 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f  ever invoked..*/
2d430 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
2d440 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32 28 57  ectWalkAssert2(W
2d450 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20  alker *NotUsed, 
2d460 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 32  Select *NotUsed2
2d470 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2d480 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
2d490 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 61 73 73  NotUsed2);.  ass
2d4a0 65 72 74 28 20 30 20 29 3b 0a 7d 0a 23 65 6e 64  ert( 0 );.}.#end
2d4b0 69 66 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  if./*.** This ro
2d4c0 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20  utine "expands" 
2d4d0 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
2d4e0 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74  nt and all of it
2d4f0 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  s subqueries..**
2d500 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   For additional 
2d510 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77  information on w
2d520 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20  hat it means to 
2d530 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43  "expand" a SELEC
2d540 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20  T.** statement, 
2d550 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  see the comment 
2d560 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78 70  on the selectExp
2d570 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62  and worker callb
2d580 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a  ack above..**.**
2d590 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c   Expanding a SEL
2d5a0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73  ECT statement is
2d5b0 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70 20   the first step 
2d5c0 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a  in processing a.
2d5d0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
2d5e0 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54  ent.  The SELECT
2d5f0 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20   statement must 
2d600 62 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f  be expanded befo
2d610 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c  re.** name resol
2d620 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d  ution is perform
2d630 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  ed..**.** If any
2d640 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
2d650 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  , an error messa
2d660 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
2d670 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68  to pParse..** Th
2d680 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
2d690 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74 68  on can detect th
2d6a0 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f  e problem by loo
2d6b0 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e  king at pParse->
2d6c0 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70  nErr.** and/or p
2d6d0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
2d6e0 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74  cFailed..*/.stat
2d6f0 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
2d700 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72 73  electExpand(Pars
2d710 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
2d720 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57  t *pSelect){.  W
2d730 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78  alker w;.  w.xEx
2d740 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c  prCallback = sql
2d750 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70  ite3ExprWalkNoop
2d760 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
2d770 50 61 72 73 65 3b 0a 20 20 69 66 28 20 4f 4b 5f  Parse;.  if( OK_
2d780 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70  IF_ALWAYS_TRUE(p
2d790 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75  Parse->hasCompou
2d7a0 6e 64 29 20 29 7b 0a 20 20 20 20 77 2e 78 53 65  nd) ){.    w.xSe
2d7b0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63  lectCallback = c
2d7c0 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65  onvertCompoundSe
2d7d0 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 3b 0a  lectToSubquery;.
2d7e0 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c      w.xSelectCal
2d7f0 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20  lback2 = 0;.    
2d800 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
2d810 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
2d820 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74 43    }.  w.xSelectC
2d830 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
2d840 45 78 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78 53  Expander;.  w.xS
2d850 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
2d860 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a   selectPopWith;.
2d870 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
2d880 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29  ect(&w, pSelect)
2d890 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
2d8a0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
2d8b0 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  RY./*.** This is
2d8c0 20 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63   a Walker.xSelec
2d8d0 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61  tCallback callba
2d8e0 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74  ck for the sqlit
2d8f0 65 33 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f  e3SelectTypeInfo
2d900 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e  ().** interface.
2d910 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20  .**.** For each 
2d920 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
2d930 75 65 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e  uery, add Column
2d940 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d  .zType and Colum
2d950 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72  n.zColl.** infor
2d960 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61  mation to the Ta
2d970 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
2d980 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68  at represents th
2d990 65 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20  e result set.** 
2d9a0 6f 66 20 74 68 61 74 20 73 75 62 71 75 65 72 79  of that subquery
2d9b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c  ..**.** The Tabl
2d9c0 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
2d9d0 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20   represents the 
2d9e0 72 65 73 75 6c 74 20 73 65 74 20 77 61 73 20 63  result set was c
2d9f0 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79  onstructed.** by
2da00 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28   selectExpander(
2da10 29 20 62 75 74 20 74 68 65 20 74 79 70 65 20 61  ) but the type a
2da20 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66  nd collation inf
2da30 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69  ormation was omi
2da40 74 74 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20  tted.** at that 
2da50 70 6f 69 6e 74 20 62 65 63 61 75 73 65 20 69 64  point because id
2da60 65 6e 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f  entifiers had no
2da70 74 20 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c  t yet been resol
2da80 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ved.  This.** ro
2da90 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2daa0 61 66 74 65 72 20 69 64 65 6e 74 69 66 69 65 72  after identifier
2dab0 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a   resolution..*/.
2dac0 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
2dad0 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70  ctAddSubqueryTyp
2dae0 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57  eInfo(Walker *pW
2daf0 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
2db00 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
2db10 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53  se;.  int i;.  S
2db20 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
2db30 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
2db40 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a  st_item *pFrom;.
2db50 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65  .  assert( p->se
2db60 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f  lFlags & SF_Reso
2db70 6c 76 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d  lved );.  if( p-
2db80 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48  >selFlags & SF_H
2db90 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74  asTypeInfo ) ret
2dba0 75 72 6e 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  urn;.  p->selFla
2dbb0 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65  gs |= SF_HasType
2dbc0 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d  Info;.  pParse =
2dbd0 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
2dbe0 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
2dbf0 2d 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d  ->pSrc;.  for(i=
2dc00 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
2dc10 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
2dc20 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
2dc30 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  om++){.    Table
2dc40 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
2dc50 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74  pTab;.    assert
2dc60 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ( pTab!=0 );.   
2dc70 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46   if( (pTab->tabF
2dc80 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
2dc90 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ral)!=0 ){.     
2dca0 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
2dcb0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2dcc0 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
2dcd0 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  /.      Select *
2dce0 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
2dcf0 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66 28  elect;.      if(
2dd00 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20   pSel ){.       
2dd10 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50   while( pSel->pP
2dd20 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53  rior ) pSel = pS
2dd30 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  el->pPrior;.    
2dd40 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
2dd50 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e  tAddColumnTypeAn
2dd60 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73  dCollation(pPars
2dd70 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a  e, pTab, pSel);.
2dd80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2dd90 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
2dda0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2ddb0 61 64 64 73 20 64 61 74 61 74 79 70 65 20 61 6e  adds datatype an
2ddc0 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
2ddd0 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ence information
2dde0 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65   to.** the Table
2ddf0 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 61   structures of a
2de00 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ll FROM-clause s
2de10 75 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a  ubqueries in a.*
2de20 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
2de30 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  nt..**.** Use th
2de40 69 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72  is routine after
2de50 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
2de60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2de70 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
2de80 64 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20  dTypeInfo(Parse 
2de90 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
2dea0 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64  *pSelect){.#ifnd
2deb0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
2dec0 55 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72  UBQUERY.  Walker
2ded0 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43   w;.  w.xSelectC
2dee0 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
2def0 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b  3SelectWalkNoop;
2df00 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
2df10 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 41 64  back2 = selectAd
2df20 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66  dSubqueryTypeInf
2df30 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  o;.  w.xExprCall
2df40 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78  back = sqlite3Ex
2df50 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e  prWalkNoop;.  w.
2df60 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
2df70 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  .  sqlite3WalkSe
2df80 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74  lect(&w, pSelect
2df90 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  );.#endif.}.../*
2dfa0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2dfb0 20 73 65 74 73 20 75 70 20 61 20 53 45 4c 45 43   sets up a SELEC
2dfc0 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  T statement for 
2dfd0 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65  processing.  The
2dfe0 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  .** following is
2dff0 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a   accomplished:.*
2e000 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45  *.**     *  VDBE
2e010 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   Cursor numbers 
2e020 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20  are assigned to 
2e030 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
2e040 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20  terms..**     * 
2e050 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65   Ephemeral Table
2e060 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65   objects are cre
2e070 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f  ated for all FRO
2e080 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
2e090 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f  ies..**     *  O
2e0a0 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
2e0b0 73 65 73 20 61 72 65 20 73 68 69 66 74 65 64 20  ses are shifted 
2e0c0 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74 65  into WHERE state
2e0d0 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20  ments.**     *  
2e0e0 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e  Wildcards "*" an
2e0f0 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72  d "TABLE.*" in r
2e100 65 73 75 6c 74 20 73 65 74 73 20 61 72 65 20 65  esult sets are e
2e110 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20  xpanded..**     
2e120 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73 20 69  *  Identifiers i
2e130 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65  n expression are
2e140 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c   matched to tabl
2e150 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
2e160 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65 63 75  outine acts recu
2e170 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73  rsively on all s
2e180 75 62 71 75 65 72 69 65 73 20 77 69 74 68 69 6e  ubqueries within
2e190 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a   the SELECT..*/.
2e1a0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
2e1b0 63 74 50 72 65 70 28 0a 20 20 50 61 72 73 65 20  ctPrep(.  Parse 
2e1c0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
2e1d0 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
2e1e0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
2e1f0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
2e200 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
2e210 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
2e220 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d   coded. */.  Nam
2e230 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72  eContext *pOuter
2e240 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74  NC  /* Name cont
2e250 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65  ext for containe
2e260 72 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  r */.){.  assert
2e270 28 20 70 21 3d 30 20 7c 7c 20 70 50 61 72 73 65  ( p!=0 || pParse
2e280 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
2e290 65 64 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72  ed );.  if( pPar
2e2a0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
2e2b0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
2e2c0 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
2e2d0 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66   & SF_HasTypeInf
2e2e0 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  o ) return;.  sq
2e2f0 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
2e300 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  d(pParse, p);.  
2e310 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
2e320 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
2e330 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
2e340 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
2e350 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d  ResolveSelectNam
2e360 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f  es(pParse, p, pO
2e370 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70  uterNC);.  if( p
2e380 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70  Parse->nErr || p
2e390 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
2e3a0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
2e3b0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
2e3c0 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61  tAddTypeInfo(pPa
2e3d0 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rse, p);.}../*.*
2e3e0 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72  * Reset the aggr
2e3f0 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
2e400 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67  r..**.** The agg
2e410 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
2e420 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d  or is a set of m
2e430 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74  emory cells that
2e440 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65   hold.** interme
2e450 64 69 61 74 65 20 72 65 73 75 6c 74 73 20 77 68  diate results wh
2e460 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20  ile calculating 
2e470 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54  an aggregate.  T
2e480 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  his.** routine g
2e490 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68  enerates code th
2e4a0 61 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20  at stores NULLs 
2e4b0 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20  in all of those 
2e4c0 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e  memory.** cells.
2e4d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2e4e0 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
2e4f0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2e500 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
2e510 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
2e520 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
2e530 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
2e540 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
2e550 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67  Func;.  int nReg
2e560 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   = pAggInfo->nFu
2e570 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  nc + pAggInfo->n
2e580 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52  Column;.  if( nR
2e590 65 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  eg==0 ) return;.
2e5a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2e5b0 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  BUG.  /* Verify 
2e5c0 74 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f  that all AggInfo
2e5d0 20 72 65 67 69 73 74 65 72 73 20 61 72 65 20 77   registers are w
2e5e0 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20  ithin the range 
2e5f0 73 70 65 63 69 66 69 65 64 20 62 79 0a 20 20 2a  specified by.  *
2e600 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e  * AggInfo.mnReg.
2e610 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a  .AggInfo.mxReg *
2e620 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 67  /.  assert( nReg
2e630 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  ==pAggInfo->mxRe
2e640 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  g-pAggInfo->mnRe
2e650 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  g+1 );.  for(i=0
2e660 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; i<pAggInfo->nC
2e670 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
2e680 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66   assert( pAggInf
2e690 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e  o->aCol[i].iMem>
2e6a0 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67  =pAggInfo->mnReg
2e6b0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67  .         && pAg
2e6c0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  gInfo->aCol[i].i
2e6d0 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem<=pAggInfo->m
2e6e0 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f  xReg );.  }.  fo
2e6f0 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
2e700 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a  o->nFunc; i++){.
2e710 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67      assert( pAgg
2e720 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69  Info->aFunc[i].i
2e730 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem>=pAggInfo->m
2e740 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26  nReg.         &&
2e750 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
2e760 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e  [i].iMem<=pAggIn
2e770 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d  fo->mxReg );.  }
2e780 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
2e790 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2e7a0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49  P_Null, 0, pAggI
2e7b0 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67  nfo->mnReg, pAgg
2e7c0 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20  Info->mxReg);.  
2e7d0 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e  for(pFunc=pAggIn
2e7e0 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20  fo->aFunc, i=0; 
2e7f0 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
2e800 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29  c; i++, pFunc++)
2e810 7b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d  {.    if( pFunc-
2e820 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b  >iDistinct>=0 ){
2e830 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20  .      Expr *pE 
2e840 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a  = pFunc->pExpr;.
2e850 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
2e860 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2e870 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  E, EP_xIsSelect)
2e880 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
2e890 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  ->x.pList==0 || 
2e8a0 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pE->x.pList->nEx
2e8b0 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  pr!=1 ){.       
2e8c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2e8d0 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e  (pParse, "DISTIN
2e8e0 43 54 20 61 67 67 72 65 67 61 74 65 73 20 6d 75  CT aggregates mu
2e8f0 73 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20  st have exactly 
2e900 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  one ".          
2e910 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20   "argument");.  
2e920 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69        pFunc->iDi
2e930 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
2e940 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e950 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
2e960 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
2e970 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
2e980 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70  (pParse, pE->x.p
2e990 4c 69 73 74 2c 30 2c 30 29 3b 0a 20 20 20 20 20  List,0,0);.     
2e9a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2e9b0 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
2e9c0 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d  phemeral, pFunc-
2e9d0 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30  >iDistinct, 0, 0
2e9e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2e9f0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
2ea00 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
2ea10 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
2ea20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
2ea30 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
2ea40 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f  OP_AggFinalize o
2ea50 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  pcode for every 
2ea60 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
2ea70 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67  on.** in the Agg
2ea80 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  Info structure..
2ea90 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
2eaa0 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
2eab0 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ons(Parse *pPars
2eac0 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
2ead0 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
2eae0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
2eaf0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
2eb00 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
2eb10 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   *pF;.  for(i=0,
2eb20 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46   pF=pAggInfo->aF
2eb30 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  unc; i<pAggInfo-
2eb40 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b  >nFunc; i++, pF+
2eb50 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  +){.    ExprList
2eb60 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45   *pList = pF->pE
2eb70 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
2eb80 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2eb90 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70  asProperty(pF->p
2eba0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
2ebb0 63 74 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ct) );.    sqlit
2ebc0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2ebd0 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d  OP_AggFinal, pF-
2ebe0 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70  >iMem, pList ? p
2ebf0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29  List->nExpr : 0)
2ec00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2ec10 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46 2d  eAppendP4(v, pF-
2ec20 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
2ec30 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  EF);.  }.}.../*.
2ec40 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63  ** Update the ac
2ec50 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79  cumulator memory
2ec60 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67   cells for an ag
2ec70 67 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e  gregate based on
2ec80 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
2ec90 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
2eca0 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 41 63 63  .**.** If regAcc
2ecb0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64   is non-zero and
2ecc0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 69   there are no mi
2ecd0 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 61 67 67  n() or max() agg
2ece0 72 65 67 61 74 65 73 0a 2a 2a 20 69 6e 20 70 41  regates.** in pA
2ecf0 67 67 49 6e 66 6f 2c 20 74 68 65 6e 20 6f 6e 6c  ggInfo, then onl
2ed00 79 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 70  y populate the p
2ed10 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75  AggInfo->nAccumu
2ed20 6c 61 74 6f 72 20 61 63 63 75 6d 75 6c 61 74 6f  lator accumulato
2ed30 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 69  r.** registers i
2ed40 20 72 65 67 69 73 74 65 72 20 72 65 67 41 63 63   register regAcc
2ed50 20 63 6f 6e 74 61 69 6e 73 20 30 2e 20 54 68 65   contains 0. The
2ed60 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 61 6b   caller will tak
2ed70 65 20 63 61 72 65 0a 2a 2a 20 6f 66 20 73 65 74  e care.** of set
2ed80 74 69 6e 67 20 61 6e 64 20 63 6c 65 61 72 69 6e  ting and clearin
2ed90 67 20 72 65 67 41 63 63 2e 0a 2a 2f 0a 73 74 61  g regAcc..*/.sta
2eda0 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41  tic void updateA
2edb0 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
2edc0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 72 65   *pParse, int re
2edd0 67 41 63 63 2c 20 41 67 67 49 6e 66 6f 20 2a 70  gAcc, AggInfo *p
2ede0 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
2edf0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
2ee00 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
2ee10 69 6e 74 20 72 65 67 48 69 74 20 3d 20 30 3b 0a  int regHit = 0;.
2ee20 20 20 69 6e 74 20 61 64 64 72 48 69 74 54 65 73    int addrHitTes
2ee30 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20  t = 0;.  struct 
2ee40 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
2ee50 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
2ee60 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70  fo_col *pC;..  p
2ee70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
2ee80 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69  ode = 1;.  for(i
2ee90 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d  =0, pF=pAggInfo-
2eea0 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e  >aFunc; i<pAggIn
2eeb0 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
2eec0 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e  pF++){.    int n
2eed0 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64  Arg;.    int add
2eee0 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69  rNext = 0;.    i
2eef0 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45  nt regAgg;.    E
2ef00 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
2ef10 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c   pF->pExpr->x.pL
2ef20 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ist;.    assert(
2ef30 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2ef40 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f  y(pF->pExpr, EP_
2ef50 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
2ef60 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
2ef70 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73       nArg = pLis
2ef80 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
2ef90 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33  regAgg = sqlite3
2efa0 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
2efb0 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  rse, nArg);.    
2efc0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
2efd0 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
2efe0 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c  , pList, regAgg,
2eff0 20 30 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f   0, SQLITE_ECEL_
2f000 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  DUP);.    }else{
2f010 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b  .      nArg = 0;
2f020 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20  .      regAgg = 
2f030 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
2f040 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d   pF->iDistinct>=
2f050 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e  0 ){.      addrN
2f060 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ext = sqlite3Vdb
2f070 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
2f080 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
2f090 73 65 28 20 6e 41 72 67 3d 3d 30 20 29 3b 20 20  se( nArg==0 );  
2f0a0 2f 2a 20 45 72 72 6f 72 20 63 6f 6e 64 69 74 69  /* Error conditi
2f0b0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  on */.      test
2f0c0 63 61 73 65 28 20 6e 41 72 67 3e 31 20 29 3b 20  case( nArg>1 ); 
2f0d0 20 20 2f 2a 20 41 6c 73 6f 20 61 6e 20 65 72 72    /* Also an err
2f0e0 6f 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65  or */.      code
2f0f0 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c  Distinct(pParse,
2f100 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20   pF->iDistinct, 
2f110 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67  addrNext, 1, reg
2f120 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Agg);.    }.    
2f130 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66  if( pF->pFunc->f
2f140 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
2f150 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20  E_FUNC_NEEDCOLL 
2f160 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
2f170 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20   *pColl = 0;.   
2f180 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
2f190 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
2f1a0 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
2f1b0 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
2f1c0 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74  !=0 );  /* pList
2f1d0 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63  !=0 if pF->pFunc
2f1e0 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f   has NEEDCOLL */
2f1f0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
2f200 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  pItem=pList->a; 
2f210 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67  !pColl && j<nArg
2f220 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
2f230 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
2f240 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2f250 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65  Seq(pParse, pIte
2f260 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
2f270 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43   }.      if( !pC
2f280 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  oll ){.        p
2f290 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
2f2a0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
2f2b0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2f2c0 72 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67  regHit==0 && pAg
2f2d0 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61  gInfo->nAccumula
2f2e0 74 6f 72 20 29 20 72 65 67 48 69 74 20 3d 20 2b  tor ) regHit = +
2f2f0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2f300 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f310 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp4(v, OP_Col
2f320 6c 53 65 71 2c 20 72 65 67 48 69 74 2c 20 30 2c  lSeq, regHit, 0,
2f330 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
2f340 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
2f350 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2f360 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2f370 50 5f 41 67 67 53 74 65 70 2c 20 30 2c 20 72 65  P_AggStep, 0, re
2f380 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 29 3b  gAgg, pF->iMem);
2f390 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2f3a0 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e  AppendP4(v, pF->
2f3b0 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
2f3c0 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  F);.    sqlite3V
2f3d0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28  dbeChangeP5(v, (
2f3e0 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71  u8)nArg);.    sq
2f3f0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
2f400 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
2f410 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20  gAgg, nArg);.   
2f420 20 69 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b   if( addrNext ){
2f430 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2f440 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
2f450 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20  , addrNext);.   
2f460 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67   }.  }.  if( reg
2f470 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e  Hit==0 && pAggIn
2f480 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
2f490 20 29 7b 0a 20 20 20 20 72 65 67 48 69 74 20 3d   ){.    regHit =
2f4a0 20 72 65 67 41 63 63 3b 0a 20 20 7d 0a 20 20 69   regAcc;.  }.  i
2f4b0 66 28 20 72 65 67 48 69 74 20 29 7b 0a 20 20 20  f( regHit ){.   
2f4c0 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 73   addrHitTest = s
2f4d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
2f4e0 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48 69  (v, OP_If, regHi
2f4f0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
2f500 28 76 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  (v);.  }.  for(i
2f510 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d  =0, pC=pAggInfo-
2f520 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66  >aCol; i<pAggInf
2f530 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b  o->nAccumulator;
2f540 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20   i++, pC++){.   
2f550 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
2f560 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78  (pParse, pC->pEx
2f570 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20  pr, pC->iMem);. 
2f580 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64   }.  pAggInfo->d
2f590 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20  irectMode = 0;. 
2f5a0 20 69 66 28 20 61 64 64 72 48 69 74 54 65 73 74   if( addrHitTest
2f5b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
2f5c0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
2f5d0 64 64 72 48 69 74 54 65 73 74 29 3b 0a 20 20 7d  ddrHitTest);.  }
2f5e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
2f5f0 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69  single OP_Explai
2f600 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  n instruction to
2f610 20 74 68 65 20 56 44 42 45 20 74 6f 20 65 78 70   the VDBE to exp
2f620 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a  lain a simple.**
2f630 20 63 6f 75 6e 74 28 2a 29 20 71 75 65 72 79 20   count(*) query 
2f640 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  ("SELECT count(*
2f650 29 20 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a  ) FROM pTab")..*
2f660 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2f670 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74  _OMIT_EXPLAIN.st
2f680 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
2f690 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20  nSimpleCount(.  
2f6a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2f6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f6c0 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
2f6d0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
2f6e0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
2f6f0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62        /* Table b
2f700 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a  eing queried */.
2f710 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
2f720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f730 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20    /* Index used 
2f740 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e  to optimize scan
2f750 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  , or NULL */.){.
2f760 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
2f770 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
2f780 69 6e 74 20 62 43 6f 76 65 72 20 3d 20 28 70 49  int bCover = (pI
2f790 64 78 21 3d 30 20 26 26 20 28 48 61 73 52 6f 77  dx!=0 && (HasRow
2f7a0 69 64 28 70 54 61 62 29 20 7c 7c 20 21 49 73 50  id(pTab) || !IsP
2f7b0 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
2f7c0 49 64 78 29 29 29 3b 0a 20 20 20 20 73 71 6c 69  Idx)));.    sqli
2f7d0 74 65 33 56 64 62 65 45 78 70 6c 61 69 6e 28 70  te3VdbeExplain(p
2f7e0 50 61 72 73 65 2c 20 30 2c 20 22 53 43 41 4e 20  Parse, 0, "SCAN 
2f7f0 54 41 42 4c 45 20 25 73 25 73 25 73 22 2c 0a 20  TABLE %s%s%s",. 
2f800 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
2f810 6d 65 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76  me,.        bCov
2f820 65 72 20 3f 20 22 20 55 53 49 4e 47 20 43 4f 56  er ? " USING COV
2f830 45 52 49 4e 47 20 49 4e 44 45 58 20 22 20 3a 20  ERING INDEX " : 
2f840 22 22 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76  "",.        bCov
2f850 65 72 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  er ? pIdx->zName
2f860 20 3a 20 22 22 0a 20 20 20 20 29 3b 0a 20 20 7d   : "".    );.  }
2f870 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
2f880 65 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43  e explainSimpleC
2f890 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64  ount(a,b,c).#end
2f8a0 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65  if../*.** sqlite
2f8b0 33 57 61 6c 6b 45 78 70 72 28 29 20 63 61 6c 6c  3WalkExpr() call
2f8c0 62 61 63 6b 20 75 73 65 64 20 62 79 20 68 61 76  back used by hav
2f8d0 69 6e 67 54 6f 57 68 65 72 65 28 29 2e 0a 2a 2a  ingToWhere()..**
2f8e0 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 64 65 20  .** If the node 
2f8f0 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 63 61  passed to the ca
2f900 6c 6c 62 61 63 6b 20 69 73 20 61 20 54 4b 5f 41  llback is a TK_A
2f910 4e 44 20 6e 6f 64 65 2c 20 72 65 74 75 72 6e 20  ND node, return 
2f920 0a 2a 2a 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  .** WRC_Continue
2f930 20 74 6f 20 74 65 6c 6c 20 73 71 6c 69 74 65 33   to tell sqlite3
2f940 57 61 6c 6b 45 78 70 72 28 29 20 74 6f 20 69 74  WalkExpr() to it
2f950 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 63 68  erate through ch
2f960 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a  ild nodes..**.**
2f970 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
2f980 72 6e 20 57 52 43 5f 50 72 75 6e 65 2e 20 49 6e  rn WRC_Prune. In
2f990 20 74 68 69 73 20 63 61 73 65 2c 20 61 6c 73 6f   this case, also
2f9a0 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 0a 2a   check if the .*
2f9b0 2a 20 73 75 62 2d 65 78 70 72 65 73 73 69 6f 6e  * sub-expression
2f9c0 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 72 69   matches the cri
2f9d0 74 65 72 69 61 20 66 6f 72 20 62 65 69 6e 67 20  teria for being 
2f9e0 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 57 48 45  moved to the WHE
2f9f0 52 45 0a 2a 2a 20 63 6c 61 75 73 65 2e 20 49 66  RE.** clause. If
2fa00 20 73 6f 2c 20 61 64 64 20 69 74 20 74 6f 20 74   so, add it to t
2fa10 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2fa20 61 6e 64 20 72 65 70 6c 61 63 65 20 74 68 65 20  and replace the 
2fa30 73 75 62 2d 65 78 70 72 65 73 73 69 6f 6e 0a 2a  sub-expression.*
2fa40 2a 20 77 69 74 68 69 6e 20 74 68 65 20 48 41 56  * within the HAV
2fa50 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 77  ING expression w
2fa60 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20 22  ith a constant "
2fa70 31 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  1"..*/.static in
2fa80 74 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65 45  t havingToWhereE
2fa90 78 70 72 43 62 28 57 61 6c 6b 65 72 20 2a 70 57  xprCb(Walker *pW
2faa0 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
2fab0 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  pr){.  if( pExpr
2fac0 2d 3e 6f 70 21 3d 54 4b 5f 41 4e 44 20 29 7b 0a  ->op!=TK_AND ){.
2fad0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
2fae0 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 65 6c   pWalker->u.pSel
2faf0 65 63 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ect;.    if( sql
2fb00 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
2fb10 6e 74 4f 72 47 72 6f 75 70 42 79 28 70 57 61 6c  ntOrGroupBy(pWal
2fb20 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70 45 78  ker->pParse, pEx
2fb30 70 72 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42 79  pr, pS->pGroupBy
2fb40 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
2fb50 65 33 20 2a 64 62 20 3d 20 70 57 61 6c 6b 65 72  e3 *db = pWalker
2fb60 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  ->pParse->db;.  
2fb70 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
2fb80 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
2fb90 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52  c(db, TK_INTEGER
2fba0 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b  , &sqlite3IntTok
2fbb0 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20  ens[1], 0);.    
2fbc0 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
2fbd0 20 20 20 20 20 20 45 78 70 72 20 2a 70 57 68 65        Expr *pWhe
2fbe0 72 65 20 3d 20 70 53 2d 3e 70 57 68 65 72 65 3b  re = pS->pWhere;
2fbf0 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 45 78  .        SWAP(Ex
2fc00 70 72 2c 20 2a 70 4e 65 77 2c 20 2a 70 45 78 70  pr, *pNew, *pExp
2fc10 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  r);.        pNew
2fc20 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
2fc30 64 28 64 62 2c 20 70 57 68 65 72 65 2c 20 70 4e  d(db, pWhere, pN
2fc40 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 53 2d  ew);.        pS-
2fc50 3e 70 57 68 65 72 65 20 3d 20 70 4e 65 77 3b 0a  >pWhere = pNew;.
2fc60 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
2fc70 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20  >eCode = 1;.    
2fc80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65    }.    }.    re
2fc90 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
2fca0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43    }.  return WRC
2fcb0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
2fcc0 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 6c 69  .** Transfer eli
2fcd0 67 69 62 6c 65 20 74 65 72 6d 73 20 66 72 6f 6d  gible terms from
2fce0 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   the HAVING clau
2fcf0 73 65 20 6f 66 20 61 20 71 75 65 72 79 2c 20 77  se of a query, w
2fd00 68 69 63 68 20 69 73 0a 2a 2a 20 70 72 6f 63 65  hich is.** proce
2fd10 73 73 65 64 20 61 66 74 65 72 20 67 72 6f 75 70  ssed after group
2fd20 69 6e 67 2c 20 74 6f 20 74 68 65 20 57 48 45 52  ing, to the WHER
2fd30 45 20 63 6c 61 75 73 65 2c 20 77 68 69 63 68 20  E clause, which 
2fd40 69 73 20 70 72 6f 63 65 73 73 65 64 20 62 65 66  is processed bef
2fd50 6f 72 65 0a 2a 2a 20 67 72 6f 75 70 69 6e 67 2e  ore.** grouping.
2fd60 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   For example, th
2fd70 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  e query:.**.**  
2fd80 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 3c   SELECT * FROM <
2fd90 74 61 62 6c 65 73 3e 20 57 48 45 52 45 20 61 3d  tables> WHERE a=
2fda0 3f 20 47 52 4f 55 50 20 42 59 20 62 20 48 41 56  ? GROUP BY b HAV
2fdb0 49 4e 47 20 62 3d 3f 20 41 4e 44 20 63 3d 3f 0a  ING b=? AND c=?.
2fdc0 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65 20 72 65 77  **.** can be rew
2fdd0 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a  ritten as:.**.**
2fde0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2fdf0 20 3c 74 61 62 6c 65 73 3e 20 57 48 45 52 45 20   <tables> WHERE 
2fe00 61 3d 3f 20 41 4e 44 20 62 3d 3f 20 47 52 4f 55  a=? AND b=? GROU
2fe10 50 20 42 59 20 62 20 48 41 56 49 4e 47 20 63 3d  P BY b HAVING c=
2fe20 3f 0a 2a 2a 0a 2a 2a 20 41 20 74 65 72 6d 20 6f  ?.**.** A term o
2fe30 66 20 74 68 65 20 48 41 56 49 4e 47 20 65 78 70  f the HAVING exp
2fe40 72 65 73 73 69 6f 6e 20 69 73 20 65 6c 69 67 69  ression is eligi
2fe50 62 6c 65 20 66 6f 72 20 74 72 61 6e 73 66 65 72  ble for transfer
2fe60 20 69 66 20 69 74 20 63 6f 6e 73 69 73 74 73 0a   if it consists.
2fe70 2a 2a 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 63  ** entirely of c
2fe80 6f 6e 73 74 61 6e 74 73 20 61 6e 64 20 65 78 70  onstants and exp
2fe90 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72  ressions that ar
2fea0 65 20 61 6c 73 6f 20 47 52 4f 55 50 20 42 59 20  e also GROUP BY 
2feb0 74 65 72 6d 73 20 74 68 61 74 0a 2a 2a 20 75 73  terms that.** us
2fec0 65 20 74 68 65 20 22 42 49 4e 41 52 59 22 20 63  e the "BINARY" c
2fed0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
2fee0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
2fef0 64 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65 28  d havingToWhere(
2ff00 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
2ff10 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 57 61 6c  elect *p){.  Wal
2ff20 6b 65 72 20 73 57 61 6c 6b 65 72 3b 0a 20 20 6d  ker sWalker;.  m
2ff30 65 6d 73 65 74 28 26 73 57 61 6c 6b 65 72 2c 20  emset(&sWalker, 
2ff40 30 2c 20 73 69 7a 65 6f 66 28 73 57 61 6c 6b 65  0, sizeof(sWalke
2ff50 72 29 29 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 70  r));.  sWalker.p
2ff60 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
2ff70 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72 43    sWalker.xExprC
2ff80 61 6c 6c 62 61 63 6b 20 3d 20 68 61 76 69 6e 67  allback = having
2ff90 54 6f 57 68 65 72 65 45 78 70 72 43 62 3b 0a 20  ToWhereExprCb;. 
2ffa0 20 73 57 61 6c 6b 65 72 2e 75 2e 70 53 65 6c 65   sWalker.u.pSele
2ffb0 63 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65  ct = p;.  sqlite
2ffc0 33 57 61 6c 6b 45 78 70 72 28 26 73 57 61 6c 6b  3WalkExpr(&sWalk
2ffd0 65 72 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b  er, p->pHaving);
2ffe0 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
2fff0 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
30000 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 26 26 20  Walker.eCode && 
30010 28 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72  (sqlite3SelectTr
30020 61 63 65 20 26 20 30 78 31 30 30 29 21 3d 30 20  ace & 0x100)!=0 
30030 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41  ){.    SELECTTRA
30040 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c  CE(0x100,pParse,
30050 70 2c 28 22 4d 6f 76 65 20 48 41 56 49 4e 47 20  p,("Move HAVING 
30060 74 65 72 6d 73 20 69 6e 74 6f 20 57 48 45 52 45  terms into WHERE
30070 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  :\n"));.    sqli
30080 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
30090 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
300a0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
300b0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
300c0 74 68 65 20 70 54 68 69 73 20 65 6e 74 72 79 20  the pThis entry 
300d0 6f 66 20 70 54 61 62 4c 69 73 74 20 69 73 20 61  of pTabList is a
300e0 20 73 65 6c 66 2d 6a 6f 69 6e 20 6f 66 20 61 20   self-join of a 
300f0 70 72 69 6f 72 20 76 69 65 77 2e 0a 2a 2a 20 49  prior view..** I
30100 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 72 65  f it is, then re
30110 74 75 72 6e 20 74 68 65 20 53 72 63 4c 69 73 74  turn the SrcList
30120 5f 69 74 65 6d 20 66 6f 72 20 74 68 65 20 70 72  _item for the pr
30130 69 6f 72 20 76 69 65 77 2e 20 20 49 66 20 69 74  ior view.  If it
30140 20 69 73 20 6e 6f 74 2c 0a 2a 2a 20 74 68 65 6e   is not,.** then
30150 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74   return 0..*/.st
30160 61 74 69 63 20 73 74 72 75 63 74 20 53 72 63 4c  atic struct SrcL
30170 69 73 74 5f 69 74 65 6d 20 2a 69 73 53 65 6c 66  ist_item *isSelf
30180 4a 6f 69 6e 56 69 65 77 28 0a 20 20 53 72 63 4c  JoinView(.  SrcL
30190 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
301a0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72           /* Sear
301b0 63 68 20 66 6f 72 20 73 65 6c 66 2d 6a 6f 69 6e  ch for self-join
301c0 73 20 69 6e 20 74 68 69 73 20 46 52 4f 4d 20 63  s in this FROM c
301d0 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
301e0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
301f0 70 54 68 69 73 20 20 20 2f 2a 20 53 65 61 72 63  pThis   /* Searc
30200 68 20 66 6f 72 20 70 72 69 6f 72 20 72 65 66 65  h for prior refe
30210 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 73 75  rence to this su
30220 62 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 73  bquery */.){.  s
30230 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
30240 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 66 6f 72  em *pItem;.  for
30250 28 70 49 74 65 6d 20 3d 20 70 54 61 62 4c 69 73  (pItem = pTabLis
30260 74 2d 3e 61 3b 20 70 49 74 65 6d 3c 70 54 68 69  t->a; pItem<pThi
30270 73 3b 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  s; pItem++){.   
30280 20 53 65 6c 65 63 74 20 2a 70 53 31 3b 0a 20 20   Select *pS1;.  
30290 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
302a0 6c 65 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  lect==0 ) contin
302b0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  ue;.    if( pIte
302c0 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69  m->fg.viaCorouti
302d0 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ne ) continue;. 
302e0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e     if( pItem->zN
302f0 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ame==0 ) continu
30300 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
30310 65 33 5f 73 74 72 69 63 6d 70 28 70 49 74 65 6d  e3_stricmp(pItem
30320 2d 3e 7a 44 61 74 61 62 61 73 65 2c 20 70 54 68  ->zDatabase, pTh
30330 69 73 2d 3e 7a 44 61 74 61 62 61 73 65 29 21 3d  is->zDatabase)!=
30340 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
30350 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
30360 72 69 63 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61  ricmp(pItem->zNa
30370 6d 65 2c 20 70 54 68 69 73 2d 3e 7a 4e 61 6d 65  me, pThis->zName
30380 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
30390 0a 20 20 20 20 70 53 31 20 3d 20 70 49 74 65 6d  .    pS1 = pItem
303a0 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69  ->pSelect;.    i
303b0 66 28 20 70 54 68 69 73 2d 3e 70 53 65 6c 65 63  f( pThis->pSelec
303c0 74 2d 3e 73 65 6c 49 64 21 3d 70 53 31 2d 3e 73  t->selId!=pS1->s
303d0 65 6c 49 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a  elId ){.      /*
303e0 20 54 68 65 20 71 75 65 72 79 20 66 6c 61 74 74   The query flatt
303f0 65 6e 65 72 20 6c 65 66 74 20 74 77 6f 20 64 69  ener left two di
30400 66 66 65 72 65 6e 74 20 43 54 45 20 74 61 62 6c  fferent CTE tabl
30410 65 73 20 77 69 74 68 20 69 64 65 6e 74 69 63 61  es with identica
30420 6c 0a 20 20 20 20 20 20 2a 2a 20 6e 61 6d 65 73  l.      ** names
30430 20 69 6e 20 74 68 65 20 73 61 6d 65 20 46 52 4f   in the same FRO
30440 4d 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20  M clause. */.   
30450 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
30460 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
30470 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c  e3ExprCompare(0,
30480 20 70 54 68 69 73 2d 3e 70 53 65 6c 65 63 74 2d   pThis->pSelect-
30490 3e 70 57 68 65 72 65 2c 20 70 53 31 2d 3e 70 57  >pWhere, pS1->pW
304a0 68 65 72 65 2c 20 2d 31 29 20 29 7b 0a 20 20 20  here, -1) ){.   
304b0 20 20 20 2f 2a 20 54 68 65 20 76 69 65 77 20 77     /* The view w
304c0 61 73 20 6d 6f 64 69 66 69 65 64 20 62 79 20 73  as modified by s
304d0 6f 6d 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69  ome other optimi
304e0 7a 61 74 69 6f 6e 20 73 75 63 68 20 61 73 0a 20  zation such as. 
304f0 20 20 20 20 20 2a 2a 20 70 75 73 68 44 6f 77 6e       ** pushDown
30500 57 68 65 72 65 54 65 72 6d 73 28 29 20 2a 2f 0a  WhereTerms() */.
30510 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
30520 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
30530 20 70 49 74 65 6d 3b 0a 20 20 7d 0a 20 20 72 65   pItem;.  }.  re
30540 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65  turn 0;.}..#ifde
30550 66 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46  f SQLITE_COUNTOF
30560 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  VIEW_OPTIMIZATIO
30570 4e 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  N./*.** Attempt 
30580 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 71  to transform a q
30590 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d  uery of the form
305a0 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
305b0 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 28   count(*) FROM (
305c0 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31  SELECT x FROM t1
305d0 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
305e0 54 20 79 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 0a  T y FROM t2).**.
305f0 2a 2a 20 49 6e 74 6f 20 74 68 69 73 3a 0a 2a 2a  ** Into this:.**
30600 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 28 53  .**    SELECT (S
30610 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
30620 52 4f 4d 20 74 31 29 2b 28 53 45 4c 45 43 54 20  ROM t1)+(SELECT 
30630 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32  count(*) FROM t2
30640 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 72 61 6e  ).**.** The tran
30650 73 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 6c 79 20  sformation only 
30660 77 6f 72 6b 73 20 69 66 20 61 6c 6c 20 6f 66 20  works if all of 
30670 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
30680 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
30690 2a 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  *  The subquery 
306a0 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f  is a UNION ALL o
306b0 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65  f two or more te
306c0 72 6d 73 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20  rms.**   *  The 
306d0 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
306e0 74 20 68 61 76 65 20 61 20 4c 49 4d 49 54 20 63  t have a LIMIT c
306f0 6c 61 75 73 65 0a 2a 2a 20 20 20 2a 20 20 54 68  lause.**   *  Th
30700 65 72 65 20 69 73 20 6e 6f 20 57 48 45 52 45 20  ere is no WHERE 
30710 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20 48  or GROUP BY or H
30720 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 6e  AVING clauses on
30730 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a   the subqueries.
30740 2a 2a 20 20 20 2a 20 20 54 68 65 20 6f 75 74 65  **   *  The oute
30750 72 20 71 75 65 72 79 20 69 73 20 61 20 73 69 6d  r query is a sim
30760 70 6c 65 20 63 6f 75 6e 74 28 2a 29 0a 2a 2a 0a  ple count(*).**.
30770 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
30780 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
30790 6f 6e 20 69 73 20 75 6e 64 65 72 74 61 6b 65 6e  on is undertaken
307a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
307b0 63 6f 75 6e 74 4f 66 56 69 65 77 4f 70 74 69 6d  countOfViewOptim
307c0 69 7a 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  ization(Parse *p
307d0 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
307e0 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  ){.  Select *pSu
307f0 62 2c 20 2a 70 50 72 69 6f 72 3b 0a 20 20 45 78  b, *pPrior;.  Ex
30800 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 45 78 70  pr *pExpr;.  Exp
30810 72 20 2a 70 43 6f 75 6e 74 3b 0a 20 20 73 71 6c  r *pCount;.  sql
30820 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
30830 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
30840 46 5f 41 67 67 72 65 67 61 74 65 29 3d 3d 30 20  F_Aggregate)==0 
30850 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a  ) return 0;   /*
30860 20 54 68 69 73 20 69 73 20 61 6e 20 61 67 67 72   This is an aggr
30870 65 67 61 74 65 20 2a 2f 0a 20 20 69 66 28 20 70  egate */.  if( p
30880 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
30890 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =1 ) return 0;  
308a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
308b0 53 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f  Single result co
308c0 6c 75 6d 6e 20 2a 2f 0a 20 20 70 45 78 70 72 20  lumn */.  pExpr 
308d0 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  = p->pEList->a[0
308e0 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ].pExpr;.  if( p
308f0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
30900 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75  _FUNCTION ) retu
30910 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20  rn 0;        /* 
30920 52 65 73 75 6c 74 20 69 73 20 61 6e 20 61 67 67  Result is an agg
30930 72 65 67 61 74 65 20 2a 2f 0a 20 20 69 66 28 20  regate */.  if( 
30940 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
30950 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
30960 22 63 6f 75 6e 74 22 29 20 29 20 72 65 74 75 72  "count") ) retur
30970 6e 20 30 3b 20 20 2f 2a 20 49 73 20 63 6f 75 6e  n 0;  /* Is coun
30980 74 28 29 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  t() */.  if( pEx
30990 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20 29  pr->x.pList!=0 )
309a0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
309b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75             /* Mu
309c0 73 74 20 62 65 20 63 6f 75 6e 74 28 2a 29 20 2a  st be count(*) *
309d0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 2d  /.  if( p->pSrc-
309e0 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72  >nSrc!=1 ) retur
309f0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
30a00 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 74 61 62        /* One tab
30a10 6c 65 20 69 6e 20 46 52 4f 4d 20 20 2a 2f 0a 20  le in FROM  */. 
30a20 20 70 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pSub = p->pSrc-
30a30 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20  >a[0].pSelect;. 
30a40 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 72   if( pSub==0 ) r
30a50 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
30a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a70 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 69     /* The FROM i
30a80 73 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  s a subquery */.
30a90 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69    if( pSub->pPri
30aa0 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  or==0 ) return 0
30ab0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30ac0 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 61      /* Must be a
30ad0 20 63 6f 6d 70 6f 75 6e 64 20 72 79 20 2a 2f 0a   compound ry */.
30ae0 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 53    do{.    if( pS
30af0 75 62 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26  ub->op!=TK_ALL &
30b00 26 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29  & pSub->pPrior )
30b10 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4d   return 0;  /* M
30b20 75 73 74 20 62 65 20 55 4e 49 4f 4e 20 41 4c 4c  ust be UNION ALL
30b30 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62   */.    if( pSub
30b40 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
30b50 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
30b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
30b70 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
30b80 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c      if( pSub->pL
30b90 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b  imit ) return 0;
30ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30bb0 20 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49        /* No LIMI
30bc0 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  T clause */.    
30bd0 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61  if( pSub->selFla
30be0 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
30bf0 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
30c00 20 20 2f 2a 20 4e 6f 74 20 61 6e 20 61 67 67 72    /* Not an aggr
30c10 65 67 61 74 65 20 2a 2f 0a 20 20 20 20 70 53 75  egate */.    pSu
30c20 62 20 3d 20 70 53 75 62 2d 3e 70 50 72 69 6f 72  b = pSub->pPrior
30c30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30c50 2a 20 52 65 70 65 61 74 20 6f 76 65 72 20 63 6f  * Repeat over co
30c60 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 7d 77 68 69  mpound */.  }whi
30c70 6c 65 28 20 70 53 75 62 20 29 3b 0a 0a 20 20 2f  le( pSub );..  /
30c80 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
30c90 69 73 20 70 6f 69 6e 74 20 74 68 65 6e 20 69 74  is point then it
30ca0 20 69 73 20 4f 4b 20 74 6f 20 70 65 72 66 6f 72   is OK to perfor
30cb0 6d 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61  m the transforma
30cc0 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20 3d 20  tion */..  db = 
30cd0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 43  pParse->db;.  pC
30ce0 6f 75 6e 74 20 3d 20 70 45 78 70 72 3b 0a 20 20  ount = pExpr;.  
30cf0 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 70 53 75  pExpr = 0;.  pSu
30d00 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
30d10 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 70 2d 3e  ].pSelect;.  p->
30d20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
30d30 63 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ct = 0;.  sqlite
30d40 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
30d50 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 70  b, p->pSrc);.  p
30d60 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
30d70 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
30d80 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  rse->db, sizeof(
30d90 2a 70 2d 3e 70 53 72 63 29 29 3b 0a 20 20 77 68  *p->pSrc));.  wh
30da0 69 6c 65 28 20 70 53 75 62 20 29 7b 0a 20 20 20  ile( pSub ){.   
30db0 20 45 78 70 72 20 2a 70 54 65 72 6d 3b 0a 20 20   Expr *pTerm;.  
30dc0 20 20 70 50 72 69 6f 72 20 3d 20 70 53 75 62 2d    pPrior = pSub-
30dd0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 53 75  >pPrior;.    pSu
30de0 62 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  b->pPrior = 0;. 
30df0 20 20 20 70 53 75 62 2d 3e 70 4e 65 78 74 20 3d     pSub->pNext =
30e00 20 30 3b 0a 20 20 20 20 70 53 75 62 2d 3e 73 65   0;.    pSub->se
30e10 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67 67  lFlags |= SF_Agg
30e20 72 65 67 61 74 65 3b 0a 20 20 20 20 70 53 75 62  regate;.    pSub
30e30 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
30e40 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 20 20  F_Compound;.    
30e50 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pSub->nSelectRow
30e60 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
30e70 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
30e80 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  db, pSub->pEList
30e90 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70  );.    pTerm = p
30ea0 50 72 69 6f 72 20 3f 20 73 71 6c 69 74 65 33 45  Prior ? sqlite3E
30eb0 78 70 72 44 75 70 28 64 62 2c 20 70 43 6f 75 6e  xprDup(db, pCoun
30ec0 74 2c 20 30 29 20 3a 20 70 43 6f 75 6e 74 3b 0a  t, 0) : pCount;.
30ed0 20 20 20 20 70 53 75 62 2d 3e 70 45 4c 69 73 74      pSub->pEList
30ee0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
30ef0 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
30f00 20 30 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20   0, pTerm);.    
30f10 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 50  pTerm = sqlite3P
30f20 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
30f30 53 45 4c 45 43 54 2c 20 30 2c 20 30 29 3b 0a 20  SELECT, 0, 0);. 
30f40 20 20 20 73 71 6c 69 74 65 33 50 45 78 70 72 41     sqlite3PExprA
30f50 64 64 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ddSelect(pParse,
30f60 20 70 54 65 72 6d 2c 20 70 53 75 62 29 3b 0a 20   pTerm, pSub);. 
30f70 20 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20     if( pExpr==0 
30f80 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d  ){.      pExpr =
30f90 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 65 6c 73   pTerm;.    }els
30fa0 65 7b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d  e{.      pExpr =
30fb0 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
30fc0 61 72 73 65 2c 20 54 4b 5f 50 4c 55 53 2c 20 70  arse, TK_PLUS, p
30fd0 54 65 72 6d 2c 20 70 45 78 70 72 29 3b 0a 20 20  Term, pExpr);.  
30fe0 20 20 7d 0a 20 20 20 20 70 53 75 62 20 3d 20 70    }.    pSub = p
30ff0 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 70 2d 3e  Prior;.  }.  p->
31000 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
31010 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 70 2d  pr = pExpr;.  p-
31020 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
31030 5f 41 67 67 72 65 67 61 74 65 3b 0a 0a 23 69 66  _Aggregate;..#if
31040 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
31050 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
31060 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
31070 30 78 34 30 30 20 29 7b 0a 20 20 20 20 53 45 4c  0x400 ){.    SEL
31080 45 43 54 54 52 41 43 45 28 30 78 34 30 30 2c 70  ECTTRACE(0x400,p
31090 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20  Parse,p,("After 
310a0 63 6f 75 6e 74 2d 6f 66 2d 76 69 65 77 20 6f 70  count-of-view op
310b0 74 69 6d 69 7a 61 74 69 6f 6e 3a 5c 6e 22 29 29  timization:\n"))
310c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
310d0 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
310e0 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
310f0 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
31100 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
31110 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54 49  COUNTOFVIEW_OPTI
31120 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a  MIZATION */../*.
31130 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
31140 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54 20   for the SELECT 
31150 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20  statement given 
31160 69 6e 20 74 68 65 20 70 20 61 72 67 75 6d 65 6e  in the p argumen
31170 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  t.  .**.** The r
31180 65 73 75 6c 74 73 20 61 72 65 20 72 65 74 75 72  esults are retur
31190 6e 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ned according to
311a0 20 74 68 65 20 53 65 6c 65 63 74 44 65 73 74 20   the SelectDest 
311b0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 53 65  structure..** Se
311c0 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 73 71  e comments in sq
311d0 6c 69 74 65 49 6e 74 2e 68 20 66 6f 72 20 66 75  liteInt.h for fu
311e0 72 74 68 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f  rther informatio
311f0 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  n..**.** This ro
31200 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
31210 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
31220 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f  rs.  If any erro
31230 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e  rs are.** encoun
31240 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61  tered, then an a
31250 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
31260 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74   message is left
31270 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a   in.** pParse->z
31280 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
31290 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
312a0 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c  NOT free the Sel
312b0 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ect structure pa
312c0 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a  ssed in.  The.**
312d0 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
312e0 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68  n needs to do th
312f0 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  at..*/.int sqlit
31300 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  e3Select(.  Pars
31310 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
31320 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
31330 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
31340 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
31350 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
31360 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
31370 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53  ng coded. */.  S
31380 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
31390 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
313a0 20 64 6f 20 77 69 74 68 20 74 68 65 20 71 75 65   do with the que
313b0 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
313c0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
313d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
313e0 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
313f0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
31400 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  o;     /* Return
31410 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65   from sqlite3Whe
31420 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56  reBegin() */.  V
31430 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
31440 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72        /* The vir
31450 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64  tual machine und
31460 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
31470 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20  */.  int isAgg; 
31480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
31490 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c  rue for select l
314a0 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74  ists like "count
314b0 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69  (*)" */.  ExprLi
314c0 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 30 3b 20  st *pEList = 0; 
314d0 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75   /* List of colu
314e0 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20  mns to extract. 
314f0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
31500 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c  abList;     /* L
31510 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f  ist of tables to
31520 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a   select from */.
31530 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
31540 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
31550 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d  WHERE clause.  M
31560 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
31570 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
31580 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52  By;    /* The GR
31590 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
315a0 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
315b0 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20   Expr *pHaving; 
315c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48          /* The H
315d0 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d  AVING clause.  M
315e0 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
315f0 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20  int rc = 1;     
31600 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
31610 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74  to return from t
31620 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
31630 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 73 44    DistinctCtx sD
31640 69 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f  istinct; /* Info
31650 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20   on how to code 
31660 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
31670 77 6f 72 64 20 2a 2f 0a 20 20 53 6f 72 74 43 74  word */.  SortCt
31680 78 20 73 53 6f 72 74 3b 20 20 20 20 20 20 20 20  x sSort;        
31690 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20   /* Info on how 
316a0 74 6f 20 63 6f 64 65 20 74 68 65 20 4f 52 44 45  to code the ORDE
316b0 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
316c0 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66   AggInfo sAggInf
316d0 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72  o;      /* Infor
316e0 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61  mation used by a
316f0 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
31700 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20   */.  int iEnd; 
31710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31720 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 65  Address of the e
31730 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  nd of the query 
31740 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
31750 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
31760 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
31770 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
31780 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 4f 72 64  List *pMinMaxOrd
31790 65 72 42 79 20 3d 20 30 3b 20 20 2f 2a 20 41 64  erBy = 0;  /* Ad
317a0 64 65 64 20 4f 52 44 45 52 20 42 59 20 66 6f 72  ded ORDER BY for
317b0 20 6d 69 6e 2f 6d 61 78 20 71 75 65 72 69 65 73   min/max queries
317c0 20 2a 2f 0a 20 20 75 38 20 6d 69 6e 4d 61 78 46   */.  u8 minMaxF
317d0 6c 61 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  lag;            
317e0 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 66 6f 72       /* Flag for
317f0 20 6d 69 6e 2f 6d 61 78 20 71 75 65 72 69 65 73   min/max queries
31800 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61 72   */..  db = pPar
31810 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 73 71  se->db;.  v = sq
31820 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
31830 72 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  rse);.  if( p==0
31840 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
31850 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
31860 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75  nErr ){.    retu
31870 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
31880 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
31890 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
318a0 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
318b0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d   ) return 1;.  m
318c0 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c  emset(&sAggInfo,
318d0 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49   0, sizeof(sAggI
318e0 6e 66 6f 29 29 3b 0a 23 69 66 20 53 45 4c 45 43  nfo));.#if SELEC
318f0 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
31900 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70   SELECTTRACE(1,p
31910 50 61 72 73 65 2c 70 2c 20 28 22 62 65 67 69 6e  Parse,p, ("begin
31920 20 70 72 6f 63 65 73 73 69 6e 67 3a 5c 6e 22 2c   processing:\n",
31930 20 70 50 61 72 73 65 2d 3e 61 64 64 72 45 78 70   pParse->addrExp
31940 6c 61 69 6e 29 29 3b 0a 20 20 69 66 28 20 73 71  lain));.  if( sq
31950 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
31960 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20   & 0x100 ){.    
31970 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
31980 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
31990 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
319a0 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
319b0 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65  y==0 || pDest->e
319c0 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 46 69  Dest!=SRT_DistFi
319d0 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  fo );.  assert( 
319e0 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c  p->pOrderBy==0 |
319f0 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d  | pDest->eDest!=
31a00 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 61 73  SRT_Fifo );.  as
31a10 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
31a20 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65  y==0 || pDest->e
31a30 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 51 75  Dest!=SRT_DistQu
31a40 65 75 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  eue );.  assert(
31a50 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
31a60 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  || pDest->eDest!
31a70 3d 53 52 54 5f 51 75 65 75 65 20 29 3b 0a 20 20  =SRT_Queue );.  
31a80 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64  if( IgnorableOrd
31a90 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20  erby(pDest) ){. 
31aa0 20 20 20 61 73 73 65 72 74 28 70 44 65 73 74 2d     assert(pDest-
31ab0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73  >eDest==SRT_Exis
31ac0 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  ts || pDest->eDe
31ad0 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c  st==SRT_Union ||
31ae0 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65   .           pDe
31af0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
31b00 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e  xcept || pDest->
31b10 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61  eDest==SRT_Disca
31b20 72 64 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  rd ||.          
31b30 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
31b40 52 54 5f 51 75 65 75 65 20 20 7c 7c 20 70 44 65  RT_Queue  || pDe
31b50 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44  st->eDest==SRT_D
31b60 69 73 74 46 69 66 6f 20 7c 7c 0a 20 20 20 20 20  istFifo ||.     
31b70 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65        pDest->eDe
31b80 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75  st==SRT_DistQueu
31b90 65 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  e || pDest->eDes
31ba0 74 3d 3d 53 52 54 5f 46 69 66 6f 29 3b 0a 20 20  t==SRT_Fifo);.  
31bb0 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42 59    /* If ORDER BY
31bc0 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72   makes no differ
31bd0 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74 70  ence in the outp
31be0 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72 20  ut then neither 
31bf0 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53 54  does.    ** DIST
31c00 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20 62  INCT so it can b
31c10 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a  e removed too. *
31c20 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  /.    sqlite3Exp
31c30 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
31c40 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
31c50 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
31c60 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  0;.    p->selFla
31c70 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e  gs &= ~SF_Distin
31c80 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ct;.  }.  sqlite
31c90 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72  3SelectPrep(pPar
31ca0 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 69 66 28  se, p, 0);.  if(
31cb0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
31cc0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
31cd0 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  d ){.    goto se
31ce0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  lect_end;.  }.  
31cf0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
31d00 74 21 3d 30 20 29 3b 0a 23 69 66 20 53 45 4c 45  t!=0 );.#if SELE
31d10 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
31d20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
31d30 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30 34  ectTrace & 0x104
31d40 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52   ){.    SELECTTR
31d50 41 43 45 28 30 78 31 30 34 2c 70 50 61 72 73 65  ACE(0x104,pParse
31d60 2c 70 2c 20 28 22 61 66 74 65 72 20 6e 61 6d 65  ,p, ("after name
31d70 20 72 65 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29   resolution:\n")
31d80 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
31d90 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
31da0 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
31db0 66 0a 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  f..  if( pDest->
31dc0 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
31dd0 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  t ){.    generat
31de0 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
31df0 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 23 69  rse, p);.  }..#i
31e00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
31e10 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 69  T_WINDOWFUNC.  i
31e20 66 28 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  f( sqlite3Window
31e30 52 65 77 72 69 74 65 28 70 50 61 72 73 65 2c 20  Rewrite(pParse, 
31e40 70 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  p) ){.    goto s
31e50 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23  elect_end;.  }.#
31e60 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
31e70 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
31e80 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
31e90 26 20 30 78 31 30 38 20 29 7b 0a 20 20 20 20 53  & 0x108 ){.    S
31ea0 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 34  ELECTTRACE(0x104
31eb0 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 61 66 74  ,pParse,p, ("aft
31ec0 65 72 20 77 69 6e 64 6f 77 20 72 65 77 72 69 74  er window rewrit
31ed0 65 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c  e:\n"));.    sql
31ee0 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
31ef0 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
31f00 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f  .#endif.#endif /
31f10 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  * SQLITE_OMIT_WI
31f20 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20 20 70 54  NDOWFUNC */.  pT
31f30 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
31f40 3b 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e  ;.  isAgg = (p->
31f50 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
31f60 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 6d  gregate)!=0;.  m
31f70 65 6d 73 65 74 28 26 73 53 6f 72 74 2c 20 30 2c  emset(&sSort, 0,
31f80 20 73 69 7a 65 6f 66 28 73 53 6f 72 74 29 29 3b   sizeof(sSort));
31f90 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  .  sSort.pOrderB
31fa0 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
31fb0 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 76 61  ..  /* Try to va
31fc0 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69  rious optimizati
31fd0 6f 6e 73 20 28 66 6c 61 74 74 65 6e 69 6e 67 20  ons (flattening 
31fe0 73 75 62 71 75 65 72 69 65 73 2c 20 61 6e 64 20  subqueries, and 
31ff0 73 74 72 65 6e 67 74 68 0a 20 20 2a 2a 20 72 65  strength.  ** re
32000 64 75 63 74 69 6f 6e 20 6f 66 20 6a 6f 69 6e 20  duction of join 
32010 6f 70 65 72 61 74 6f 72 73 29 20 69 6e 20 74 68  operators) in th
32020 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 75 70  e FROM clause up
32030 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 71   into the main q
32040 75 65 72 79 0a 20 20 2a 2f 0a 23 69 66 20 21 64  uery.  */.#if !d
32050 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
32060 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
32070 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
32080 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72  OMIT_VIEW).  for
32090 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72  (i=0; !p->pPrior
320a0 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e   && i<pTabList->
320b0 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
320c0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
320d0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54  tem *pItem = &pT
320e0 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20  abList->a[i];.  
320f0 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d    Select *pSub =
32100 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b   pItem->pSelect;
32110 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
32120 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
32130 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  .    /* Convert 
32140 4c 45 46 54 20 4a 4f 49 4e 20 69 6e 74 6f 20 4a  LEFT JOIN into J
32150 4f 49 4e 20 69 66 20 74 68 65 72 65 20 61 72 65  OIN if there are
32160 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 72 69   terms of the ri
32170 67 68 74 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  ght table.    **
32180 20 6f 66 20 74 68 65 20 4c 45 46 54 20 4a 4f 49   of the LEFT JOI
32190 4e 20 75 73 65 64 20 69 6e 20 74 68 65 20 57 48  N used in the WH
321a0 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 20 20  ERE clause..    
321b0 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49 74 65  */.    if( (pIte
321c0 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  m->fg.jointype &
321d0 20 4a 54 5f 4c 45 46 54 29 21 3d 30 0a 20 20 20   JT_LEFT)!=0.   
321e0 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
321f0 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52 6f  ImpliesNonNullRo
32200 77 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74  w(p->pWhere, pIt
32210 65 6d 2d 3e 69 43 75 72 73 6f 72 29 0a 20 20 20  em->iCursor).   
32220 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
32230 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
32240 49 54 45 5f 53 69 6d 70 6c 69 66 79 4a 6f 69 6e  ITE_SimplifyJoin
32250 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 53  ).    ){.      S
32260 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30  ELECTTRACE(0x100
32270 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20 20 20 20  ,pParse,p,.     
32280 20 20 20 20 20 20 20 20 20 20 20 28 22 4c 45 46             ("LEF
32290 54 2d 4a 4f 49 4e 20 73 69 6d 70 6c 69 66 69 65  T-JOIN simplifie
322a0 73 20 74 6f 20 4a 4f 49 4e 20 6f 6e 20 74 65 72  s to JOIN on ter
322b0 6d 20 25 64 5c 6e 22 2c 69 29 29 3b 0a 20 20 20  m %d\n",i));.   
322c0 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69     pItem->fg.joi
322d0 6e 74 79 70 65 20 26 3d 20 7e 28 4a 54 5f 4c 45  ntype &= ~(JT_LE
322e0 46 54 7c 4a 54 5f 4f 55 54 45 52 29 3b 0a 20 20  FT|JT_OUTER);.  
322f0 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70      unsetJoinExp
32300 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74  r(p->pWhere, pIt
32310 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
32320 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20 66    }..    /* No f
32330 75 74 68 65 72 20 61 63 74 69 6f 6e 20 69 66 20  uther action if 
32340 74 68 69 73 20 74 65 72 6d 20 6f 66 20 74 68 65  this term of the
32350 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
32360 6e 6f 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f  no a subquery */
32370 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30  .    if( pSub==0
32380 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
32390 20 20 2f 2a 20 43 61 74 63 68 20 6d 69 73 6d 61    /* Catch misma
323a0 74 63 68 20 69 6e 20 74 68 65 20 64 65 63 6c 61  tch in the decla
323b0 72 65 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61  red columns of a
323c0 20 76 69 65 77 20 61 6e 64 20 74 68 65 20 6e 75   view and the nu
323d0 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 63  mber of.    ** c
323e0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 53 45  olumns in the SE
323f0 4c 45 43 54 20 6f 6e 20 74 68 65 20 52 48 53 20  LECT on the RHS 
32400 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  */.    if( pTab-
32410 3e 6e 43 6f 6c 21 3d 70 53 75 62 2d 3e 70 45 4c  >nCol!=pSub->pEL
32420 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
32430 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
32440 4d 73 67 28 70 50 61 72 73 65 2c 20 22 65 78 70  Msg(pParse, "exp
32450 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73  ected %d columns
32460 20 66 6f 72 20 27 25 73 27 20 62 75 74 20 67 6f   for '%s' but go
32470 74 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  t %d",.         
32480 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
32490 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 7a  b->nCol, pTab->z
324a0 4e 61 6d 65 2c 20 70 53 75 62 2d 3e 70 45 4c 69  Name, pSub->pELi
324b0 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
324c0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
324d0 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  d;.    }..    /*
324e0 20 44 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 66   Do not try to f
324f0 6c 61 74 74 65 6e 20 61 6e 20 61 67 67 72 65 67  latten an aggreg
32500 61 74 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  ate subquery..  
32510 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6c 61 74    **.    ** Flat
32520 74 65 6e 69 6e 67 20 61 6e 20 61 67 67 72 65 67  tening an aggreg
32530 61 74 65 20 73 75 62 71 75 65 72 79 20 69 73 20  ate subquery is 
32540 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66  only possible if
32550 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
32560 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61  .    ** is not a
32570 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66 20 74   join.  But if t
32580 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
32590 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2c 20 74 68  s not a join, th
325a0 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 79 0a  en the subquery.
325b0 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 69      ** will be i
325c0 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
325d0 63 6f 2d 72 6f 75 74 69 6e 65 20 61 6e 64 20 74  co-routine and t
325e0 68 65 72 65 20 69 73 20 6e 6f 20 61 64 76 61 6e  here is no advan
325f0 74 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 66  tage to.    ** f
32600 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 74 68 61  lattening in tha
32610 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  t case..    */. 
32620 20 20 20 69 66 28 20 28 70 53 75 62 2d 3e 73 65     if( (pSub->se
32630 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
32640 65 67 61 74 65 29 21 3d 30 20 29 20 63 6f 6e 74  egate)!=0 ) cont
32650 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
32660 28 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79  ( pSub->pGroupBy
32670 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ==0 );..    /* I
32680 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
32690 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 22 63 6f  y contains a "co
326a0 6d 70 6c 65 78 22 20 72 65 73 75 6c 74 20 73 65  mplex" result se
326b0 74 20 28 74 68 61 74 20 69 73 2c 0a 20 20 20 20  t (that is,.    
326c0 2a 2a 20 69 66 20 74 68 65 20 72 65 73 75 6c 74  ** if the result
326d0 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65   set of the oute
326e0 72 20 71 75 65 72 79 20 75 73 65 73 20 66 75 6e  r query uses fun
326f0 63 74 69 6f 6e 73 20 6f 72 20 73 75 62 71 75 65  ctions or subque
32700 72 69 65 73 29 0a 20 20 20 20 2a 2a 20 61 6e 64  ries).    ** and
32710 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
32720 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 4f 52 44   contains an ORD
32730 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
32740 20 69 66 0a 20 20 20 20 2a 2a 20 69 74 20 77 69   if.    ** it wi
32750 6c 6c 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65  ll be implemente
32760 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e  d as a co-routin
32770 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66  e, then do not f
32780 6c 61 74 74 65 6e 2e 20 20 54 68 69 73 0a 20 20  latten.  This.  
32790 20 20 2a 2a 20 72 65 73 74 72 69 63 74 69 6f 6e    ** restriction
327a0 20 61 6c 6c 6f 77 73 20 53 51 4c 20 63 6f 6e 73   allows SQL cons
327b0 74 72 75 63 74 73 20 6c 69 6b 65 20 74 68 69 73  tructs like this
327c0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
327d0 20 53 45 4c 45 43 54 20 65 78 70 65 6e 73 69 76   SELECT expensiv
327e0 65 5f 66 75 6e 63 74 69 6f 6e 28 78 29 0a 20 20  e_function(x).  
327f0 20 20 2a 2a 20 20 20 20 46 52 4f 4d 20 28 53 45    **    FROM (SE
32800 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 20  LECT x FROM tab 
32810 4f 52 44 45 52 20 42 59 20 79 20 4c 49 4d 49 54  ORDER BY y LIMIT
32820 20 31 30 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20   10);.    **.   
32830 20 2a 2a 20 54 68 65 20 65 78 70 65 6e 73 69 76   ** The expensiv
32840 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69 73 20  e_function() is 
32850 6f 6e 6c 79 20 63 6f 6d 70 75 74 65 64 20 6f 6e  only computed on
32860 20 74 68 65 20 31 30 20 72 6f 77 73 20 74 68 61   the 10 rows tha
32870 74 0a 20 20 20 20 2a 2a 20 61 72 65 20 6f 75 74  t.    ** are out
32880 70 75 74 2c 20 72 61 74 68 65 72 20 74 68 61 6e  put, rather than
32890 20 65 76 65 72 79 20 72 6f 77 20 6f 66 20 74 68   every row of th
328a0 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a  e table..    **.
328b0 20 20 20 20 2a 2a 20 54 68 65 20 72 65 71 75 69      ** The requi
328c0 72 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20  rement that the 
328d0 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 76 65  outer query have
328e0 20 61 20 63 6f 6d 70 6c 65 78 20 72 65 73 75 6c   a complex resul
328f0 74 20 73 65 74 0a 20 20 20 20 2a 2a 20 6d 65 61  t set.    ** mea
32900 6e 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69  ns that flatteni
32910 6e 67 20 64 6f 65 73 20 6f 63 63 75 72 20 6f 6e  ng does occur on
32920 20 73 69 6d 70 6c 65 72 20 53 51 4c 20 63 6f 6e   simpler SQL con
32930 73 74 72 61 69 6e 74 73 20 77 69 74 68 6f 75 74  straints without
32940 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 78 70 65  .    ** the expe
32950 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28 29  nsive_function()
32960 20 6c 69 6b 65 3a 0a 20 20 20 20 2a 2a 0a 20 20   like:.    **.  
32970 20 20 2a 2a 20 20 53 45 4c 45 43 54 20 78 20 46    **  SELECT x F
32980 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 20 46 52  ROM (SELECT x FR
32990 4f 4d 20 74 61 62 20 4f 52 44 45 52 20 42 59 20  OM tab ORDER BY 
329a0 79 20 4c 49 4d 49 54 20 31 30 29 3b 0a 20 20 20  y LIMIT 10);.   
329b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62   */.    if( pSub
329c0 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 0a 20 20  ->pOrderBy!=0.  
329d0 20 20 20 26 26 20 69 3d 3d 30 0a 20 20 20 20 20     && i==0.     
329e0 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  && (p->selFlags 
329f0 26 20 53 46 5f 43 6f 6d 70 6c 65 78 52 65 73 75  & SF_ComplexResu
32a00 6c 74 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  lt)!=0.     && (
32a10 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d  pTabList->nSrc==
32a20 31 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70  1.         || (p
32a30 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66 67  TabList->a[1].fg
32a40 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f 4c 45  .jointype&(JT_LE
32a50 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30  FT|JT_CROSS))!=0
32a60 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63  ).    ){.      c
32a70 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a  ontinue;.    }..
32a80 20 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53      if( flattenS
32a90 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20  ubquery(pParse, 
32aa0 70 2c 20 69 2c 20 69 73 41 67 67 29 20 29 7b 0a  p, i, isAgg) ){.
32ab0 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
32ac0 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 73 65  ->nErr ) goto se
32ad0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
32ae0 2f 2a 20 54 68 69 73 20 73 75 62 71 75 65 72 79  /* This subquery
32af0 20 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64   can be absorbed
32b00 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74   into its parent
32b10 2e 20 2a 2f 0a 20 20 20 20 20 20 69 20 3d 20 2d  . */.      i = -
32b20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  1;.    }.    pTa
32b30 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
32b40 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
32b50 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
32b60 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
32b70 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f   if( !IgnorableO
32b80 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b  rderby(pDest) ){
32b90 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72  .      sSort.pOr
32ba0 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
32bb0 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  rBy;.    }.  }.#
32bc0 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
32bd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
32be0 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20  UND_SELECT.  /* 
32bf0 48 61 6e 64 6c 65 20 63 6f 6d 70 6f 75 6e 64 20  Handle compound 
32c00 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
32c10 73 20 75 73 69 6e 67 20 74 68 65 20 73 65 70 61  s using the sepa
32c20 72 61 74 65 20 6d 75 6c 74 69 53 65 6c 65 63 74  rate multiSelect
32c30 28 29 0a 20 20 2a 2a 20 70 72 6f 63 65 64 75 72  ().  ** procedur
32c40 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  e..  */.  if( p-
32c50 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72  >pPrior ){.    r
32c60 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  c = multiSelect(
32c70 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74  pParse, p, pDest
32c80 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  );.#if SELECTTRA
32c90 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 53  CE_ENABLED.    S
32ca0 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 2c 70  ELECTTRACE(0x1,p
32cb0 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 63 6f  Parse,p,("end co
32cc0 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70 72  mpound-select pr
32cd0 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20  ocessing\n"));. 
32ce0 20 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 53     if( (sqlite3S
32cf0 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 32  electTrace & 0x2
32d00 30 30 30 29 21 3d 30 20 26 26 20 45 78 70 6c 61  000)!=0 && Expla
32d10 69 6e 51 75 65 72 79 50 6c 61 6e 50 61 72 65 6e  inQueryPlanParen
32d20 74 28 70 50 61 72 73 65 29 3d 3d 30 20 29 7b 0a  t(pParse)==0 ){.
32d30 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
32d40 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
32d50 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , 0);.    }.#end
32d60 69 66 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4e  if.    if( p->pN
32d70 65 78 74 3d 3d 30 20 29 20 45 78 70 6c 61 69 6e  ext==0 ) Explain
32d80 51 75 65 72 79 50 6c 61 6e 50 6f 70 28 70 50 61  QueryPlanPop(pPa
32d90 72 73 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  rse);.    return
32da0 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
32db0 0a 20 20 2f 2a 20 44 6f 20 74 68 65 20 57 48 45  .  /* Do the WHE
32dc0 52 45 2d 63 6c 61 75 73 65 20 63 6f 6e 73 74 61  RE-clause consta
32dd0 6e 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6f  nt propagation o
32de0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 74  ptimization if t
32df0 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 6a 6f  his is.  ** a jo
32e00 69 6e 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20  in.  No need to 
32e10 73 70 65 65 64 20 74 69 6d 65 20 6f 6e 20 74 68  speed time on th
32e20 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 66 6f 72  is operation for
32e30 20 6e 6f 6e 2d 6a 6f 69 6e 20 71 75 65 72 69 65   non-join querie
32e40 73 0a 20 20 2a 2a 20 61 73 20 74 68 65 20 65 71  s.  ** as the eq
32e50 75 69 76 61 6c 65 6e 74 20 6f 70 74 69 6d 69 7a  uivalent optimiz
32e60 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 68 61  ation will be ha
32e70 6e 64 6c 65 64 20 62 79 20 71 75 65 72 79 20 70  ndled by query p
32e80 6c 61 6e 6e 65 72 20 69 6e 0a 20 20 2a 2a 20 73  lanner in.  ** s
32e90 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
32ea0 28 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ()..  */.  if( p
32eb0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 0a  TabList->nSrc>1.
32ec0 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
32ed0 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
32ee0 4c 49 54 45 5f 50 72 6f 70 61 67 61 74 65 43 6f  LITE_PropagateCo
32ef0 6e 73 74 29 0a 20 20 20 26 26 20 70 72 6f 70 61  nst).   && propa
32f00 67 61 74 65 43 6f 6e 73 74 61 6e 74 73 28 70 50  gateConstants(pP
32f10 61 72 73 65 2c 20 70 29 0a 20 20 29 7b 0a 23 69  arse, p).  ){.#i
32f20 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
32f30 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71  ABLED.    if( sq
32f40 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
32f50 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20   & 0x100 ){.    
32f60 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
32f70 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41  100,pParse,p,("A
32f80 66 74 65 72 20 63 6f 6e 73 74 61 6e 74 20 70 72  fter constant pr
32f90 6f 70 61 67 61 74 69 6f 6e 3a 5c 6e 22 29 29 3b  opagation:\n"));
32fa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
32fb0 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
32fc0 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  p, 0);.    }.#en
32fd0 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
32fe0 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
32ff0 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 43 6f  00,pParse,p,("Co
33000 6e 73 74 61 6e 74 20 70 72 6f 70 61 67 61 74 69  nstant propagati
33010 6f 6e 20 6e 6f 74 20 68 65 6c 70 66 75 6c 5c 6e  on not helpful\n
33020 22 29 29 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  "));.  }..#ifdef
33030 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56   SQLITE_COUNTOFV
33040 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IEW_OPTIMIZATION
33050 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74  .  if( Optimizat
33060 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
33070 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74  QLITE_QueryFlatt
33080 65 6e 65 72 7c 53 51 4c 49 54 45 5f 43 6f 75 6e  ener|SQLITE_Coun
33090 74 4f 66 56 69 65 77 29 0a 20 20 20 26 26 20 63  tOfView).   && c
330a0 6f 75 6e 74 4f 66 56 69 65 77 4f 70 74 69 6d 69  ountOfViewOptimi
330b0 7a 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  zation(pParse, p
330c0 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 64  ).  ){.    if( d
330d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
330e0 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
330f0 64 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20  d;.    pEList = 
33100 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 70  p->pEList;.    p
33110 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
33120 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  c;.  }.#endif.. 
33130 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 74 65 72   /* For each ter
33140 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  m in the FROM cl
33150 61 75 73 65 2c 20 64 6f 20 74 77 6f 20 74 68 69  ause, do two thi
33160 6e 67 73 3a 0a 20 20 2a 2a 20 28 31 29 20 41 75  ngs:.  ** (1) Au
33170 74 68 6f 72 69 7a 65 64 20 75 6e 72 65 66 65 72  thorized unrefer
33180 65 6e 63 65 64 20 74 61 62 6c 65 73 0a 20 20 2a  enced tables.  *
33190 2a 20 28 32 29 20 47 65 6e 65 72 61 74 65 20 63  * (2) Generate c
331a0 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d  ode for all sub-
331b0 71 75 65 72 69 65 73 0a 20 20 2a 2f 0a 20 20 66  queries.  */.  f
331c0 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
331d0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
331e0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
331f0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
33200 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d   &pTabList->a[i]
33210 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73 74  ;.    SelectDest
33220 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63   dest;.    Selec
33230 74 20 2a 70 53 75 62 3b 0a 23 69 66 20 21 64 65  t *pSub;.#if !de
33240 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
33250 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
33260 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
33270 4d 49 54 5f 56 49 45 57 29 0a 20 20 20 20 63 6f  MIT_VIEW).    co
33280 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64  nst char *zSaved
33290 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 23 65 6e  AuthContext;.#en
332a0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 73 73 75  dif..    /* Issu
332b0 65 20 53 51 4c 49 54 45 5f 52 45 41 44 20 61 75  e SQLITE_READ au
332c0 74 68 6f 72 69 7a 61 74 69 6f 6e 73 20 77 69 74  thorizations wit
332d0 68 20 61 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20  h a fake column 
332e0 6e 61 6d 65 20 66 6f 72 20 61 6e 79 0a 20 20 20  name for any.   
332f0 20 2a 2a 20 74 61 62 6c 65 73 20 74 68 61 74 20   ** tables that 
33300 61 72 65 20 72 65 66 65 72 65 6e 63 65 64 20 62  are referenced b
33310 75 74 20 66 72 6f 6d 20 77 68 69 63 68 20 6e 6f  ut from which no
33320 20 76 61 6c 75 65 73 20 61 72 65 20 65 78 74 72   values are extr
33330 61 63 74 65 64 2e 0a 20 20 20 20 2a 2a 20 45 78  acted..    ** Ex
33340 61 6d 70 6c 65 73 20 6f 66 20 77 68 65 72 65 20  amples of where 
33350 74 68 65 73 65 20 6b 69 6e 64 73 20 6f 66 20 6e  these kinds of n
33360 75 6c 6c 20 53 51 4c 49 54 45 5f 52 45 41 44 20  ull SQLITE_READ 
33370 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 73 0a 20  authorizations. 
33380 20 20 20 2a 2a 20 77 6f 75 6c 64 20 6f 63 63 75     ** would occu
33390 72 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  r:.    **.    **
333a0 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e       SELECT coun
333b0 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  t(*) FROM t1;   
333c0 2d 2d 20 53 51 4c 49 54 45 5f 52 45 41 44 20 74  -- SQLITE_READ t
333d0 31 2e 22 22 0a 20 20 20 20 2a 2a 20 20 20 20 20  1."".    **     
333e0 53 45 4c 45 43 54 20 74 31 2e 2a 20 46 52 4f 4d  SELECT t1.* FROM
333f0 20 74 31 2c 20 74 32 3b 20 20 20 2d 2d 20 53 51   t1, t2;   -- SQ
33400 4c 49 54 45 5f 52 45 41 44 20 74 32 2e 22 22 0a  LITE_READ t2."".
33410 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
33420 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61  e fake column na
33430 6d 65 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73  me is an empty s
33440 74 72 69 6e 67 2e 20 20 49 74 20 69 73 20 70 6f  tring.  It is po
33450 73 73 69 62 6c 65 20 66 6f 72 20 61 20 74 61 62  ssible for a tab
33460 6c 65 20 74 6f 0a 20 20 20 20 2a 2a 20 68 61 76  le to.    ** hav
33470 65 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64  e a column named
33480 20 62 79 20 74 68 65 20 65 6d 70 74 79 20 73 74   by the empty st
33490 72 69 6e 67 2c 20 69 6e 20 77 68 69 63 68 20 63  ring, in which c
334a0 61 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ase there is no 
334b0 77 61 79 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69  way to.    ** di
334c0 73 74 69 6e 67 75 69 73 68 20 62 65 74 77 65 65  stinguish betwee
334d0 6e 20 61 6e 20 75 6e 72 65 66 65 72 65 6e 63 65  n an unreference
334e0 64 20 74 61 62 6c 65 20 61 6e 64 20 61 6e 20 61  d table and an a
334f0 63 74 75 61 6c 20 72 65 66 65 72 65 6e 63 65 20  ctual reference 
33500 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 22 22  to the.    ** ""
33510 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 20 6f 72 69   column. The ori
33520 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 77 61 73  ginal design was
33530 20 66 6f 72 20 74 68 65 20 66 61 6b 65 20 63 6f   for the fake co
33540 6c 75 6d 6e 20 6e 61 6d 65 20 74 6f 20 62 65 20  lumn name to be 
33550 61 20 4e 55 4c 4c 2c 0a 20 20 20 20 2a 2a 20 77  a NULL,.    ** w
33560 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20 75 6e  hich would be un
33570 61 6d 62 69 67 75 6f 75 73 2e 20 20 42 75 74 20  ambiguous.  But 
33580 6c 65 67 61 63 79 20 61 75 74 68 6f 72 69 7a 61  legacy authoriza
33590 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 73 20 6d  tion callbacks m
335a0 69 67 68 74 0a 20 20 20 20 2a 2a 20 61 73 73 75  ight.    ** assu
335b0 6d 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  me the column na
335c0 6d 65 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61  me is non-NULL a
335d0 6e 64 20 73 65 67 66 61 75 6c 74 2e 20 20 54 68  nd segfault.  Th
335e0 65 20 75 73 65 20 6f 66 20 61 6e 20 65 6d 70 74  e use of an empt
335f0 79 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e 67 20  y.    ** string 
33600 66 6f 72 20 74 68 65 20 66 61 6b 65 20 63 6f 6c  for the fake col
33610 75 6d 6e 20 6e 61 6d 65 20 73 65 65 6d 73 20 73  umn name seems s
33620 61 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  afer..    */.   
33630 20 69 66 28 20 70 49 74 65 6d 2d 3e 63 6f 6c 55   if( pItem->colU
33640 73 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sed==0 ){.      
33650 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
33660 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
33670 52 45 41 44 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  READ, pItem->zNa
33680 6d 65 2c 20 22 22 2c 20 70 49 74 65 6d 2d 3e 7a  me, "", pItem->z
33690 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 7d  Database);.    }
336a0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
336b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
336c0 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
336d0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
336e0 57 29 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  W).    /* Genera
336f0 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20  te code for all 
33700 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74  sub-queries in t
33710 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
33720 20 20 20 2a 2f 0a 20 20 20 20 70 53 75 62 20 3d     */.    pSub =
33730 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b   pItem->pSelect;
33740 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30  .    if( pSub==0
33750 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
33760 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 66 6f    /* The code fo
33770 72 20 61 20 73 75 62 71 75 65 72 79 20 73 68 6f  r a subquery sho
33780 75 6c 64 20 6f 6e 6c 79 20 62 65 20 67 65 6e 65  uld only be gene
33790 72 61 74 65 64 20 6f 6e 63 65 2c 20 74 68 6f 75  rated once, thou
337a0 67 68 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20  gh it is.    ** 
337b0 74 65 63 68 6e 69 63 61 6c 6c 79 20 68 61 72 6d  technically harm
337c0 6c 65 73 73 20 66 6f 72 20 69 74 20 74 6f 20 62  less for it to b
337d0 65 20 67 65 6e 65 72 61 74 65 64 20 6d 75 6c 74  e generated mult
337e0 69 70 6c 65 20 74 69 6d 65 73 2e 20 54 68 65 0a  iple times. The.
337f0 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
33800 20 61 73 73 65 72 74 28 29 20 77 69 6c 6c 20 64   assert() will d
33810 65 74 65 63 74 20 69 66 20 73 6f 6d 65 74 68 69  etect if somethi
33820 6e 67 20 63 68 61 6e 67 65 73 20 74 6f 20 63 61  ng changes to ca
33830 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  use.    ** the s
33840 61 6d 65 20 73 75 62 71 75 65 72 79 20 74 6f 20  ame subquery to 
33850 62 65 20 63 6f 64 65 64 20 6d 75 6c 74 69 70 6c  be coded multipl
33860 65 20 74 69 6d 65 73 2c 20 61 73 20 61 20 73 69  e times, as a si
33870 67 6e 61 6c 20 74 6f 20 74 68 65 0a 20 20 20 20  gnal to the.    
33880 2a 2a 20 64 65 76 65 6c 6f 70 65 72 73 20 74 6f  ** developers to
33890 20 74 72 79 20 74 6f 20 6f 70 74 69 6d 69 7a 65   try to optimize
338a0 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e 2e 20   the situation. 
338b0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
338c0 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
338d0 62 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  b==0 );..    /* 
338e0 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e  Increment Parse.
338f0 6e 48 65 69 67 68 74 20 62 79 20 74 68 65 20 68  nHeight by the h
33900 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72  eight of the lar
33910 67 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a  gest expression.
33920 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65      ** tree refe
33930 72 72 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c  rred to by this,
33940 20 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65   the parent sele
33950 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65  ct. The child se
33960 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20  lect.    ** may 
33970 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69  contain expressi
33980 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d  on trees of at m
33990 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49  ost.    ** (SQLI
339a0 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
339b0 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29  H-Parse.nHeight)
339c0 20 68 65 69 67 68 74 2e 20 54 68 69 73 20 69 73   height. This is
339d0 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f   a bit.    ** mo
339e0 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20  re conservative 
339f0 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20  than necessary, 
33a00 62 75 74 20 6d 75 63 68 20 65 61 73 69 65 72 20  but much easier 
33a10 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20  than enforcing. 
33a20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c     ** an exact l
33a30 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  imit..    */.   
33a40 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74   pParse->nHeight
33a50 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63   += sqlite3Selec
33a60 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a  tExprHeight(p);.
33a70 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 63 6f 70  .    /* Make cop
33a80 69 65 73 20 6f 66 20 63 6f 6e 73 74 61 6e 74 20  ies of constant 
33a90 57 48 45 52 45 2d 63 6c 61 75 73 65 20 74 65 72  WHERE-clause ter
33aa0 6d 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  ms in the outer 
33ab0 71 75 65 72 79 20 64 6f 77 6e 0a 20 20 20 20 2a  query down.    *
33ac0 2a 20 69 6e 73 69 64 65 20 74 68 65 20 73 75 62  * inside the sub
33ad0 71 75 65 72 79 2e 20 20 54 68 69 73 20 63 61 6e  query.  This can
33ae0 20 68 65 6c 70 20 74 68 65 20 73 75 62 71 75 65   help the subque
33af0 72 79 20 74 6f 20 72 75 6e 20 6d 6f 72 65 20 65  ry to run more e
33b00 66 66 69 63 69 65 6e 74 6c 79 2e 0a 20 20 20 20  fficiently..    
33b10 2a 2f 0a 20 20 20 20 69 66 28 20 4f 70 74 69 6d  */.    if( Optim
33b20 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64  izationEnabled(d
33b30 62 2c 20 53 51 4c 49 54 45 5f 50 75 73 68 44 6f  b, SQLITE_PushDo
33b40 77 6e 29 0a 20 20 20 20 20 26 26 20 70 75 73 68  wn).     && push
33b50 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 70  DownWhereTerms(p
33b60 50 61 72 73 65 2c 20 70 53 75 62 2c 20 70 2d 3e  Parse, pSub, p->
33b70 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69  pWhere, pItem->i
33b80 43 75 72 73 6f 72 2c 0a 20 20 20 20 20 20 20 20  Cursor,.        
33b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33ba0 20 20 20 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f     (pItem->fg.jo
33bb0 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
33bc0 52 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 23 69  R)!=0).    ){.#i
33bd0 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
33be0 41 42 4c 45 44 0a 20 20 20 20 20 20 69 66 28 20  ABLED.      if( 
33bf0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
33c00 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20  ce & 0x100 ){.  
33c10 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43        SELECTTRAC
33c20 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70  E(0x100,pParse,p
33c30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 22  ,.            ("
33c40 41 66 74 65 72 20 57 48 45 52 45 2d 63 6c 61 75  After WHERE-clau
33c50 73 65 20 70 75 73 68 2d 64 6f 77 6e 20 69 6e 74  se push-down int
33c60 6f 20 73 75 62 71 75 65 72 79 20 25 64 3a 5c 6e  o subquery %d:\n
33c70 22 2c 20 70 53 75 62 2d 3e 73 65 6c 49 64 29 29  ", pSub->selId))
33c80 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
33c90 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
33ca0 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, p, 0);.      
33cb0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  }.#endif.    }el
33cc0 73 65 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  se{.      SELECT
33cd0 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72  TRACE(0x100,pPar
33ce0 73 65 2c 70 2c 28 22 50 75 73 68 2d 64 6f 77 6e  se,p,("Push-down
33cf0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 5c 6e 22   not possible\n"
33d00 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7a  ));.    }..    z
33d10 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
33d20 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68   = pParse->zAuth
33d30 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70 50 61  Context;.    pPa
33d40 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
33d50 74 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  t = pItem->zName
33d60 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ;..    /* Genera
33d70 74 65 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65  te code to imple
33d80 6d 65 6e 74 20 74 68 65 20 73 75 62 71 75 65 72  ment the subquer
33d90 79 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  y.    **.    ** 
33da0 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
33db0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
33dc0 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 66 20 74   co-routine if t
33dd0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 0a 20  he subquery is. 
33de0 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64     ** guaranteed
33df0 20 74 6f 20 62 65 20 74 68 65 20 6f 75 74 65 72   to be the outer
33e00 20 6c 6f 6f 70 20 28 73 6f 20 74 68 61 74 20 69   loop (so that i
33e10 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
33e20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 6d  to be.    ** com
33e30 70 75 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 20  puted more than 
33e40 6f 6e 63 65 29 0a 20 20 20 20 2a 2a 0a 20 20 20  once).    **.   
33e50 20 2a 2a 20 54 4f 44 4f 3a 20 41 72 65 20 74 68   ** TODO: Are th
33e60 65 72 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e  ere other reason
33e70 73 20 62 65 73 69 64 65 20 28 31 29 20 74 6f 20  s beside (1) to 
33e80 75 73 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65  use a co-routine
33e90 0a 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e  .    ** implemen
33ea0 74 61 74 69 6f 6e 3f 0a 20 20 20 20 2a 2f 0a 20  tation?.    */. 
33eb0 20 20 20 69 66 28 20 69 3d 3d 30 0a 20 20 20 20     if( i==0.    
33ec0 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e   && (pTabList->n
33ed0 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20  Src==1.         
33ee0 20 20 20 7c 7c 20 28 70 54 61 62 4c 69 73 74 2d     || (pTabList-
33ef0 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70  >a[1].fg.jointyp
33f00 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52  e&(JT_LEFT|JT_CR
33f10 4f 53 53 29 29 21 3d 30 29 20 20 2f 2a 20 28 31  OSS))!=0)  /* (1
33f20 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20  ) */.    ){.    
33f30 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61    /* Implement a
33f40 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74   co-routine that
33f50 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 73   will return a s
33f60 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
33f70 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a   result.      **
33f80 20 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e 76   set on each inv
33f90 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  ocation..      *
33fa0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
33fb0 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
33fc0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
33fd0 31 3b 0a 20 20 20 20 20 0a 20 20 20 20 20 20 70  1;.     .      p
33fe0 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
33ff0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
34000 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
34010 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
34020 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 70  InitCoroutine, p
34030 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c  Item->regReturn,
34040 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20   0, addrTop);.  
34050 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
34060 28 76 2c 20 22 25 73 22 2c 20 70 49 74 65 6d 2d  (v, "%s", pItem-
34070 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
34080 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64        pItem->add
34090 72 46 69 6c 6c 53 75 62 20 3d 20 61 64 64 72 54  rFillSub = addrT
340a0 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  op;.      sqlite
340b0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
340c0 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75  &dest, SRT_Corou
340d0 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67  tine, pItem->reg
340e0 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 45  Return);.      E
340f0 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
34100 28 70 50 61 72 73 65 2c 20 31 2c 20 22 43 4f 2d  (pParse, 1, "CO-
34110 52 4f 55 54 49 4e 45 20 25 75 22 2c 20 70 53 75  ROUTINE %u", pSu
34120 62 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20 20 20  b->selId));.    
34130 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
34140 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64  pParse, pSub, &d
34150 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65  est);.      pIte
34160 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67  m->pTab->nRowLog
34170 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e 53 65 6c  Est = pSub->nSel
34180 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 70 49  ectRow;.      pI
34190 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75  tem->fg.viaCorou
341a0 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  tine = 1;.      
341b0 70 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74  pItem->regResult
341c0 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20   = dest.iSdst;. 
341d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
341e0 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20  EndCoroutine(v, 
341f0 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
34200 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
34210 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
34220 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20 20 20  addrTop-1);.    
34230 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65    sqlite3ClearTe
34240 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73  mpRegCache(pPars
34250 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
34260 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
34270 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
34280 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20  at will fill an 
34290 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
342a0 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 74 68  with.      ** th
342b0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69  e content of thi
342c0 73 20 73 75 62 71 75 65 72 79 2e 20 20 70 49 74  s subquery.  pIt
342d0 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
342e0 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20  will point.     
342f0 20 2a 2a 20 74 6f 20 74 68 65 20 61 64 64 72 65   ** to the addre
34300 73 73 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61  ss of the genera
34310 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  ted subroutine. 
34320 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
34330 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20  n.      ** is a 
34340 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61 74  register allocat
34350 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 73  ed to hold the s
34360 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  ubroutine return
34370 20 61 64 64 72 65 73 73 0a 20 20 20 20 20 20 2a   address.      *
34380 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70 41  /.      int topA
34390 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f  ddr;.      int o
343a0 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a 20 20 20  nceAddr = 0;.   
343b0 20 20 20 69 6e 74 20 72 65 74 41 64 64 72 3b 0a     int retAddr;.
343c0 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
343d0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 50 72 69 6f  List_item *pPrio
343e0 72 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  r;..      assert
343f0 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  ( pItem->addrFil
34400 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  lSub==0 );.     
34410 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
34420 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
34430 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41 64 64  em;.      topAdd
34440 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
34450 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
34460 67 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72  ger, 0, pItem->r
34470 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20  egReturn);.     
34480 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
34490 53 75 62 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b  Sub = topAddr+1;
344a0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
344b0 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65  ->fg.isCorrelate
344c0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
344d0 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71 75 65  /* If the subque
344e0 72 79 20 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c  ry is not correl
344f0 61 74 65 64 20 61 6e 64 20 69 66 20 77 65 20 61  ated and if we a
34500 72 65 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66  re not inside of
34510 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72  .        ** a tr
34520 69 67 67 65 72 2c 20 74 68 65 6e 20 77 65 20 6f  igger, then we o
34530 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70  nly need to comp
34540 75 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ute the value of
34550 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20 20   the subquery.  
34560 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a        ** once. *
34570 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 41 64  /.        onceAd
34580 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
34590 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp0(v, OP_Onc
345a0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
345b0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  (v);.        Vdb
345c0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61  eComment((v, "ma
345d0 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22  terialize \"%s\"
345e0 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
345f0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d  zName));.      }
34600 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 56 64  else{.        Vd
34610 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
34620 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c  , "materialize \
34630 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70  "%s\"", pItem->p
34640 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
34650 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 72 69      }.      pPri
34660 6f 72 20 3d 20 69 73 53 65 6c 66 4a 6f 69 6e 56  or = isSelfJoinV
34670 69 65 77 28 70 54 61 62 4c 69 73 74 2c 20 70 49  iew(pTabList, pI
34680 74 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tem);.      if( 
34690 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 20 20  pPrior ){.      
346a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
346b0 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75  Op2(v, OP_OpenDu
346c0 70 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  p, pItem->iCurso
346d0 72 2c 20 70 50 72 69 6f 72 2d 3e 69 43 75 72 73  r, pPrior->iCurs
346e0 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  or);.        ass
346f0 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 53 65  ert( pPrior->pSe
34700 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  lect!=0 );.     
34710 20 20 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74     pSub->nSelect
34720 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 70 53  Row = pPrior->pS
34730 65 6c 65 63 74 2d 3e 6e 53 65 6c 65 63 74 52 6f  elect->nSelectRo
34740 77 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  w;.      }else{.
34750 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
34760 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
34770 65 73 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61  est, SRT_EphemTa
34780 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  b, pItem->iCurso
34790 72 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 6c  r);.        Expl
347a0 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
347b0 61 72 73 65 2c 20 31 2c 20 22 4d 41 54 45 52 49  arse, 1, "MATERI
347c0 41 4c 49 5a 45 20 25 75 22 2c 20 70 53 75 62 2d  ALIZE %u", pSub-
347d0 3e 73 65 6c 49 64 29 29 3b 0a 20 20 20 20 20 20  >selId));.      
347e0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
347f0 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64  pParse, pSub, &d
34800 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  est);.      }.  
34810 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d      pItem->pTab-
34820 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53  >nRowLogEst = pS
34830 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  ub->nSelectRow;.
34840 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64        if( onceAd
34850 64 72 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  dr ) sqlite3Vdbe
34860 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65  JumpHere(v, once
34870 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74  Addr);.      ret
34880 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
34890 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
348a0 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65  eturn, pItem->re
348b0 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
348c0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
348d0 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d  "end %s", pItem-
348e0 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
348f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
34900 65 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70  eChangeP1(v, top
34910 41 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a  Addr, retAddr);.
34920 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65        sqlite3Cle
34930 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70  arTempRegCache(p
34940 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
34950 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
34960 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65  Failed ) goto se
34970 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70 50  lect_end;.    pP
34980 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d  arse->nHeight -=
34990 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
349a0 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20 20  prHeight(p);.   
349b0 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
349c0 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75  ntext = zSavedAu
349d0 74 68 43 6f 6e 74 65 78 74 3b 0a 23 65 6e 64 69  thContext;.#endi
349e0 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 56 61 72 69  f.  }..  /* Vari
349f0 6f 75 73 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  ous elements of 
34a00 74 68 65 20 53 45 4c 45 43 54 20 63 6f 70 69 65  the SELECT copie
34a10 64 20 69 6e 74 6f 20 6c 6f 63 61 6c 20 76 61 72  d into local var
34a20 69 61 62 6c 65 73 20 66 6f 72 0a 20 20 2a 2a 20  iables for.  ** 
34a30 63 6f 6e 76 65 6e 69 65 6e 63 65 20 2a 2f 0a 20  convenience */. 
34a40 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
34a50 69 73 74 3b 0a 20 20 70 57 68 65 72 65 20 3d 20  ist;.  pWhere = 
34a60 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72  p->pWhere;.  pGr
34a70 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
34a80 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d  pBy;.  pHaving =
34a90 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73   p->pHaving;.  s
34aa0 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
34ab0 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  = (p->selFlags &
34ac0 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
34ad0 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ;..#if SELECTTRA
34ae0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
34af0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
34b00 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20  ace & 0x400 ){. 
34b10 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
34b20 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x400,pParse,p,("
34b30 41 66 74 65 72 20 61 6c 6c 20 46 52 4f 4d 2d 63  After all FROM-c
34b40 6c 61 75 73 65 20 61 6e 61 6c 79 73 69 73 3a 5c  lause analysis:\
34b50 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n"));.    sqlite
34b60 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
34b70 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, p, 0);.  }.#e
34b80 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
34b90 65 20 71 75 65 72 79 20 69 73 20 44 49 53 54 49  e query is DISTI
34ba0 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45  NCT with an ORDE
34bb0 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f 74 20  R BY but is not 
34bc0 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20 61 6e  an aggregate, an
34bd0 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 73  d .  ** if the s
34be0 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20 74 68  elect-list is th
34bf0 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 4f 52  e same as the OR
34c00 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74 68 65  DER BY list, the
34c10 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a  n this query.  *
34c20 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69 74 74  * can be rewritt
34c30 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20 42 59  en as a GROUP BY
34c40 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
34c50 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a  , this:.  **.  *
34c60 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44 49 53  *     SELECT DIS
34c70 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e  TINCT xyz FROM .
34c80 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a  .. ORDER BY xyz.
34c90 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61    **.  ** is tra
34ca0 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a  nsformed to:.  *
34cb0 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
34cc0 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47  T xyz FROM ... G
34cd0 52 4f 55 50 20 42 59 20 78 79 7a 20 4f 52 44 45  ROUP BY xyz ORDE
34ce0 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20  R BY xyz.  **.  
34cf0 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f  ** The second fo
34d00 72 6d 20 69 73 20 70 72 65 66 65 72 72 65 64 20  rm is preferred 
34d10 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65  as a single inde
34d20 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c 65  x (or temp-table
34d30 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20 75  ) may be .  ** u
34d40 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65  sed for both the
34d50 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44 49   ORDER BY and DI
34d60 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e  STINCT processin
34d70 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c 79  g. As originally
34d80 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74   .  ** written t
34d90 68 65 20 71 75 65 72 79 20 6d 75 73 74 20 75 73  he query must us
34da0 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20 66  e a temp-table f
34db0 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  or at least one 
34dc0 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20 20  of the ORDER .  
34dd0 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  ** BY and DISTIN
34de0 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65 78  CT, and an index
34df0 20 6f 72 20 73 65 70 61 72 61 74 65 20 74 65 6d   or separate tem
34e00 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20  p-table for the 
34e10 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  other..  */.  if
34e20 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
34e30 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
34e40 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
34e50 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26 26  _Distinct .   &&
34e60 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
34e70 43 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e 70 4f  Compare(sSort.pO
34e80 72 64 65 72 42 79 2c 20 70 45 4c 69 73 74 2c 20  rderBy, pEList, 
34e90 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20  -1)==0.  ){.    
34ea0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  p->selFlags &= ~
34eb0 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20  SF_Distinct;.   
34ec0 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
34ed0 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
34ee0 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
34ef0 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20   pEList, 0);.   
34f00 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20   /* Notice that 
34f10 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46 5f  even thought SF_
34f20 44 69 73 74 69 6e 63 74 20 68 61 73 20 62 65 65  Distinct has bee
34f30 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20 70  n cleared from p
34f40 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20  ->selFlags,.    
34f50 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63 74  ** the sDistinct
34f60 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c 6c  .isTnct is still
34f70 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69 73   set.  Hence, is
34f80 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73 20  Tnct represents 
34f90 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69  the.    ** origi
34fa0 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20 74  nal setting of t
34fb0 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20 66  he SF_Distinct f
34fc0 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75 72  lag, not the cur
34fd0 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a  rent setting */.
34fe0 20 20 20 20 61 73 73 65 72 74 28 20 73 44 69 73      assert( sDis
34ff0 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a  tinct.isTnct );.
35000 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
35010 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28  _ENABLED.    if(
35020 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
35030 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20  ace & 0x400 ){. 
35040 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
35050 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x400,pParse,p,
35060 28 22 54 72 61 6e 73 66 6f 72 6d 20 44 49 53 54  ("Transform DIST
35070 49 4e 43 54 20 69 6e 74 6f 20 47 52 4f 55 50 20  INCT into GROUP 
35080 42 59 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  BY:\n"));.      
35090 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
350a0 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
350b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
350c0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
350d0 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
350e0 6c 61 75 73 65 2c 20 74 68 65 6e 20 63 72 65 61  lause, then crea
350f0 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  te an ephemeral 
35100 69 6e 64 65 78 20 74 6f 0a 20 20 2a 2a 20 64 6f  index to.  ** do
35110 20 74 68 65 20 73 6f 72 74 69 6e 67 2e 20 20 42   the sorting.  B
35120 75 74 20 74 68 69 73 20 73 6f 72 74 69 6e 67 20  ut this sorting 
35130 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
35140 6d 69 67 68 74 20 65 6e 64 20 75 70 0a 20 20 2a  might end up.  *
35150 2a 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20 69  * being unused i
35160 66 20 74 68 65 20 64 61 74 61 20 63 61 6e 20 62  f the data can b
35170 65 20 65 78 74 72 61 63 74 65 64 20 69 6e 20 70  e extracted in p
35180 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e  re-sorted order.
35190 0a 20 20 2a 2a 20 49 66 20 74 68 61 74 20 69 73  .  ** If that is
351a0 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20   the case, then 
351b0 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  the OP_OpenEphem
351c0 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
351d0 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 63 68   will be.  ** ch
351e0 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e  anged to an OP_N
351f0 6f 6f 70 20 6f 6e 63 65 20 77 65 20 66 69 67 75  oop once we figu
35200 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65 20  re out that the 
35210 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73  sorting index is
35220 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65 65 64 65 64  .  ** not needed
35230 2e 20 20 54 68 65 20 73 53 6f 72 74 2e 61 64 64  .  The sSort.add
35240 72 53 6f 72 74 49 6e 64 65 78 20 76 61 72 69 61  rSortIndex varia
35250 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 66  ble is used to f
35260 61 63 69 6c 69 74 61 74 65 0a 20 20 2a 2a 20 74  acilitate.  ** t
35270 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f  hat change..  */
35280 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72  .  if( sSort.pOr
35290 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79  derBy ){.    Key
352a0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
352b0 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
352c0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f  qlite3KeyInfoFro
352d0 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 20 20 20  mExprList(.     
352e0 20 20 20 70 50 61 72 73 65 2c 20 73 53 6f 72 74     pParse, sSort
352f0 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 70 45  .pOrderBy, 0, pE
35300 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
35310 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f 72    sSort.iECursor
35320 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
35330 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64  +;.    sSort.add
35340 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20  rSortIndex =.   
35350 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
35360 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
35370 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20  phemeral,.      
35380 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73      sSort.iECurs
35390 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  or, sSort.pOrder
353a0 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70 45 4c 69  By->nExpr+1+pELi
353b0 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a 20 20  st->nExpr, 0,.  
353c0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
353d0 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
353e0 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a 20 20 7d  NFO.      );.  }
353f0 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72 74 2e  else{.    sSort.
35400 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20  addrSortIndex = 
35410 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  -1;.  }..  /* If
35420 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64   the output is d
35430 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65  estined for a te
35440 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f  mporary table, o
35450 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a  pen that table..
35460 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74    */.  if( pDest
35470 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ->eDest==SRT_Eph
35480 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c  emTab ){.    sql
35490 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
354a0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
354b0 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  al, pDest->iSDPa
354c0 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rm, pEList->nExp
354d0 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  r);.  }..  /* Se
354e0 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20  t the limiter.. 
354f0 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c   */.  iEnd = sql
35500 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
35510 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  l(pParse);.  if(
35520 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
35530 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 29 3d 3d  SF_FixedLimit)==
35540 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c  0 ){.    p->nSel
35550 65 63 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f  ectRow = 320;  /
35560 2a 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73  * 4 billion rows
35570 20 2a 2f 0a 20 20 7d 0a 20 20 63 6f 6d 70 75 74   */.  }.  comput
35580 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
35590 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29  pParse, p, iEnd)
355a0 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  ;.  if( p->iLimi
355b0 74 3d 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64  t==0 && sSort.ad
355c0 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29  drSortIndex>=0 )
355d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
355e0 65 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c  eChangeOpcode(v,
355f0 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
35600 6e 64 65 78 2c 20 4f 50 5f 53 6f 72 74 65 72 4f  ndex, OP_SorterO
35610 70 65 6e 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e  pen);.    sSort.
35620 73 6f 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52  sortFlags |= SOR
35630 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 3b  TFLAG_UseSorter;
35640 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
35650 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  an ephemeral ind
35660 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  ex to use for th
35670 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a  e distinct set..
35680 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65    */.  if( p->se
35690 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
356a0 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73  inct ){.    sDis
356b0 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20  tinct.tabTnct = 
356c0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
356d0 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64      sDistinct.ad
356e0 64 72 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33  drTnct = sqlite3
356f0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
35700 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a  _OpenEphemeral,.
35710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35720 20 20 20 20 20 20 20 73 44 69 73 74 69 6e 63 74         sDistinct
35730 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20 30 2c 0a  .tabTnct, 0, 0,.
35740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35750 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71         (char*)sq
35760 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d  lite3KeyInfoFrom
35770 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
35780 20 70 2d 3e 70 45 4c 69 73 74 2c 30 2c 30 29 2c   p->pEList,0,0),
35790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
357a0 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e          P4_KEYIN
357b0 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  FO);.    sqlite3
357c0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
357d0 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
357e0 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  ;.    sDistinct.
357f0 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52  eTnctType = WHER
35800 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44  E_DISTINCT_UNORD
35810 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ERED;.  }else{. 
35820 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e     sDistinct.eTn
35830 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44  ctType = WHERE_D
35840 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20  ISTINCT_NOOP;.  
35850 7d 0a 0a 20 20 69 66 28 20 21 69 73 41 67 67 20  }..  if( !isAgg 
35860 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  && pGroupBy==0 )
35870 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72  {.    /* No aggr
35880 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
35890 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  and no GROUP BY 
358a0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 75 31  clause */.    u1
358b0 36 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 28  6 wctrlFlags = (
358c0 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
358d0 20 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   ? WHERE_WANT_DI
358e0 53 54 49 4e 43 54 20 3a 20 30 29 0a 20 20 20 20  STINCT : 0).    
358f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
35900 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
35910 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 29 3b 0a  SF_FixedLimit);.
35920 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
35930 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20  MIT_WINDOWFUNC. 
35940 20 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 20     Window *pWin 
35950 3d 20 70 2d 3e 70 57 69 6e 3b 20 20 20 20 20 20  = p->pWin;      
35960 2f 2a 20 4d 61 73 74 65 72 20 77 69 6e 64 6f 77  /* Master window
35970 20 6f 62 6a 65 63 74 20 28 6f 72 20 4e 55 4c 4c   object (or NULL
35980 29 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 69  ) */.    if( pWi
35990 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  n ){.      sqlit
359a0 65 33 57 69 6e 64 6f 77 43 6f 64 65 49 6e 69 74  e3WindowCodeInit
359b0 28 70 50 61 72 73 65 2c 20 70 57 69 6e 29 3b 0a  (pParse, pWin);.
359c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
359d0 20 61 73 73 65 72 74 28 20 57 48 45 52 45 5f 55   assert( WHERE_U
359e0 53 45 5f 4c 49 4d 49 54 3d 3d 53 46 5f 46 69 78  SE_LIMIT==SF_Fix
359f0 65 64 4c 69 6d 69 74 20 29 3b 0a 0a 0a 20 20 20  edLimit );...   
35a00 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61   /* Begin the da
35a10 74 61 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a  tabase scan. */.
35a20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
35a30 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 57 68 65  1,pParse,p,("Whe
35a40 72 65 42 65 67 69 6e 5c 6e 22 29 29 3b 0a 20 20  reBegin\n"));.  
35a50 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
35a60 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
35a70 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
35a80 57 68 65 72 65 2c 20 73 53 6f 72 74 2e 70 4f 72  Where, sSort.pOr
35a90 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20  derBy,.         
35aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ab0 20 20 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 2c        p->pEList,
35ac0 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 70 2d 3e   wctrlFlags, p->
35ad0 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20  nSelectRow);.   
35ae0 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
35af0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
35b00 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
35b10 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43  3WhereOutputRowC
35b20 6f 75 6e 74 28 70 57 49 6e 66 6f 29 20 3c 20 70  ount(pWInfo) < p
35b30 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a  ->nSelectRow ){.
35b40 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
35b50 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 57 68 65  Row = sqlite3Whe
35b60 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74  reOutputRowCount
35b70 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  (pWInfo);.    }.
35b80 20 20 20 20 69 66 28 20 73 44 69 73 74 69 6e 63      if( sDistinc
35b90 74 2e 69 73 54 6e 63 74 20 26 26 20 73 71 6c 69  t.isTnct && sqli
35ba0 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69 6e  te3WhereIsDistin
35bb0 63 74 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20  ct(pWInfo) ){.  
35bc0 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54      sDistinct.eT
35bd0 6e 63 74 54 79 70 65 20 3d 20 73 71 6c 69 74 65  nctType = sqlite
35be0 33 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74  3WhereIsDistinct
35bf0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  (pWInfo);.    }.
35c00 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f      if( sSort.pO
35c10 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
35c20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 20 3d 20 73  sSort.nOBSat = s
35c30 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64  qlite3WhereIsOrd
35c40 65 72 65 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  ered(pWInfo);.  
35c50 20 20 20 20 73 53 6f 72 74 2e 6c 61 62 65 6c 4f      sSort.labelO
35c60 42 4c 6f 70 74 20 3d 20 73 71 6c 69 74 65 33 57  BLopt = sqlite3W
35c70 68 65 72 65 4f 72 64 65 72 42 79 4c 69 6d 69 74  hereOrderByLimit
35c80 4f 70 74 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29  OptLabel(pWInfo)
35c90 3b 0a 20 20 20 20 20 20 69 66 28 20 73 53 6f 72  ;.      if( sSor
35ca0 74 2e 6e 4f 42 53 61 74 3d 3d 73 53 6f 72 74 2e  t.nOBSat==sSort.
35cb0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
35cc0 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74  ){.        sSort
35cd0 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  .pOrderBy = 0;. 
35ce0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
35cf0 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20    /* If sorting 
35d00 69 6e 64 65 78 20 74 68 61 74 20 77 61 73 20 63  index that was c
35d10 72 65 61 74 65 64 20 62 79 20 61 20 70 72 69 6f  reated by a prio
35d20 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  r OP_OpenEphemer
35d30 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72  al .    ** instr
35d40 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20  uction ended up 
35d50 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64  not being needed
35d60 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68  , then change th
35d70 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
35d80 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61  al.    ** into a
35d90 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a  n OP_Noop..    *
35da0 2f 0a 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e  /.    if( sSort.
35db0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30  addrSortIndex>=0
35dc0 20 26 26 20 73 53 6f 72 74 2e 70 4f 72 64 65 72   && sSort.pOrder
35dd0 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  By==0 ){.      s
35de0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
35df0 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e  ToNoop(v, sSort.
35e00 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a  addrSortIndex);.
35e10 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
35e20 74 28 20 70 2d 3e 70 45 4c 69 73 74 3d 3d 70 45  t( p->pEList==pE
35e30 4c 69 73 74 20 29 3b 0a 23 69 66 6e 64 65 66 20  List );.#ifndef 
35e40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
35e50 4f 57 46 55 4e 43 0a 20 20 20 20 69 66 28 20 70  OWFUNC.    if( p
35e60 57 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Win ){.      int
35e70 20 61 64 64 72 47 6f 73 75 62 20 3d 20 73 71 6c   addrGosub = sql
35e80 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
35e90 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
35ea0 20 69 6e 74 20 69 43 6f 6e 74 20 3d 20 73 71 6c   int iCont = sql
35eb0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
35ec0 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
35ed0 20 69 6e 74 20 69 42 72 65 61 6b 20 3d 20 73 71   int iBreak = sq
35ee0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
35ef0 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
35f00 20 20 69 6e 74 20 72 65 67 47 6f 73 75 62 20 3d    int regGosub =
35f10 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
35f20 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  ..      sqlite3W
35f30 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 70 50  indowCodeStep(pP
35f40 61 72 73 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c  arse, p, pWInfo,
35f50 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47   regGosub, addrG
35f60 6f 73 75 62 29 3b 0a 0a 20 20 20 20 20 20 73 71  osub);..      sq
35f70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
35f80 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  v, OP_Goto, 0, i
35f90 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
35fa0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
35fb0 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 47 6f 73  Label(v, addrGos
35fc0 75 62 29 3b 0a 20 20 20 20 20 20 56 64 62 65 4e  ub);.      VdbeN
35fd0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
35fe0 69 6e 6e 65 72 2d 6c 6f 6f 70 20 73 75 62 72 6f  inner-loop subro
35ff0 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 20 20  utine"));.      
36000 73 53 6f 72 74 2e 6c 61 62 65 6c 4f 42 4c 6f 70  sSort.labelOBLop
36010 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 65 6c  t = 0;.      sel
36020 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
36030 72 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73 53 6f  rse, p, -1, &sSo
36040 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20  rt, &sDistinct, 
36050 70 44 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42  pDest, iCont, iB
36060 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
36070 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
36080 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
36090 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
360a0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
360b0 74 75 72 6e 2c 20 72 65 67 47 6f 73 75 62 29 3b  turn, regGosub);
360c0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
360d0 6e 74 28 28 76 2c 20 22 65 6e 64 20 69 6e 6e 65  nt((v, "end inne
360e0 72 2d 6c 6f 6f 70 20 73 75 62 72 6f 75 74 69 6e  r-loop subroutin
360f0 65 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e"));.      sqli
36100 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
36110 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
36120 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
36130 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
36140 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20 20  WINDOWFUNC */.  
36150 20 20 7b 0a 20 20 20 20 20 20 2f 2a 20 55 73 65    {.      /* Use
36160 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e   the standard in
36170 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20  ner loop. */.   
36180 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
36190 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d 31  op(pParse, p, -1
361a0 2c 20 26 73 53 6f 72 74 2c 20 26 73 44 69 73 74  , &sSort, &sDist
361b0 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20  inct, pDest,.   
361c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
361d0 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c  ereContinueLabel
361e0 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20  (pWInfo),.      
361f0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
36200 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66  BreakLabel(pWInf
36210 6f 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45  o));..      /* E
36220 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
36230 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 20  scan loop..     
36240 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
36250 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
36260 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
36270 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
36280 73 65 20 77 68 65 6e 20 74 68 65 72 65 20 65 78  se when there ex
36290 69 73 74 20 61 67 67 72 65 67 61 74 65 20 66 75  ist aggregate fu
362a0 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52 4f  nctions or a GRO
362b0 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20  UP BY clause.   
362c0 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a 20   ** or both */. 
362d0 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
362e0 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63  NC;    /* Name c
362f0 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65  ontext for proce
36300 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 20  ssing aggregate 
36310 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
36320 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20     int iAMem;   
36330 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
36340 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
36350 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20  storing current 
36360 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
36370 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20  int iBMem;      
36380 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
36390 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72 65   address for pre
363a0 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a  vious GROUP BY *
363b0 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c  /.    int iUseFl
363c0 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d  ag;       /* Mem
363d0 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67   address holding
363e0 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67   flag indicating
363f0 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20   that at least. 
36400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36410 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f         ** one ro
36420 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74  w of the input t
36430 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72  o the aggregator
36440 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20   has been.      
36450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36460 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a    ** processed *
36470 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74  /.    int iAbort
36480 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d  Flag;     /* Mem
36490 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20 63   address which c
364a0 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f 72  auses query abor
364b0 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f  t if positive */
364c0 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79  .    int groupBy
364d0 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73  Sort;    /* Rows
364e0 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63   come from sourc
364f0 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72  e in GROUP BY or
36500 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  der */.    int a
36510 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f  ddrEnd;        /
36520 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73  * End of process
36530 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c  ing for this SEL
36540 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ECT */.    int s
36550 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20 2f  ortPTab = 0;   /
36560 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75 73  * Pseudotable us
36570 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f 72  ed to decode sor
36580 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a  ting results */.
36590 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74 20      int sortOut 
365a0 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75  = 0;    /* Outpu
365b0 74 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d 20  t register from 
365c0 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20  the sorter */.  
365d0 20 20 69 6e 74 20 6f 72 64 65 72 42 79 47 72 70    int orderByGrp
365e0 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66   = 0; /* True if
365f0 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 6e   the GROUP BY an
36600 64 20 4f 52 44 45 52 20 42 59 20 61 72 65 20 74  d ORDER BY are t
36610 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20 20 20 20  he same */..    
36620 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e  /* Remove any an
36630 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62 65  d all aliases be
36640 74 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c 74  tween the result
36650 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20 20   set and the.   
36660 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c 61   ** GROUP BY cla
36670 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  use..    */.    
36680 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
36690 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20        int k;    
366a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
366b0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
366c0 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74 72  ter */.      str
366d0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
366e0 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f  m *pItem;  /* Fo
366f0 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65  r looping over e
36700 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c  xpression in a l
36710 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f  ist */..      fo
36720 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  r(k=p->pEList->n
36730 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70  Expr, pItem=p->p
36740 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b  EList->a; k>0; k
36750 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
36760 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78        pItem->u.x
36770 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20  .iAlias = 0;.   
36780 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b     }.      for(k
36790 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  =pGroupBy->nExpr
367a0 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79  , pItem=pGroupBy
367b0 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70  ->a; k>0; k--, p
367c0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
367d0 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69   pItem->u.x.iAli
367e0 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  as = 0;.      }.
367f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 36 36        assert( 66
36800 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
36810 31 30 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66  100) );.      if
36820 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e  ( p->nSelectRow>
36830 36 36 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  66 ) p->nSelectR
36840 6f 77 20 3d 20 36 36 3b 0a 20 20 20 20 7d 65 6c  ow = 66;.    }el
36850 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
36860 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  ( 0==sqlite3LogE
36870 73 74 28 31 29 20 29 3b 0a 20 20 20 20 20 20 70  st(1) );.      p
36880 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30  ->nSelectRow = 0
36890 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
368a0 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68  If there is both
368b0 20 61 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20   a GROUP BY and 
368c0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
368d0 73 65 20 61 6e 64 20 74 68 65 79 20 61 72 65 0a  se and they are.
368e0 20 20 20 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c      ** identical
368f0 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 62 65  , then it may be
36900 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 69 73   possible to dis
36910 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20 42  able the ORDER B
36920 59 20 63 6c 61 75 73 65 20 0a 20 20 20 20 2a 2a  Y clause .    **
36930 20 6f 6e 20 74 68 65 20 67 72 6f 75 6e 64 73 20   on the grounds 
36940 74 68 61 74 20 74 68 65 20 47 52 4f 55 50 20 42  that the GROUP B
36950 59 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c 65  Y will cause ele
36960 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75  ments to come ou
36970 74 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  t .    ** in the
36980 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e 20   correct order. 
36990 49 74 20 61 6c 73 6f 20 6d 61 79 20 6e 6f 74 20  It also may not 
369a0 2d 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 6d  - the GROUP BY m
369b0 69 67 68 74 20 75 73 65 20 61 0a 20 20 20 20 2a  ight use a.    *
369c0 2a 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  * database index
369d0 20 74 68 61 74 20 63 61 75 73 65 73 20 72 6f 77   that causes row
369e0 73 20 74 6f 20 62 65 20 67 72 6f 75 70 65 64 20  s to be grouped 
369f0 74 6f 67 65 74 68 65 72 20 61 73 20 72 65 71 75  together as requ
36a00 69 72 65 64 0a 20 20 20 20 2a 2a 20 62 75 74 20  ired.    ** but 
36a10 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 73 6f 72  not actually sor
36a20 74 65 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c  ted. Either way,
36a30 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   record the fact
36a40 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a   that the.    **
36a50 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 47 52   ORDER BY and GR
36a60 4f 55 50 20 42 59 20 63 6c 61 75 73 65 73 20 61  OUP BY clauses a
36a70 72 65 20 74 68 65 20 73 61 6d 65 20 62 79 20 73  re the same by s
36a80 65 74 74 69 6e 67 20 74 68 65 20 6f 72 64 65 72  etting the order
36a90 42 79 47 72 70 0a 20 20 20 20 2a 2a 20 76 61 72  ByGrp.    ** var
36aa0 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69  iable.  */.    i
36ab0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  f( sqlite3ExprLi
36ac0 73 74 43 6f 6d 70 61 72 65 28 70 47 72 6f 75 70  stCompare(pGroup
36ad0 42 79 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  By, sSort.pOrder
36ae0 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20  By, -1)==0 ){.  
36af0 20 20 20 20 6f 72 64 65 72 42 79 47 72 70 20 3d      orderByGrp =
36b00 20 31 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20   1;.    }. .    
36b10 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62 65  /* Create a labe
36b20 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65  l to jump to whe
36b30 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62 6f  n we want to abo
36b40 72 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a  rt the query */.
36b50 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71      addrEnd = sq
36b60 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
36b70 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20  el(pParse);..   
36b80 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43   /* Convert TK_C
36b90 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f  OLUMN nodes into
36ba0 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61   TK_AGG_COLUMN a
36bb0 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20  nd make entries 
36bc0 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e  in.    ** sAggIn
36bd0 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47  fo for all TK_AG
36be0 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73  G_FUNCTION nodes
36bf0 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20   in expressions 
36c00 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45  of the.    ** SE
36c10 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
36c20 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65      */.    memse
36c30 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
36c40 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43  f(sNC));.    sNC
36c50 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
36c60 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69  ;.    sNC.pSrcLi
36c70 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
36c80 20 20 20 73 4e 43 2e 75 4e 43 2e 70 41 67 67 49     sNC.uNC.pAggI
36c90 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b  nfo = &sAggInfo;
36ca0 0a 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 73  .    VVA_ONLY( s
36cb0 4e 43 2e 6e 63 46 6c 61 67 73 20 3d 20 4e 43 5f  NC.ncFlags = NC_
36cc0 55 41 67 67 49 6e 66 6f 3b 20 29 0a 20 20 20 20  UAggInfo; ).    
36cd0 73 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d  sAggInfo.mnReg =
36ce0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
36cf0 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53  .    sAggInfo.nS
36d00 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70  ortingColumn = p
36d10 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70  GroupBy ? pGroup
36d20 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20  By->nExpr : 0;. 
36d30 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f     sAggInfo.pGro
36d40 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b  upBy = pGroupBy;
36d50 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
36d60 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
36d70 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  sNC, pEList);.  
36d80 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
36d90 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
36da0 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  , sSort.pOrderBy
36db0 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69  );.    if( pHavi
36dc0 6e 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ng ){.      if( 
36dd0 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
36de0 20 20 20 20 61 73 73 65 72 74 28 20 70 57 68 65      assert( pWhe
36df0 72 65 3d 3d 70 2d 3e 70 57 68 65 72 65 20 29 3b  re==p->pWhere );
36e00 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
36e10 20 70 48 61 76 69 6e 67 3d 3d 70 2d 3e 70 48 61   pHaving==p->pHa
36e20 76 69 6e 67 20 29 3b 0a 20 20 20 20 20 20 20 20  ving );.        
36e30 61 73 73 65 72 74 28 20 70 47 72 6f 75 70 42 79  assert( pGroupBy
36e40 3d 3d 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b  ==p->pGroupBy );
36e50 0a 20 20 20 20 20 20 20 20 68 61 76 69 6e 67 54  .        havingT
36e60 6f 57 68 65 72 65 28 70 50 61 72 73 65 2c 20 70  oWhere(pParse, p
36e70 29 3b 0a 20 20 20 20 20 20 20 20 70 57 68 65 72  );.        pWher
36e80 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  e = p->pWhere;. 
36e90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
36ea0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
36eb0 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20  ggregates(&sNC, 
36ec0 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a  pHaving);.    }.
36ed0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63      sAggInfo.nAc
36ee0 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67  cumulator = sAgg
36ef0 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Info.nColumn;.  
36f00 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42    if( p->pGroupB
36f10 79 3d 3d 30 20 26 26 20 70 2d 3e 70 48 61 76 69  y==0 && p->pHavi
36f20 6e 67 3d 3d 30 20 26 26 20 73 41 67 67 49 6e 66  ng==0 && sAggInf
36f30 6f 2e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20  o.nFunc==1 ){.  
36f40 20 20 20 20 6d 69 6e 4d 61 78 46 6c 61 67 20 3d      minMaxFlag =
36f50 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 64 62 2c   minMaxQuery(db,
36f60 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b   sAggInfo.aFunc[
36f70 30 5d 2e 70 45 78 70 72 2c 20 26 70 4d 69 6e 4d  0].pExpr, &pMinM
36f80 61 78 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  axOrderBy);.    
36f90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 69 6e  }else{.      min
36fa0 4d 61 78 46 6c 61 67 20 3d 20 57 48 45 52 45 5f  MaxFlag = WHERE_
36fb0 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a  ORDERBY_NORMAL;.
36fc0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
36fd0 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46  0; i<sAggInfo.nF
36fe0 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  unc; i++){.     
36ff0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
37000 73 50 72 6f 70 65 72 74 79 28 73 41 67 67 49 6e  sProperty(sAggIn
37010 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70  fo.aFunc[i].pExp
37020 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
37030 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63   );.      sNC.nc
37040 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67  Flags |= NC_InAg
37050 67 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c  gFunc;.      sql
37060 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
37070 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67  ggList(&sNC, sAg
37080 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70  gInfo.aFunc[i].p
37090 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  Expr->x.pList);.
370a0 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67        sNC.ncFlag
370b0 73 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75  s &= ~NC_InAggFu
370c0 6e 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41  nc;.    }.    sA
370d0 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70  ggInfo.mxReg = p
370e0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
370f0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
37100 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
37110 65 63 74 5f 65 6e 64 3b 0a 23 69 66 20 53 45 4c  ect_end;.#if SEL
37120 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
37130 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
37140 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
37150 34 30 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  400 ){.      int
37160 20 69 69 3b 0a 20 20 20 20 20 20 53 45 4c 45 43   ii;.      SELEC
37170 54 54 52 41 43 45 28 30 78 34 30 30 2c 70 50 61  TTRACE(0x400,pPa
37180 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 61 67  rse,p,("After ag
37190 67 72 65 67 61 74 65 20 61 6e 61 6c 79 73 69 73  gregate analysis
371a0 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 73 71  :\n"));.      sq
371b0 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
371c0 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
371d0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
371e0 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d  <sAggInfo.nColum
371f0 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  n; ii++){.      
37200 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
37210 69 6e 74 66 28 22 61 67 67 2d 63 6f 6c 75 6d 6e  intf("agg-column
37220 5b 25 64 5d 20 69 4d 65 6d 3d 25 64 5c 6e 22 2c  [%d] iMem=%d\n",
37230 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 69 2c  .            ii,
37240 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69   sAggInfo.aCol[i
37250 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  i].iMem);.      
37260 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
37270 77 45 78 70 72 28 30 2c 20 73 41 67 67 49 6e 66  wExpr(0, sAggInf
37280 6f 2e 61 43 6f 6c 5b 69 69 5d 2e 70 45 78 70 72  o.aCol[ii].pExpr
37290 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
372a0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
372b0 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b  <sAggInfo.nFunc;
372c0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
372d0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
372e0 74 66 28 22 61 67 67 2d 66 75 6e 63 5b 25 64 5d  tf("agg-func[%d]
372f0 3a 20 69 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20  : iMem=%d\n",.  
37300 20 20 20 20 20 20 20 20 20 20 69 69 2c 20 73 41            ii, sA
37310 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 69 5d  ggInfo.aFunc[ii]
37320 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20  .iMem);.        
37330 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45  sqlite3TreeViewE
37340 78 70 72 28 30 2c 20 73 41 67 67 49 6e 66 6f 2e  xpr(0, sAggInfo.
37350 61 46 75 6e 63 5b 69 69 5d 2e 70 45 78 70 72 2c  aFunc[ii].pExpr,
37360 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
37370 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 20 20   }.#endif...    
37380 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f  /* Processing fo
37390 72 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74  r aggregates wit
373a0 68 20 47 52 4f 55 50 20 42 59 20 69 73 20 76 65  h GROUP BY is ve
373b0 72 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64  ry different and
373c0 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72  .    ** much mor
373d0 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61  e complex than a
373e0 67 67 72 65 67 61 74 65 73 20 77 69 74 68 6f 75  ggregates withou
373f0 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20  t a GROUP BY..  
37400 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72    */.    if( pGr
37410 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b  oupBy ){.      K
37420 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
37430 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66  ;  /* Keying inf
37440 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
37450 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65   group by clause
37460 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
37470 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  dr1;          /*
37480 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73   A-vs-B comparis
37490 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20  ion jump */.    
374a0 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74    int addrOutput
374b0 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f  Row;  /* Start o
374c0 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  f subroutine tha
374d0 74 20 6f 75 74 70 75 74 73 20 61 20 72 65 73 75  t outputs a resu
374e0 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20  lt row */.      
374f0 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77  int regOutputRow
37500 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64  ;   /* Return ad
37510 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
37520 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  or output subrou
37530 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tine */.      in
37540 74 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20  t addrSetAbort; 
37550 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f    /* Set the abo
37560 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75  rt flag and retu
37570 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  rn */.      int 
37580 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20  addrTopOfLoop;  
37590 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e  /* Top of the in
375a0 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  put loop */.    
375b0 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e    int addrSortin
375c0 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f  gIdx; /* The OP_
375d0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f  OpenEphemeral fo
375e0 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
375f0 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  dex */.      int
37600 20 61 64 64 72 52 65 73 65 74 3b 20 20 20 20 20   addrReset;     
37610 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66   /* Subroutine f
37620 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65  or resetting the
37630 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a   accumulator */.
37640 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 73        int regRes
37650 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74  et;       /* Ret
37660 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
37670 73 74 65 72 20 66 6f 72 20 72 65 73 65 74 20 73  ster for reset s
37680 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20  ubroutine */..  
37690 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
376a0 69 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c  is a GROUP BY cl
376b0 61 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65  ause we might ne
376c0 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  ed a sorting ind
376d0 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69  ex to.      ** i
376e0 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c  mplement it.  Al
376f0 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74  locate that sort
37700 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20  ing index now.  
37710 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a  If it turns out.
37720 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65        ** that we
37730 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20   do not need it 
37740 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f  after all, the O
37750 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73  P_SorterOpen ins
37760 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  truction.      *
37770 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  * will be conver
37780 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e  ted into a Noop.
37790 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20    .      */.    
377a0 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
377b0 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e  ngIdx = pParse->
377c0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b  nTab++;.      pK
377d0 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
377e0 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  KeyInfoFromExprL
377f0 69 73 74 28 70 50 61 72 73 65 2c 70 47 72 6f 75  ist(pParse,pGrou
37800 70 42 79 2c 30 2c 73 41 67 67 49 6e 66 6f 2e 6e  pBy,0,sAggInfo.n
37810 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 61  Column);.      a
37820 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 20  ddrSortingIdx = 
37830 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
37840 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70  4(v, OP_SorterOp
37850 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  en, .          s
37860 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
37870 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f  dx, sAggInfo.nSo
37880 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20  rtingColumn, .  
37890 20 20 20 20 20 20 20 20 30 2c 20 28 63 68 61 72          0, (char
378a0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
378b0 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20 20 20 20  EYINFO);..      
378c0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65  /* Initialize me
378d0 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75  mory locations u
378e0 73 65 64 20 62 79 20 47 52 4f 55 50 20 42 59 20  sed by GROUP BY 
378f0 61 67 67 72 65 67 61 74 65 20 70 72 6f 63 65 73  aggregate proces
37900 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sing.      */.  
37910 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b      iUseFlag = +
37920 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
37930 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20       iAbortFlag 
37940 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
37950 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74 70 75  ;.      regOutpu
37960 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d  tRow = ++pParse-
37970 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64  >nMem;.      add
37980 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c  rOutputRow = sql
37990 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
379a0 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
379b0 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50   regReset = ++pP
379c0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
379d0 20 20 61 64 64 72 52 65 73 65 74 20 3d 20 73 71    addrReset = sq
379e0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
379f0 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
37a00 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65    iAMem = pParse
37a10 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20  ->nMem + 1;.    
37a20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
37a30 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
37a40 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d  r;.      iBMem =
37a50 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
37a60 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;.      pParse-
37a70 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42  >nMem += pGroupB
37a80 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
37a90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
37aa0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
37ab0 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   0, iAbortFlag);
37ac0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
37ad0 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62  nt((v, "clear ab
37ae0 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
37af0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
37b00 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp3(v, OP_Null,
37b10 20 30 2c 20 69 41 4d 65 6d 2c 20 69 41 4d 65 6d   0, iAMem, iAMem
37b20 2b 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  +pGroupBy->nExpr
37b30 2d 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42  -1);..      /* B
37b40 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74  egin a loop that
37b50 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c   will extract al
37b60 6c 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e  l source rows in
37b70 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e   GROUP BY order.
37b80 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d  .      ** This m
37b90 69 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f  ight involve two
37ba0 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20   separate loops 
37bb0 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20  with an OP_Sort 
37bc0 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20  in between, or. 
37bd0 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74       ** it might
37be0 20 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f   be a single loo
37bf0 70 20 74 68 61 74 20 75 73 65 73 20 61 6e 20 69  p that uses an i
37c00 6e 64 65 78 20 74 6f 20 65 78 74 72 61 63 74 20  ndex to extract 
37c10 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20  information.    
37c20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68    ** in the righ
37c30 74 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e  t order to begin
37c40 20 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a   with..      */.
37c50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
37c60 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
37c70 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61  sub, regReset, a
37c80 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20  ddrReset);.     
37c90 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70   SELECTTRACE(1,p
37ca0 50 61 72 73 65 2c 70 2c 28 22 57 68 65 72 65 42  Parse,p,("WhereB
37cb0 65 67 69 6e 5c 6e 22 29 29 3b 0a 20 20 20 20 20  egin\n"));.     
37cc0 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
37cd0 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
37ce0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
37cf0 68 65 72 65 2c 20 70 47 72 6f 75 70 42 79 2c 20  here, pGroupBy, 
37d00 30 2c 0a 20 20 20 20 20 20 20 20 20 20 57 48 45  0,.          WHE
37d10 52 45 5f 47 52 4f 55 50 42 59 20 7c 20 28 6f 72  RE_GROUPBY | (or
37d20 64 65 72 42 79 47 72 70 20 3f 20 57 48 45 52 45  derByGrp ? WHERE
37d30 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 3a 20 30  _SORTBYGROUP : 0
37d40 29 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  ), 0.      );.  
37d50 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d      if( pWInfo==
37d60 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
37d70 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 73  end;.      if( s
37d80 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64  qlite3WhereIsOrd
37d90 65 72 65 64 28 70 57 49 6e 66 6f 29 3d 3d 70 47  ered(pWInfo)==pG
37da0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 29 7b  roupBy->nExpr ){
37db0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
37dc0 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c  optimizer is abl
37dd0 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77  e to deliver row
37de0 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72  s in group by or
37df0 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a  der so.        *
37e00 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65  * we do not have
37e10 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f   to sort.  The O
37e20 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
37e30 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20  table will be.  
37e40 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c        ** cancell
37e50 65 64 20 6c 61 74 65 72 20 62 65 63 61 75 73 65  ed later because
37e60 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   we still need t
37e70 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e  o use the pKeyIn
37e80 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  fo.        */.  
37e90 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72        groupBySor
37ea0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  t = 0;.      }el
37eb0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52  se{.        /* R
37ec0 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f  ows are coming o
37ed0 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e  ut in undetermin
37ee0 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61  ed order.  We ha
37ef0 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20  ve to push.     
37f00 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69     ** each row i
37f10 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e  nto a sorting in
37f20 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74  dex, terminate t
37f30 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20  he first loop,. 
37f40 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c         ** then l
37f50 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72  oop over the sor
37f60 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72  ting index in or
37f70 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f  der to get the o
37f80 75 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a  utput.        **
37f90 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
37fa0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
37fb0 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b      int regBase;
37fc0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67  .        int reg
37fd0 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20 20  Record;.        
37fe0 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  int nCol;.      
37ff0 20 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a    int nGroupBy;.
38000 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e  .        explain
38010 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65  TempTable(pParse
38020 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  , .            (
38030 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
38040 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   && (p->selFlags
38050 26 53 46 5f 44 69 73 74 69 6e 63 74 29 3d 3d 30  &SF_Distinct)==0
38060 29 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) ?.            
38070 20 20 20 20 20 20 20 20 22 44 49 53 54 49 4e 43          "DISTINC
38080 54 22 20 3a 20 22 47 52 4f 55 50 20 42 59 22 29  T" : "GROUP BY")
38090 3b 0a 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70  ;..        group
380a0 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20  BySort = 1;.    
380b0 20 20 20 20 6e 47 72 6f 75 70 42 79 20 3d 20 70      nGroupBy = p
380c0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
380d0 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e          nCol = n
380e0 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20  GroupBy;.       
380f0 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20   j = nGroupBy;. 
38100 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
38110 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  i<sAggInfo.nColu
38120 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
38130 20 20 20 20 69 66 28 20 73 41 67 67 49 6e 66 6f      if( sAggInfo
38140 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72  .aCol[i].iSorter
38150 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20  Column>=j ){.   
38160 20 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b           nCol++;
38170 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b  .            j++
38180 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
38190 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
381a0 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65  regBase = sqlite
381b0 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
381c0 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  arse, nCol);.   
381d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
381e0 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
381f0 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72  rse, pGroupBy, r
38200 65 67 42 61 73 65 2c 20 30 2c 20 30 29 3b 0a 20  egBase, 0, 0);. 
38210 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75         j = nGrou
38220 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  pBy;.        for
38230 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
38240 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  .nColumn; i++){.
38250 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
38260 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
38270 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61  ol = &sAggInfo.a
38280 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  Col[i];.        
38290 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72    if( pCol->iSor
382a0 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a  terColumn>=j ){.
382b0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
382c0 72 31 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65  r1 = j + regBase
382d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
382e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
382f0 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c  ColumnOfTable(v,
38300 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
38310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38320 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c  pCol->pTab, pCol
38330 2d 3e 69 54 61 62 6c 65 2c 20 70 43 6f 6c 2d 3e  ->iTable, pCol->
38340 69 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20  iColumn, r1);.  
38350 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
38360 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
38370 20 20 20