/ Hex Artifact Content
Login

Artifact aa96c72292f4078c2e57916b6f81ed9065296806db4770612dfd4a78d8f393c9:


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 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20   if( (db->flags 
124c0 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c  & SQLITE_FullCol
124d0 4e 61 6d 65 73 29 21 3d 30 20 29 7b 0a 20 20 20  Names)!=0 ){.   
124e0 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28   db->flags &= ~(
124f0 75 36 34 29 53 51 4c 49 54 45 5f 46 75 6c 6c 43  u64)SQLITE_FullC
12500 6f 6c 4e 61 6d 65 73 3b 0a 20 20 20 20 64 62 2d  olNames;.    db-
12510 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
12520 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a  _ShortColNames;.
12530 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c    }.  sqlite3Sel
12540 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20  ectPrep(pParse, 
12550 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 64  pSelect, 0);.  d
12560 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64  b->flags = saved
12570 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 50 61  Flags;.  if( pPa
12580 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
12590 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70  rn 0;.  while( p
125a0 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29  Select->pPrior )
125b0 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65   pSelect = pSele
125c0 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 70 54  ct->pPrior;.  pT
125d0 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ab = sqlite3DbMa
125e0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
125f0 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20  eof(Table) );.  
12600 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
12610 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
12620 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74 65  .  /* The sqlite
12630 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
12640 63 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73 65  ct() is only use
12650 64 20 6e 20 63 6f 6e 74 65 78 74 73 20 77 68 65  d n contexts whe
12660 72 65 20 6c 6f 6f 6b 61 73 69 64 65 0a 20 20 2a  re lookaside.  *
12670 2a 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  * is disabled */
12680 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c  .  assert( db->l
12690 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c  ookaside.bDisabl
126a0 65 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 54 61  e );.  pTab->nTa
126b0 62 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62  bRef = 1;.  pTab
126c0 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70  ->zName = 0;.  p
126d0 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
126e0 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32  = 200; assert( 2
126f0 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  00==sqlite3LogEs
12700 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20  t(1048576) );.  
12710 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72  sqlite3ColumnsFr
12720 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
12730 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  e, pSelect->pELi
12740 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c  st, &pTab->nCol,
12750 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20   &pTab->aCol);. 
12760 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
12770 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
12780 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
12790 70 54 61 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  pTab, pSelect);.
127a0 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
127b0 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  -1;.  if( db->ma
127c0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
127d0 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
127e0 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a  able(db, pTab);.
127f0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
12800 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  }.  return pTab;
12810 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
12820 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76  VDBE for the giv
12830 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  en parser contex
12840 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
12850 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
12860 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  y..** If an erro
12870 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
12880 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20   NULL and leave 
12890 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  a message in pPa
128a0 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71  rse..*/.Vdbe *sq
128b0 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72  lite3GetVdbe(Par
128c0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
128d0 66 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  f( pParse->pVdbe
128e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
128f0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
12900 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
12910 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20 20 20  pToplevel==0.   
12920 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
12930 6e 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64  nabled(pParse->d
12940 62 2c 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f  b,SQLITE_FactorO
12950 75 74 43 6f 6e 73 74 29 0a 20 20 29 7b 0a 20 20  utConst).  ){.  
12960 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73    pParse->okCons
12970 74 46 61 63 74 6f 72 20 3d 20 31 3b 0a 20 20 7d  tFactor = 1;.  }
12980 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
12990 33 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72  3VdbeCreate(pPar
129a0 73 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  se);.}.../*.** C
129b0 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69  ompute the iLimi
129c0 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69  t and iOffset fi
129d0 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45  elds of the SELE
129e0 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a  CT based on the.
129f0 2a 2a 20 70 4c 69 6d 69 74 20 65 78 70 72 65 73  ** pLimit expres
12a00 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 2d 3e  sions.  pLimit->
12a10 70 4c 65 66 74 20 61 6e 64 20 70 4c 69 6d 69 74  pLeft and pLimit
12a20 2d 3e 70 52 69 67 68 74 20 68 6f 6c 64 20 74 68  ->pRight hold th
12a30 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  e expressions.**
12a40 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20   that appear in 
12a50 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
12a60 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72   statement after
12a70 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
12a80 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64  FFSET.** keyword
12a90 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74  s.  Or NULL if t
12aa0 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72  hose keywords ar
12ab0 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69  e omitted. iLimi
12ac0 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a  t and iOffset .*
12ad0 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65  * are the intege
12ae0 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  r memory registe
12af0 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f  r numbers for co
12b00 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63  unters used to c
12b10 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c  ompute .** the l
12b20 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e  imit and offset.
12b30 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
12b40 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66   limit and/or of
12b50 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69  fset, then .** i
12b60 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
12b70 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a  t are negative..
12b80 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
12b90 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76  ne changes the v
12ba0 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20  alues of iLimit 
12bb0 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79  and iOffset only
12bc0 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f   if.** a limit o
12bd0 72 20 6f 66 66 73 65 74 20 69 73 20 64 65 66 69  r offset is defi
12be0 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 2d 3e 70  ned by pLimit->p
12bf0 4c 65 66 74 20 61 6e 64 20 70 4c 69 6d 69 74 2d  Left and pLimit-
12c00 3e 70 52 69 67 68 74 2e 20 20 69 4c 69 6d 69 74  >pRight.  iLimit
12c10 0a 2a 2a 20 61 6e 64 20 69 4f 66 66 73 65 74 20  .** and iOffset 
12c20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
12c30 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f   preset to appro
12c40 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20 76  priate default v
12c50 61 6c 75 65 73 20 28 7a 65 72 6f 29 0a 2a 2a 20  alues (zero).** 
12c60 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
12c70 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
12c80 2a 0a 2a 2a 20 54 68 65 20 69 4f 66 66 73 65 74  *.** The iOffset
12c90 20 72 65 67 69 73 74 65 72 20 28 69 66 20 69 74   register (if it
12ca0 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 69 74   exists) is init
12cb0 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76  ialized to the v
12cc0 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 4f  alue.** of the O
12cd0 46 46 53 45 54 2e 20 20 54 68 65 20 69 4c 69 6d  FFSET.  The iLim
12ce0 69 74 20 72 65 67 69 73 74 65 72 20 69 73 20 69  it register is i
12cf0 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49  nitialized to LI
12d00 4d 49 54 2e 20 20 52 65 67 69 73 74 65 72 0a 2a  MIT.  Register.*
12d10 2a 20 69 4f 66 66 73 65 74 2b 31 20 69 73 20 69  * iOffset+1 is i
12d20 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49  nitialized to LI
12d30 4d 49 54 2b 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a  MIT+OFFSET..**.*
12d40 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74  * Only if pLimit
12d50 2d 3e 70 4c 65 66 74 21 3d 30 20 64 6f 20 74 68  ->pLeft!=0 do th
12d60 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72  e limit register
12d70 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e  s get.** redefin
12d80 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41  ed.  The UNION A
12d90 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73  LL operator uses
12da0 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 20 74   this property t
12db0 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72  o force.** the r
12dc0 65 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65  euse of the same
12dd0 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65   limit and offse
12de0 74 20 72 65 67 69 73 74 65 72 73 20 61 63 72 6f  t registers acro
12df0 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53  ss multiple.** S
12e00 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
12e10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12e20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
12e30 69 73 74 65 72 73 28 50 61 72 73 65 20 2a 70 50  isters(Parse *pP
12e40 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
12e50 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20   int iBreak){.  
12e60 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69  Vdbe *v = 0;.  i
12e70 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  nt iLimit = 0;. 
12e80 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20   int iOffset;.  
12e90 69 6e 74 20 6e 3b 0a 20 20 45 78 70 72 20 2a 70  int n;.  Expr *p
12ea0 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
12eb0 74 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69  t;..  if( p->iLi
12ec0 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  mit ) return;.. 
12ed0 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54   /* .  ** "LIMIT
12ee0 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77   -1" always show
12ef0 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65  s all rows.  The
12f00 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20  re is some.  ** 
12f10 63 6f 6e 74 72 6f 76 65 72 73 79 20 61 62 6f 75  controversy abou
12f20 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65  t what the corre
12f30 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75  ct behavior shou
12f40 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20  ld be..  ** The 
12f50 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
12f60 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74  tation interpret
12f70 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d  s "LIMIT 0" to m
12f80 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73  ean.  ** no rows
12f90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69  ..  */.  if( pLi
12fa0 6d 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  mit ){.    asser
12fb0 74 28 20 70 4c 69 6d 69 74 2d 3e 6f 70 3d 3d 54  t( pLimit->op==T
12fc0 4b 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 61  K_LIMIT );.    a
12fd0 73 73 65 72 74 28 20 70 4c 69 6d 69 74 2d 3e 70  ssert( pLimit->p
12fe0 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 70  Left!=0 );.    p
12ff0 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69  ->iLimit = iLimi
13000 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
13010 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  em;.    v = sqli
13020 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
13030 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
13040 76 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  v!=0 );.    if( 
13050 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
13060 65 67 65 72 28 70 4c 69 6d 69 74 2d 3e 70 4c 65  eger(pLimit->pLe
13070 66 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20  ft, &n) ){.     
13080 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13090 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
130a0 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  , n, iLimit);.  
130b0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
130c0 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74  (v, "LIMIT count
130d0 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28  er"));.      if(
130e0 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   n==0 ){.       
130f0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
13100 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
13110 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e 3d     }else if( n>=
13120 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52  0 && p->nSelectR
13130 6f 77 3e 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  ow>sqlite3LogEst
13140 28 28 75 36 34 29 6e 29 20 29 7b 0a 20 20 20 20  ((u64)n) ){.    
13150 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
13160 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
13170 74 28 28 75 36 34 29 6e 29 3b 0a 20 20 20 20 20  t((u64)n);.     
13180 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c     p->selFlags |
13190 3d 20 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 3b  = SF_FixedLimit;
131a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
131b0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
131c0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
131d0 2c 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c  , pLimit->pLeft,
131e0 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
131f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13200 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  1(v, OP_MustBeIn
13210 74 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64 62 65  t, iLimit); Vdbe
13220 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
13230 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
13240 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65  v, "LIMIT counte
13250 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r"));.      sqli
13260 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13270 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69   OP_IfNot, iLimi
13280 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65  t, iBreak); Vdbe
13290 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
132a0 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 6d 69   }.    if( pLimi
132b0 74 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20  t->pRight ){.   
132c0 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
132d0 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72  iOffset = ++pPar
132e0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
132f0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20  pParse->nMem++; 
13300 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
13310 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72 20   extra register 
13320 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74  for limit+offset
13330 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
13340 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
13350 2c 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74  , pLimit->pRight
13360 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
13370 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13380 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op1(v, OP_MustBe
13390 49 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b 20 56  Int, iOffset); V
133a0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
133b0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
133c0 74 28 28 76 2c 20 22 4f 46 46 53 45 54 20 63 6f  t((v, "OFFSET co
133d0 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20  unter"));.      
133e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
133f0 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69  3(v, OP_OffsetLi
13400 6d 69 74 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66  mit, iLimit, iOf
13410 66 73 65 74 2b 31 2c 20 69 4f 66 66 73 65 74 29  fset+1, iOffset)
13420 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
13430 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f  ent((v, "LIMIT+O
13440 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20 7d 0a  FFSET"));.    }.
13450 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
13460 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
13470 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a  UND_SELECT./*.**
13480 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72   Return the appr
13490 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e  opriate collatin
134a0 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
134b0 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d  he iCol-th colum
134c0 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75  n of.** the resu
134d0 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65 20 63  lt set for the c
134e0 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73  ompound-select s
134f0 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52  tatement "p".  R
13500 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a  eturn NULL if.**
13510 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20   the column has 
13520 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  no default colla
13530 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
13540 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69  *.** The collati
13550 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
13560 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
13570 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f  ect is taken fro
13580 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f  m the.** left-mo
13590 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73  st term of the s
135a0 65 6c 65 63 74 20 74 68 61 74 20 68 61 73 20 61  elect that has a
135b0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
135c0 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43  nce..*/.static C
135d0 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c  ollSeq *multiSel
135e0 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  ectCollSeq(Parse
135f0 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
13600 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a   *p, int iCol){.
13610 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b    CollSeq *pRet;
13620 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
13630 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d   ){.    pRet = m
13640 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
13650 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72  q(pParse, p->pPr
13660 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65  ior, iCol);.  }e
13670 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  lse{.    pRet = 
13680 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
13690 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 2f 2a   iCol>=0 );.  /*
136a0 20 69 43 6f 6c 20 6d 75 73 74 20 62 65 20 6c 65   iCol must be le
136b0 73 73 20 74 68 61 6e 20 70 2d 3e 70 45 4c 69 73  ss than p->pELis
136c0 74 2d 3e 6e 45 78 70 72 2e 20 20 4f 74 68 65 72  t->nExpr.  Other
136d0 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 77 6f  wise an error wo
136e0 75 6c 64 0a 20 20 2a 2a 20 68 61 76 65 20 62 65  uld.  ** have be
136f0 65 6e 20 74 68 72 6f 77 6e 20 64 75 72 69 6e 67  en thrown during
13700 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
13710 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 6e 6f   and we would no
13720 74 20 68 61 76 65 20 67 6f 74 74 65 6e 0a 20 20  t have gotten.  
13730 2a 2a 20 74 68 69 73 20 66 61 72 20 2a 2f 0a 20  ** this far */. 
13740 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26 26 20   if( pRet==0 && 
13750 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 2d 3e 70  ALWAYS(iCol<p->p
13760 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  EList->nExpr) ){
13770 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69  .    pRet = sqli
13780 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
13790 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
137a0 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29  ->a[iCol].pExpr)
137b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
137c0 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Ret;.}../*.** Th
137d0 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
137e0 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  nt passed as the
137f0 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
13800 72 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  r is a compound 
13810 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 61  SELECT.** with a
13820 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
13830 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
13840 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 72   allocates and r
13850 65 74 75 72 6e 73 20 61 20 4b 65 79 49 6e 66 6f  eturns a KeyInfo
13860 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 73 75  .** structure su
13870 69 74 61 62 6c 65 20 66 6f 72 20 69 6d 70 6c 65  itable for imple
13880 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44 45  menting the ORDE
13890 52 20 42 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  R BY..**.** Spac
138a0 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65  e to hold the Ke
138b0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
138c0 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
138d0 20 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 63 61 6c   malloc. The cal
138e0 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
138f0 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
13900 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68 61  for ensuring tha
13910 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  t this structure
13920 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a   is eventually.*
13930 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74  * freed..*/.stat
13940 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c 74  ic KeyInfo *mult
13950 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65  iSelectOrderByKe
13960 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61  yInfo(Parse *pPa
13970 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
13980 69 6e 74 20 6e 45 78 74 72 61 29 7b 0a 20 20 45  int nExtra){.  E
13990 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
139a0 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
139b0 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 20  .  int nOrderBy 
139c0 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  = p->pOrderBy->n
139d0 45 78 70 72 3b 0a 20 20 73 71 6c 69 74 65 33 20  Expr;.  sqlite3 
139e0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
139f0 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 52 65  ;.  KeyInfo *pRe
13a00 74 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  t = sqlite3KeyIn
13a10 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72 64  foAlloc(db, nOrd
13a20 65 72 42 79 2b 6e 45 78 74 72 61 2c 20 31 29 3b  erBy+nExtra, 1);
13a30 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20  .  if( pRet ){. 
13a40 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
13a50 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
13a60 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  y; i++){.      s
13a70 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
13a80 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4f  tem *pItem = &pO
13a90 72 64 65 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20  rderBy->a[i];.  
13aa0 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d 20      Expr *pTerm 
13ab0 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  = pItem->pExpr;.
13ac0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
13ad0 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 69 66 28  Coll;..      if(
13ae0 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20   pTerm->flags & 
13af0 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
13b00 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
13b10 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
13b20 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 29 3b  (pParse, pTerm);
13b30 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13b40 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75        pColl = mu
13b50 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
13b60 28 70 50 61 72 73 65 2c 20 70 2c 20 70 49 74 65  (pParse, p, pIte
13b70 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
13b80 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 69  ol-1);.        i
13b90 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43  f( pColl==0 ) pC
13ba0 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
13bb0 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  oll;.        pOr
13bc0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
13bd0 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71  r =.          sq
13be0 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c  lite3ExprAddColl
13bf0 61 74 65 53 74 72 69 6e 67 28 70 50 61 72 73 65  ateString(pParse
13c00 2c 20 70 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e  , pTerm, pColl->
13c10 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
13c20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
13c30 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
13c40 69 74 65 61 62 6c 65 28 70 52 65 74 29 20 29 3b  iteable(pRet) );
13c50 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 61 43 6f  .      pRet->aCo
13c60 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20  ll[i] = pColl;. 
13c70 20 20 20 20 20 70 52 65 74 2d 3e 61 53 6f 72 74       pRet->aSort
13c80 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65  Order[i] = pOrde
13c90 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
13ca0 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  der;.    }.  }..
13cb0 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
13cc0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
13cd0 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20  _OMIT_CTE./*.** 
13ce0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
13cf0 65 72 61 74 65 73 20 56 44 42 45 20 63 6f 64 65  erates VDBE code
13d00 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
13d10 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 49 54  content of a WIT
13d20 48 20 52 45 43 55 52 53 49 56 45 0a 2a 2a 20 71  H RECURSIVE.** q
13d30 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d  uery of the form
13d40 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c 72 65 63 75 72  :.**.**   <recur
13d50 73 69 76 65 2d 74 61 62 6c 65 3e 20 41 53 20 28  sive-table> AS (
13d60 3c 73 65 74 75 70 2d 71 75 65 72 79 3e 20 55 4e  <setup-query> UN
13d70 49 4f 4e 20 5b 41 4c 4c 5d 20 3c 72 65 63 75 72  ION [ALL] <recur
13d80 73 69 76 65 2d 71 75 65 72 79 3e 29 0a 2a 2a 20  sive-query>).** 
13d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13da0 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
13db0 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 20  ____/           
13dc0 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
13dd0 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __/.**          
13de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13df0 20 70 2d 3e 70 50 72 69 6f 72 20 20 20 20 20 20   p->pPrior      
13e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e10 70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  p.**.**.** There
13e20 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20   is exactly one 
13e30 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
13e40 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65   recursive-table
13e50 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
13e60 75 73 65 0a 2a 2a 20 6f 66 20 72 65 63 75 72 73  use.** of recurs
13e70 69 76 65 2d 71 75 65 72 79 2c 20 6d 61 72 6b 65  ive-query, marke
13e80 64 20 77 69 74 68 20 74 68 65 20 53 72 63 4c 69  d with the SrcLi
13e90 73 74 2d 3e 61 5b 5d 2e 66 67 2e 69 73 52 65 63  st->a[].fg.isRec
13ea0 75 72 73 69 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a  ursive flag..**.
13eb0 2a 2a 20 54 68 65 20 73 65 74 75 70 2d 71 75 65  ** The setup-que
13ec0 72 79 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20  ry runs once to 
13ed0 67 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 69 74  generate an init
13ee0 69 61 6c 20 73 65 74 20 6f 66 20 72 6f 77 73 20  ial set of rows 
13ef0 74 68 61 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20  that go.** into 
13f00 61 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20  a Queue table.  
13f10 52 6f 77 73 20 61 72 65 20 65 78 74 72 61 63 74  Rows are extract
13f20 65 64 20 66 72 6f 6d 20 74 68 65 20 51 75 65 75  ed from the Queu
13f30 65 20 74 61 62 6c 65 20 6f 6e 65 20 62 79 0a 2a  e table one by.*
13f40 2a 20 6f 6e 65 2e 20 20 45 61 63 68 20 72 6f 77  * one.  Each row
13f50 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
13f60 51 75 65 75 65 20 69 73 20 6f 75 74 70 75 74 20  Queue is output 
13f70 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65 6e 20  to pDest.  Then 
13f80 74 68 65 20 73 69 6e 67 6c 65 0a 2a 2a 20 65 78  the single.** ex
13f90 74 72 61 63 74 65 64 20 72 6f 77 20 28 6e 6f 77  tracted row (now
13fa0 20 69 6e 20 74 68 65 20 69 43 75 72 72 65 6e 74   in the iCurrent
13fb0 20 74 61 62 6c 65 29 20 62 65 63 6f 6d 65 73 20   table) becomes 
13fc0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
13fd0 68 65 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 2d  he.** recursive-
13fe0 74 61 62 6c 65 20 66 6f 72 20 61 20 72 65 63 75  table for a recu
13ff0 72 73 69 76 65 2d 71 75 65 72 79 20 72 75 6e 2e  rsive-query run.
14000 20 20 54 68 65 20 6f 75 74 70 75 74 20 6f 66 20    The output of 
14010 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 71 75  the recursive-qu
14020 65 72 79 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  ery.** is added 
14030 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 51 75  back into the Qu
14040 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 6e  eue table.  Then
14050 20 61 6e 6f 74 68 65 72 20 72 6f 77 20 69 73 20   another row is 
14060 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51  extracted from Q
14070 75 65 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ueue.** and the 
14080 69 74 65 72 61 74 69 6f 6e 20 63 6f 6e 74 69 6e  iteration contin
14090 75 65 73 20 75 6e 74 69 6c 20 74 68 65 20 51 75  ues until the Qu
140a0 65 75 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  eue table is emp
140b0 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ty..**.** If the
140c0 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
140d0 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f  operator is UNIO
140e0 4e 20 74 68 65 6e 20 6e 6f 20 64 75 70 6c 69 63  N then no duplic
140f0 61 74 65 20 72 6f 77 73 20 61 72 65 20 65 76 65  ate rows are eve
14100 72 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e  r.** inserted in
14110 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61 62  to the Queue tab
14120 6c 65 2e 20 20 54 68 65 20 69 44 69 73 74 69 6e  le.  The iDistin
14130 63 74 20 74 61 62 6c 65 20 6b 65 65 70 73 20 61  ct table keeps a
14140 20 63 6f 70 79 20 6f 66 20 61 6c 6c 20 72 6f 77   copy of all row
14150 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 65  s.** that have e
14160 76 65 72 20 62 65 65 6e 20 69 6e 73 65 72 74 65  ver been inserte
14170 64 20 69 6e 74 6f 20 51 75 65 75 65 20 61 6e 64  d into Queue and
14180 20 63 61 75 73 65 73 20 64 75 70 6c 69 63 61 74   causes duplicat
14190 65 73 20 74 6f 20 62 65 0a 2a 2a 20 64 69 73 63  es to be.** disc
141a0 61 72 64 65 64 2e 20 20 49 66 20 74 68 65 20 6f  arded.  If the o
141b0 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e  perator is UNION
141c0 20 41 4c 4c 2c 20 74 68 65 6e 20 64 75 70 6c 69   ALL, then dupli
141d0 63 61 74 65 73 20 61 72 65 20 61 6c 6c 6f 77 65  cates are allowe
141e0 64 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65  d..** .** If the
141f0 20 71 75 65 72 79 20 68 61 73 20 61 6e 20 4f 52   query has an OR
14200 44 45 52 20 42 59 2c 20 74 68 65 6e 20 65 6e 74  DER BY, then ent
14210 72 69 65 73 20 69 6e 20 74 68 65 20 51 75 65 75  ries in the Queu
14220 65 20 74 61 62 6c 65 20 61 72 65 20 6b 65 70 74  e table are kept
14230 20 69 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20   in.** ORDER BY 
14240 6f 72 64 65 72 20 61 6e 64 20 74 68 65 20 66 69  order and the fi
14250 72 73 74 20 65 6e 74 72 79 20 69 73 20 65 78 74  rst entry is ext
14260 72 61 63 74 65 64 20 66 6f 72 20 65 61 63 68 20  racted for each 
14270 63 79 63 6c 65 2e 20 20 57 69 74 68 6f 75 74 0a  cycle.  Without.
14280 2a 2a 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20  ** an ORDER BY, 
14290 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
142a0 69 73 20 6a 75 73 74 20 61 20 46 49 46 4f 2e 0a  is just a FIFO..
142b0 2a 2a 0a 2a 2a 20 49 66 20 61 20 4c 49 4d 49 54  **.** If a LIMIT
142c0 20 63 6c 61 75 73 65 20 69 73 20 70 72 6f 76 69   clause is provi
142d0 64 65 64 2c 20 74 68 65 6e 20 74 68 65 20 69 74  ded, then the it
142e0 65 72 61 74 69 6f 6e 20 73 74 6f 70 73 20 61 66  eration stops af
142f0 74 65 72 20 4c 49 4d 49 54 20 72 6f 77 73 0a 2a  ter LIMIT rows.*
14300 2a 20 68 61 76 65 20 62 65 65 6e 20 6f 75 74 70  * have been outp
14310 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20 41 20  ut to pDest.  A 
14320 4c 49 4d 49 54 20 6f 66 20 7a 65 72 6f 20 6d 65  LIMIT of zero me
14330 61 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 6e 6f  ans to output no
14340 20 72 6f 77 73 20 61 6e 64 20 61 0a 2a 2a 20 6e   rows and a.** n
14350 65 67 61 74 69 76 65 20 4c 49 4d 49 54 20 6d 65  egative LIMIT me
14360 61 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 61 6c  ans to output al
14370 6c 20 72 6f 77 73 2e 20 20 49 66 20 74 68 65 72  l rows.  If ther
14380 65 20 69 73 20 61 6c 73 6f 20 61 6e 20 4f 46 46  e is also an OFF
14390 53 45 54 20 63 6c 61 75 73 65 0a 2a 2a 20 77 69  SET clause.** wi
143a0 74 68 20 61 20 70 6f 73 69 74 69 76 65 20 76 61  th a positive va
143b0 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69  lue, then the fi
143c0 72 73 74 20 4f 46 46 53 45 54 20 6f 75 74 70 75  rst OFFSET outpu
143d0 74 73 20 61 72 65 20 64 69 73 63 61 72 64 65 64  ts are discarded
143e0 20 72 61 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20   rather.** than 
143f0 62 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 70 44  being sent to pD
14400 65 73 74 2e 20 20 54 68 65 20 4c 49 4d 49 54 20  est.  The LIMIT 
14410 63 6f 75 6e 74 20 64 6f 65 73 20 6e 6f 74 20 62  count does not b
14420 65 67 69 6e 20 75 6e 74 69 6c 20 61 66 74 65 72  egin until after
14430 20 4f 46 46 53 45 54 0a 2a 2a 20 72 6f 77 73 20   OFFSET.** rows 
14440 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65  have been skippe
14450 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
14460 64 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65  d generateWithRe
14470 63 75 72 73 69 76 65 51 75 65 72 79 28 0a 20 20  cursiveQuery(.  
14480 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
14490 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
144a0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
144b0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
144c0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 75 72      /* The recur
144d0 73 69 76 65 20 53 45 4c 45 43 54 20 74 6f 20 62  sive SELECT to b
144e0 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
144f0 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
14500 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
14510 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
14520 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c  lts */.){.  SrcL
14530 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70  ist *pSrc = p->p
14540 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Src;      /* The
14550 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
14560 74 68 65 20 72 65 63 75 72 73 69 76 65 20 71 75  the recursive qu
14570 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  ery */.  int nCo
14580 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  l = p->pEList->n
14590 45 78 70 72 3b 20 20 2f 2a 20 4e 75 6d 62 65 72  Expr;  /* Number
145a0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
145b0 68 65 20 72 65 63 75 72 73 69 76 65 20 74 61 62  he recursive tab
145c0 6c 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  le */.  Vdbe *v 
145d0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
145e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65        /* The pre
145f0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
14600 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
14610 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
14620 70 53 65 74 75 70 20 3d 20 70 2d 3e 70 50 72 69  pSetup = p->pPri
14630 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 73 65 74  or;   /* The set
14640 75 70 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  up query */.  in
14650 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20  t addrTop;      
14660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
14670 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a  op of the loop *
14680 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74  /.  int addrCont
14690 2c 20 61 64 64 72 42 72 65 61 6b 3b 20 20 20 20  , addrBreak;    
146a0 20 20 2f 2a 20 43 4f 4e 54 49 4e 55 45 20 61 6e    /* CONTINUE an
146b0 64 20 42 52 45 41 4b 20 61 64 64 72 65 73 73 65  d BREAK addresse
146c0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 72  s */.  int iCurr
146d0 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ent = 0;        
146e0 20 20 20 20 20 2f 2a 20 54 68 65 20 43 75 72 72       /* The Curr
146f0 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ent table */.  i
14700 6e 74 20 72 65 67 43 75 72 72 65 6e 74 3b 20 20  nt regCurrent;  
14710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14720 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
14730 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a   Current table *
14740 2f 0a 20 20 69 6e 74 20 69 51 75 65 75 65 3b 20  /.  int iQueue; 
14750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14760 20 20 2f 2a 20 54 68 65 20 51 75 65 75 65 20 74    /* The Queue t
14770 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44  able */.  int iD
14780 69 73 74 69 6e 63 74 20 3d 20 30 3b 20 20 20 20  istinct = 0;    
14790 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 65 6e          /* To en
147a0 73 75 72 65 20 75 6e 69 71 75 65 20 72 65 73 75  sure unique resu
147b0 6c 74 73 20 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a  lts if UNION */.
147c0 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 53 52    int eDest = SR
147d0 54 5f 46 69 66 6f 3b 20 20 20 20 20 20 20 20 20  T_Fifo;         
147e0 2f 2a 20 48 6f 77 20 74 6f 20 77 72 69 74 65 20  /* How to write 
147f0 74 6f 20 51 75 65 75 65 20 2a 2f 0a 20 20 53 65  to Queue */.  Se
14800 6c 65 63 74 44 65 73 74 20 64 65 73 74 51 75 65  lectDest destQue
14810 75 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ue;         /* S
14820 65 6c 65 63 74 44 65 73 74 20 74 61 72 67 65 74  electDest target
14830 74 69 6e 67 20 74 68 65 20 51 75 65 75 65 20 74  ting the Queue t
14840 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  able */.  int i;
14850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14860 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
14870 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
14880 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
14890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
148a0 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 45  sult code */.  E
148b0 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
148c0 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y;           /* 
148d0 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
148e0 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  use */.  Expr *p
148f0 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20  Limit;          
14900 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20         /* Saved 
14910 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
14920 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d   */.  int regLim
14930 69 74 2c 20 72 65 67 4f 66 66 73 65 74 3b 20 20  it, regOffset;  
14940 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73      /* Registers
14950 20 75 73 65 64 20 62 79 20 4c 49 4d 49 54 20 61   used by LIMIT a
14960 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 0a 23 69  nd OFFSET */..#i
14970 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14980 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 69  T_WINDOWFUNC.  i
14990 66 28 20 70 2d 3e 70 57 69 6e 20 29 7b 0a 20 20  f( p->pWin ){.  
149a0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
149b0 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
149c0 74 20 75 73 65 20 77 69 6e 64 6f 77 20 66 75 6e  t use window fun
149d0 63 74 69 6f 6e 73 20 69 6e 20 72 65 63 75 72 73  ctions in recurs
149e0 69 76 65 20 71 75 65 72 69 65 73 22 29 3b 0a 20  ive queries");. 
149f0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
14a00 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 62 74 61  endif..  /* Obta
14a10 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  in authorization
14a20 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72 73 69   to do a recursi
14a30 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 66  ve query */.  if
14a40 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
14a50 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
14a60 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30 2c 20  E_RECURSIVE, 0, 
14a70 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
14a80 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68  .  /* Process th
14a90 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  e LIMIT and OFFS
14aa0 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66 20 74  ET clauses, if t
14ab0 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 61  hey exist */.  a
14ac0 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ddrBreak = sqlit
14ad0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
14ae0 70 50 61 72 73 65 29 3b 0a 20 20 70 2d 3e 6e 53  pParse);.  p->nS
14af0 65 6c 65 63 74 52 6f 77 20 3d 20 33 32 30 3b 20  electRow = 320; 
14b00 20 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f   /* 4 billion ro
14b10 77 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c  ws */.  computeL
14b20 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
14b30 61 72 73 65 2c 20 70 2c 20 61 64 64 72 42 72 65  arse, p, addrBre
14b40 61 6b 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20  ak);.  pLimit = 
14b50 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 72 65 67  p->pLimit;.  reg
14b60 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69  Limit = p->iLimi
14b70 74 3b 0a 20 20 72 65 67 4f 66 66 73 65 74 20 3d  t;.  regOffset =
14b80 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70   p->iOffset;.  p
14b90 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
14ba0 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69  p->iLimit = p->i
14bb0 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4f  Offset = 0;.  pO
14bc0 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
14bd0 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61  erBy;..  /* Loca
14be0 74 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  te the cursor nu
14bf0 6d 62 65 72 20 6f 66 20 74 68 65 20 43 75 72 72  mber of the Curr
14c00 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66  ent table */.  f
14c10 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69  or(i=0; ALWAYS(i
14c20 3c 70 53 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b  <pSrc->nSrc); i+
14c30 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 53 72 63  +){.    if( pSrc
14c40 2d 3e 61 5b 69 5d 2e 66 67 2e 69 73 52 65 63 75  ->a[i].fg.isRecu
14c50 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69  rsive ){.      i
14c60 43 75 72 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e  Current = pSrc->
14c70 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[i].iCursor;.  
14c80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
14c90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
14ca0 61 74 65 20 63 75 72 73 6f 72 73 20 6e 75 6d 62  ate cursors numb
14cb0 65 72 73 20 66 6f 72 20 51 75 65 75 65 20 61 6e  ers for Queue an
14cc0 64 20 44 69 73 74 69 6e 63 74 2e 20 20 54 68 65  d Distinct.  The
14cd0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
14ce0 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44 69 73 74  or.  ** the Dist
14cf0 69 6e 63 74 20 74 61 62 6c 65 20 6d 75 73 74 20  inct table must 
14d00 62 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 67  be exactly one g
14d10 72 65 61 74 65 72 20 74 68 61 6e 20 51 75 65 75  reater than Queu
14d20 65 20 69 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20  e in order.  ** 
14d30 66 6f 72 20 74 68 65 20 53 52 54 5f 44 69 73 74  for the SRT_Dist
14d40 46 69 66 6f 20 61 6e 64 20 53 52 54 5f 44 69 73  Fifo and SRT_Dis
14d50 74 51 75 65 75 65 20 64 65 73 74 69 6e 61 74 69  tQueue destinati
14d60 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a  ons to work. */.
14d70 20 20 69 51 75 65 75 65 20 3d 20 70 50 61 72 73    iQueue = pPars
14d80 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28  e->nTab++;.  if(
14d90 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
14da0 20 29 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20   ){.    eDest = 
14db0 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f 44  pOrderBy ? SRT_D
14dc0 69 73 74 51 75 65 75 65 20 3a 20 53 52 54 5f 44  istQueue : SRT_D
14dd0 69 73 74 46 69 66 6f 3b 0a 20 20 20 20 69 44 69  istFifo;.    iDi
14de0 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
14df0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65  >nTab++;.  }else
14e00 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f  {.    eDest = pO
14e10 72 64 65 72 42 79 20 3f 20 53 52 54 5f 51 75 65  rderBy ? SRT_Que
14e20 75 65 20 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20  ue : SRT_Fifo;. 
14e30 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65   }.  sqlite3Sele
14e40 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
14e50 51 75 65 75 65 2c 20 65 44 65 73 74 2c 20 69 51  Queue, eDest, iQ
14e60 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  ueue);..  /* All
14e70 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 66 6f  ocate cursors fo
14e80 72 20 43 75 72 72 65 6e 74 2c 20 51 75 65 75 65  r Current, Queue
14e90 2c 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20  , and Distinct. 
14ea0 2a 2f 0a 20 20 72 65 67 43 75 72 72 65 6e 74 20  */.  regCurrent 
14eb0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
14ec0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
14ed0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
14ee0 50 73 65 75 64 6f 2c 20 69 43 75 72 72 65 6e 74  Pseudo, iCurrent
14ef0 2c 20 72 65 67 43 75 72 72 65 6e 74 2c 20 6e 43  , regCurrent, nC
14f00 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  ol);.  if( pOrde
14f10 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  rBy ){.    KeyIn
14f20 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d  fo *pKeyInfo = m
14f30 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
14f40 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  yKeyInfo(pParse,
14f50 20 70 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69   p, 1);.    sqli
14f60 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
14f70 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
14f80 6c 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65  l, iQueue, pOrde
14f90 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c  rBy->nExpr+2, 0,
14fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14fb0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
14fc0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
14fd0 46 4f 29 3b 0a 20 20 20 20 64 65 73 74 51 75 65  FO);.    destQue
14fe0 75 65 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  ue.pOrderBy = pO
14ff0 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b  rderBy;.  }else{
15000 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15010 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
15020 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65  nEphemeral, iQue
15030 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20  ue, nCol);.  }. 
15040 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
15050 20 22 51 75 65 75 65 20 74 61 62 6c 65 22 29 29   "Queue table"))
15060 3b 0a 20 20 69 66 28 20 69 44 69 73 74 69 6e 63  ;.  if( iDistinc
15070 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72  t ){.    p->addr
15080 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71  OpenEphm[0] = sq
15090 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
150a0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
150b0 72 61 6c 2c 20 69 44 69 73 74 69 6e 63 74 2c 20  ral, iDistinct, 
150c0 30 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c  0);.    p->selFl
150d0 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
150e0 68 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20  hemeral;.  }..  
150f0 2f 2a 20 44 65 74 61 63 68 20 74 68 65 20 4f 52  /* Detach the OR
15100 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 72  DER BY clause fr
15110 6f 6d 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  om the compound 
15120 53 45 4c 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70  SELECT */.  p->p
15130 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20  OrderBy = 0;..  
15140 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
15150 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 74 75  ults of the setu
15160 70 2d 71 75 65 72 79 20 69 6e 20 51 75 65 75 65  p-query in Queue
15170 2e 20 2a 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70  . */.  pSetup->p
15180 4e 65 78 74 20 3d 20 30 3b 0a 20 20 45 78 70 6c  Next = 0;.  Expl
15190 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
151a0 61 72 73 65 2c 20 31 2c 20 22 53 45 54 55 50 22  arse, 1, "SETUP"
151b0 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
151c0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
151d0 20 70 53 65 74 75 70 2c 20 26 64 65 73 74 51 75   pSetup, &destQu
151e0 65 75 65 29 3b 0a 20 20 70 53 65 74 75 70 2d 3e  eue);.  pSetup->
151f0 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 69 66 28  pNext = p;.  if(
15200 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f   rc ) goto end_o
15210 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65 72  f_recursive_quer
15220 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68  y;..  /* Find th
15230 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 74 68  e next row in th
15240 65 20 51 75 65 75 65 20 61 6e 64 20 6f 75 74 70  e Queue and outp
15250 75 74 20 74 68 61 74 20 72 6f 77 20 2a 2f 0a 20  ut that row */. 
15260 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
15270 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15280 4f 50 5f 52 65 77 69 6e 64 2c 20 69 51 75 65 75  OP_Rewind, iQueu
15290 65 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56  e, addrBreak); V
152a0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
152b0 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74  .  /* Transfer t
152c0 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 51  he next row in Q
152d0 75 65 75 65 20 6f 76 65 72 20 74 6f 20 43 75 72  ueue over to Cur
152e0 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rent */.  sqlite
152f0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
15300 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 75 72 72  P_NullRow, iCurr
15310 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72 65 73 65  ent); /* To rese
15320 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 2a  t column cache *
15330 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
15340 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
15350 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
15360 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75 65 2c 20  Column, iQueue, 
15370 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b  pOrderBy->nExpr+
15380 31 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a  1, regCurrent);.
15390 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
153a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
153b0 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 69 51  , OP_RowData, iQ
153c0 75 65 75 65 2c 20 72 65 67 43 75 72 72 65 6e 74  ueue, regCurrent
153d0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
153e0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
153f0 5f 44 65 6c 65 74 65 2c 20 69 51 75 65 75 65 29  _Delete, iQueue)
15400 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74  ;..  /* Output t
15410 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e  he single row in
15420 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 61 64   Current */.  ad
15430 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33  drCont = sqlite3
15440 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
15450 61 72 73 65 29 3b 0a 20 20 63 6f 64 65 4f 66 66  arse);.  codeOff
15460 73 65 74 28 76 2c 20 72 65 67 4f 66 66 73 65 74  set(v, regOffset
15470 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73  , addrCont);.  s
15480 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
15490 50 61 72 73 65 2c 20 70 2c 20 69 43 75 72 72 65  Parse, p, iCurre
154a0 6e 74 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c 20  nt,.      0, 0, 
154b0 70 44 65 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c  pDest, addrCont,
154c0 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69   addrBreak);.  i
154d0 66 28 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20  f( regLimit ){. 
154e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
154f0 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a  dOp2(v, OP_DecrJ
15500 75 6d 70 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69  umpZero, regLimi
15510 74 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  t, addrBreak);. 
15520 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
15530 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  v);.  }.  sqlite
15540 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
15550 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a  l(v, addrCont);.
15560 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68  .  /* Execute th
15570 65 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45  e recursive SELE
15580 43 54 20 74 61 6b 69 6e 67 20 74 68 65 20 73 69  CT taking the si
15590 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72  ngle row in Curr
155a0 65 6e 74 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ent as.  ** the 
155b0 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 72 65  value for the re
155c0 63 75 72 73 69 76 65 2d 74 61 62 6c 65 2e 20 53  cursive-table. S
155d0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
155e0 20 69 6e 20 74 68 65 20 51 75 65 75 65 2e 0a 20   in the Queue.. 
155f0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
15600 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
15610 67 61 74 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  gate ){.    sqli
15620 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
15630 73 65 2c 20 22 72 65 63 75 72 73 69 76 65 20 61  se, "recursive a
15640 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
15650 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 29   not supported")
15660 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
15670 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
15680 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
15690 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22  an((pParse, 1, "
156a0 52 45 43 55 52 53 49 56 45 20 53 54 45 50 22 29  RECURSIVE STEP")
156b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
156c0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
156d0 26 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20 20  &destQueue);.   
156e0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69   assert( p->pPri
156f0 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e  or==0 );.    p->
15700 70 50 72 69 6f 72 20 3d 20 70 53 65 74 75 70 3b  pPrior = pSetup;
15710 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4b 65 65 70 20  .  }..  /* Keep 
15720 72 75 6e 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 70  running the loop
15730 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65   until the Queue
15740 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 73   is empty */.  s
15750 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
15760 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71  , addrTop);.  sq
15770 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
15780 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65  Label(v, addrBre
15790 61 6b 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63  ak);..end_of_rec
157a0 75 72 73 69 76 65 5f 71 75 65 72 79 3a 0a 20 20  ursive_query:.  
157b0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
157c0 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
157d0 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
157e0 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
157f0 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70  pOrderBy;.  p->p
15800 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
15810 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64    return;.}.#end
15820 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
15830 54 5f 43 54 45 20 2a 2f 0a 0a 2f 2a 20 46 6f 72  T_CTE */../* For
15840 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
15850 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
15860 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
15870 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
15880 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
15890 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
158a0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
158b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
158c0 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
158d0 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
158e0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
158f0 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
15900 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
15910 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
15920 29 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65  );../*.** Handle
15930 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
15940 65 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 2d  e of a compound-
15950 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67  select that orig
15960 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 0a 2a 2a  inates from a.**
15970 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 20   VALUES clause. 
15980 20 42 79 20 68 61 6e 64 6c 69 6e 67 20 74 68 69   By handling thi
15990 73 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63  s as a special c
159a0 61 73 65 2c 20 77 65 20 61 76 6f 69 64 20 64 65  ase, we avoid de
159b0 65 70 0a 2a 2a 20 72 65 63 75 72 73 69 6f 6e 2c  ep.** recursion,
159c0 20 61 6e 64 20 74 68 75 73 20 64 6f 20 6e 6f 74   and thus do not
159d0 20 6e 65 65 64 20 74 6f 20 65 6e 66 6f 72 63 65   need to enforce
159e0 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49   the SQLITE_LIMI
159f0 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
15a00 54 0a 2a 2a 20 6f 6e 20 61 20 56 41 4c 55 45 53  T.** on a VALUES
15a10 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42   clause..**.** B
15a20 65 63 61 75 73 65 20 74 68 65 20 53 65 6c 65 63  ecause the Selec
15a30 74 20 6f 62 6a 65 63 74 20 6f 72 69 67 69 6e 61  t object origina
15a40 74 65 73 20 66 72 6f 6d 20 61 20 56 41 4c 55 45  tes from a VALUE
15a50 53 20 63 6c 61 75 73 65 3a 0a 2a 2a 20 20 20 28  S clause:.**   (
15a60 31 29 20 54 68 65 72 65 20 69 73 20 6e 6f 20 4c  1) There is no L
15a70 49 4d 49 54 20 6f 72 20 4f 46 46 53 45 54 20 6f  IMIT or OFFSET o
15a80 72 20 65 6c 73 65 20 74 68 65 72 65 20 69 73 20  r else there is 
15a90 61 20 4c 49 4d 49 54 20 6f 66 20 65 78 61 63 74  a LIMIT of exact
15aa0 6c 79 20 31 0a 2a 2a 20 20 20 28 32 29 20 41 6c  ly 1.**   (2) Al
15ab0 6c 20 74 65 72 6d 73 20 61 72 65 20 55 4e 49 4f  l terms are UNIO
15ac0 4e 20 41 4c 4c 0a 2a 2a 20 20 20 28 33 29 20 54  N ALL.**   (3) T
15ad0 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
15ae0 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 0a 2a 2a   BY clause.**.**
15af0 20 54 68 65 20 22 4c 49 4d 49 54 20 6f 66 20 65   The "LIMIT of e
15b00 78 61 63 74 6c 79 20 31 22 20 63 61 73 65 20 6f  xactly 1" case o
15b10 66 20 63 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20  f condition (1) 
15b20 63 6f 6d 65 73 20 61 62 6f 75 74 20 77 68 65 6e  comes about when
15b30 20 61 20 56 41 4c 55 45 53 0a 2a 2a 20 63 6c 61   a VALUES.** cla
15b40 75 73 65 20 6f 63 63 75 72 73 20 77 69 74 68 69  use occurs withi
15b50 6e 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73  n scalar express
15b60 69 6f 6e 20 28 65 78 3a 20 22 53 45 4c 45 43 54  ion (ex: "SELECT
15b70 20 28 56 41 4c 55 45 53 28 31 29 2c 28 32 29 2c   (VALUES(1),(2),
15b80 28 33 29 29 22 29 2e 0a 2a 2a 20 54 68 65 20 73  (3))")..** The s
15b90 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
15ba0 65 63 74 20 77 69 6c 6c 20 68 61 76 65 20 61 64  ect will have ad
15bb0 64 65 64 20 74 68 65 20 4c 49 4d 49 54 20 31 20  ded the LIMIT 1 
15bc0 63 6c 61 75 73 65 20 69 6e 20 74 68 74 20 63 61  clause in tht ca
15bd0 73 65 2e 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65  se..** Since the
15be0 20 6c 69 6d 69 74 20 69 73 20 65 78 61 63 74 6c   limit is exactl
15bf0 79 20 31 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65  y 1, we only nee
15c00 64 20 74 6f 20 65 76 61 6c 75 74 65 73 20 74 68  d to evalutes th
15c10 65 20 6c 65 66 74 2d 6d 6f 73 74 20 56 41 4c 55  e left-most VALU
15c20 45 53 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ES..*/.static in
15c30 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c  t multiSelectVal
15c40 75 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ues(.  Parse *pP
15c50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
15c60 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
15c70 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
15c80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15c90 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
15ca0 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
15cb0 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
15cc0 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
15cd0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
15ce0 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
15cf0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77  */.){.  int nRow
15d00 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 1;.  int rc =
15d10 20 30 3b 0a 20 20 69 6e 74 20 62 53 68 6f 77 41   0;.  int bShowA
15d20 6c 6c 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d  ll = p->pLimit==
15d30 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  0;.  assert( p->
15d40 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75  selFlags & SF_Mu
15d50 6c 74 69 56 61 6c 75 65 20 29 3b 0a 20 20 64 6f  ltiValue );.  do
15d60 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
15d70 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56  >selFlags & SF_V
15d80 61 6c 75 65 73 20 29 3b 0a 20 20 20 20 61 73 73  alues );.    ass
15d90 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41  ert( p->op==TK_A
15da0 4c 4c 20 7c 7c 20 28 70 2d 3e 6f 70 3d 3d 54 4b  LL || (p->op==TK
15db0 5f 53 45 4c 45 43 54 20 26 26 20 70 2d 3e 70 50  _SELECT && p->pP
15dc0 72 69 6f 72 3d 3d 30 29 20 29 3b 0a 20 20 20 20  rior==0) );.    
15dd0 61 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74  assert( p->pNext
15de0 3d 3d 30 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74  ==0 || p->pEList
15df0 2d 3e 6e 45 78 70 72 3d 3d 70 2d 3e 70 4e 65 78  ->nExpr==p->pNex
15e00 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
15e10 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   );.    if( p->p
15e20 50 72 69 6f 72 3d 3d 30 20 29 20 62 72 65 61 6b  Prior==0 ) break
15e30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
15e40 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d  >pPrior->pNext==
15e50 70 20 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  p );.    p = p->
15e60 70 50 72 69 6f 72 3b 0a 20 20 20 20 6e 52 6f 77  pPrior;.    nRow
15e70 20 2b 3d 20 62 53 68 6f 77 41 6c 6c 3b 0a 20 20   += bShowAll;.  
15e80 7d 77 68 69 6c 65 28 31 29 3b 0a 20 20 45 78 70  }while(1);.  Exp
15e90 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
15ea0 50 61 72 73 65 2c 20 30 2c 20 22 53 43 41 4e 20  Parse, 0, "SCAN 
15eb0 25 64 20 43 4f 4e 53 54 41 4e 54 20 52 4f 57 25  %d CONSTANT ROW%
15ec0 73 22 2c 20 6e 52 6f 77 2c 0a 20 20 20 20 20 20  s", nRow,.      
15ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 52                nR
15ee0 6f 77 3d 3d 31 20 3f 20 22 22 20 3a 20 22 53 22  ow==1 ? "" : "S"
15ef0 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  ));.  while( p )
15f00 7b 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65  {.    selectInne
15f10 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
15f20 20 2d 31 2c 20 30 2c 20 30 2c 20 70 44 65 73 74   -1, 0, 0, pDest
15f30 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  , 1, 1);.    if(
15f40 20 21 62 53 68 6f 77 41 6c 6c 20 29 20 62 72 65   !bShowAll ) bre
15f50 61 6b 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65  ak;.    p->nSele
15f60 63 74 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20  ctRow = nRow;.  
15f70 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a    p = p->pNext;.
15f80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
15f90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
15fa0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
15fb0 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 63 6f   to process a co
15fc0 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 66 6f 72  mpound query for
15fd0 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72  m from.** two or
15fe0 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71   more separate q
15ff0 75 65 72 69 65 73 20 75 73 69 6e 67 20 55 4e 49  ueries using UNI
16000 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45  ON, UNION ALL, E
16010 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54  XCEPT, or.** INT
16020 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22  ERSECT.**.** "p"
16030 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72   points to the r
16040 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65  ight-most of the
16050 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74   two queries.  t
16060 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a  he query on the.
16070 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50  ** left is p->pP
16080 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20  rior.  The left 
16090 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f  query could also
160a0 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71   be a compound q
160b0 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68  uery.** in which
160c0 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
160d0 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  ne will be calle
160e0 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a  d recursively. .
160f0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
16100 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71  s of the total q
16110 75 65 72 79 20 61 72 65 20 74 6f 20 62 65 20 77  uery are to be w
16120 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65  ritten into a de
16130 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  stination.** of 
16140 74 79 70 65 20 65 44 65 73 74 20 77 69 74 68 20  type eDest with 
16150 70 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e  parameter iParm.
16160 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31  .**.** Example 1
16170 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68  :  Consider a th
16180 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64  ree-way compound
16190 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
161a0 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
161b0 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e   a FROM t1 UNION
161c0 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
161d0 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63  2 UNION SELECT c
161e0 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54   FROM t3.**.** T
161f0 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73  his statement is
16200 20 70 61 72 73 65 64 20 75 70 20 61 73 20 66 6f   parsed up as fo
16210 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
16220 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
16230 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20  3.**      |.**  
16240 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c      `----->  SEL
16250 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a  ECT b FROM t2.**
16260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16270 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
16280 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45      `------>  SE
16290 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a  LECT a FROM t1.*
162a0 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20  *.** The arrows 
162b0 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20 61  in the diagram a
162c0 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20 74  bove represent t
162d0 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72  he Select.pPrior
162e0 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20   pointer..** So 
162f0 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
16300 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70  is called with p
16310 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33   equal to the t3
16320 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20   query, then.** 
16330 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74  pPrior will be t
16340 68 65 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d  he t2 query.  p-
16350 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55  >op will be TK_U
16360 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73  NION in this cas
16370 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20  e..**.** Notice 
16380 74 68 61 74 20 62 65 63 61 75 73 65 20 6f 66 20  that because of 
16390 74 68 65 20 77 61 79 20 53 51 4c 69 74 65 20 70  the way SQLite p
163a0 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53  arses compound S
163b0 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69  ELECTs, the.** i
163c0 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74  ndividual select
163d0 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66  s always group f
163e0 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
163f0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
16400 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20   multiSelect(.  
16410 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
16420 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
16430 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
16440 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
16450 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
16460 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
16470 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
16480 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
16490 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
164a0 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
164b0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
164c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
164d0 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73  _OK;   /* Succes
164e0 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75  s code from a su
164f0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65  broutine */.  Se
16500 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20  lect *pPrior;   
16510 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
16520 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c  ELECT immediatel
16530 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f  y to our left */
16540 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
16550 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
16560 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69  rate code to thi
16570 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65  s VDBE */.  Sele
16580 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20  ctDest dest;    
16590 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65    /* Alternative
165a0 20 64 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f   data destinatio
165b0 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  n */.  Select *p
165c0 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20  Delete = 0;  /* 
165d0 43 68 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20  Chain of simple 
165e0 73 65 6c 65 63 74 73 20 74 6f 20 64 65 6c 65 74  selects to delet
165f0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
16600 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  db;          /* 
16610 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
16620 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b  ion */..  /* Mak
16630 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
16640 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  no ORDER BY or L
16650 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70  IMIT clause on p
16660 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f  rior SELECTs.  O
16670 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73  nly.  ** the las
16680 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53  t (right-most) S
16690 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72  ELECT in the ser
166a0 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20  ies may have an 
166b0 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
166c0 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  T..  */.  assert
166d0 28 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72  ( p && p->pPrior
166e0 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20   );  /* Calling 
166f0 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74  function guarant
16700 65 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f  ees this much */
16710 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73  .  assert( (p->s
16720 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
16730 75 72 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d  ursive)==0 || p-
16740 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70  >op==TK_ALL || p
16750 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
16760 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
16770 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  >db;.  pPrior = 
16780 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 65 73  p->pPrior;.  des
16790 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66  t = *pDest;.  if
167a0 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  ( pPrior->pOrder
167b0 42 79 20 7c 7c 20 70 50 72 69 6f 72 2d 3e 70 4c  By || pPrior->pL
167c0 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
167d0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
167e0 73 65 2c 22 25 73 20 63 6c 61 75 73 65 20 73 68  se,"%s clause sh
167f0 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
16800 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a  %s not before",.
16810 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f        pPrior->pO
16820 72 64 65 72 42 79 21 3d 30 20 3f 20 22 4f 52 44  rderBy!=0 ? "ORD
16830 45 52 20 42 59 22 20 3a 20 22 4c 49 4d 49 54 22  ER BY" : "LIMIT"
16840 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70  , selectOpName(p
16850 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d  ->op));.    rc =
16860 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
16870 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
16880 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   }..  v = sqlite
16890 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
168a0 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
168b0 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45   );  /* The VDBE
168c0 20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65 64   already created
168d0 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63   by calling func
168e0 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72  tion */..  /* Cr
168f0 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61  eate the destina
16900 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74  tion temporary t
16910 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72  able if necessar
16920 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73  y.  */.  if( des
16930 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  t.eDest==SRT_Eph
16940 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73  emTab ){.    ass
16950 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
16960 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
16970 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
16980 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73  enEphemeral, des
16990 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45  t.iSDParm, p->pE
169a0 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
169b0 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
169c0 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20  RT_Table;.  }.. 
169d0 20 2f 2a 20 53 70 65 63 69 61 6c 20 68 61 6e 64   /* Special hand
169e0 6c 69 6e 67 20 66 6f 72 20 61 20 63 6f 6d 70 6f  ling for a compo
169f0 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20  und-select that 
16a00 6f 72 69 67 69 6e 61 74 65 73 20 61 73 20 61 20  originates as a 
16a10 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 20  VALUES clause.. 
16a20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
16a30 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69  Flags & SF_Multi
16a40 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 72 63 20  Value ){.    rc 
16a50 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c  = multiSelectVal
16a60 75 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ues(pParse, p, &
16a70 64 65 73 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20  dest);.    goto 
16a80 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
16a90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
16aa0 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54   sure all SELECT
16ab0 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  s in the stateme
16ac0 6e 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  nt have the same
16ad0 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
16ae0 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69  nts.  ** in thei
16af0 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20  r result sets.. 
16b00 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
16b10 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f  >pEList && pPrio
16b20 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 61  r->pEList );.  a
16b30 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
16b40 2d 3e 6e 45 78 70 72 3d 3d 70 50 72 69 6f 72 2d  ->nExpr==pPrior-
16b50 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
16b60 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
16b70 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66 28  E_OMIT_CTE.  if(
16b80 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
16b90 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  F_Recursive ){. 
16ba0 20 20 20 67 65 6e 65 72 61 74 65 57 69 74 68 52     generateWithR
16bb0 65 63 75 72 73 69 76 65 51 75 65 72 79 28 70 50  ecursiveQuery(pP
16bc0 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b  arse, p, &dest);
16bd0 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
16be0 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53  .  /* Compound S
16bf0 45 4c 45 43 54 73 20 74 68 61 74 20 68 61 76 65  ELECTs that have
16c00 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
16c10 75 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20  use are handled 
16c20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f  separately..  */
16c30 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
16c40 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  By ){.    return
16c50 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
16c60 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70  rBy(pParse, p, p
16c70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Dest);.  }else{.
16c80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16c90 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20  OMIT_EXPLAIN.   
16ca0 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72   if( pPrior->pPr
16cb0 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ior==0 ){.      
16cc0 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
16cd0 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 43 4f  ((pParse, 1, "CO
16ce0 4d 50 4f 55 4e 44 20 51 55 45 52 59 22 29 29 3b  MPOUND QUERY"));
16cf0 0a 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75  .      ExplainQu
16d00 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
16d10 20 31 2c 20 22 4c 45 46 54 2d 4d 4f 53 54 20 53   1, "LEFT-MOST S
16d20 55 42 51 55 45 52 59 22 29 29 3b 0a 20 20 20 20  UBQUERY"));.    
16d30 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
16d40 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
16d50 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  or the left and 
16d60 72 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61  right SELECT sta
16d70 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a  tements..    */.
16d80 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f      switch( p->o
16d90 70 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  p ){.      case 
16da0 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  TK_ALL: {.      
16db0 20 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a    int addr = 0;.
16dc0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d          int nLim
16dd0 69 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  it;.        asse
16de0 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69  rt( !pPrior->pLi
16df0 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70  mit );.        p
16e00 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20  Prior->iLimit = 
16e10 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->iLimit;.     
16e20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73     pPrior->iOffs
16e30 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b  et = p->iOffset;
16e40 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d  .        pPrior-
16e50 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69  >pLimit = p->pLi
16e60 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  mit;.        rc 
16e70 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
16e80 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
16e90 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20  &dest);.        
16ea0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
16eb0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
16ec0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
16ed0 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
16ee0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16ef0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
16f00 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4c  0;.        p->iL
16f10 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  imit = pPrior->i
16f20 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70  Limit;.        p
16f30 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69  ->iOffset = pPri
16f40 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20  or->iOffset;.   
16f50 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d       if( p->iLim
16f60 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  it ){.          
16f70 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
16f80 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
16f90 66 4e 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69 74 29  fNot, p->iLimit)
16fa0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
16fb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
16fc0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75  eComment((v, "Ju
16fd0 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49  mp ahead if LIMI
16fe0 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20  T reached"));.  
16ff0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69          if( p->i
17000 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Offset ){.      
17010 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17020 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66  eAddOp3(v, OP_Of
17030 66 73 65 74 4c 69 6d 69 74 2c 0a 20 20 20 20 20  fsetLimit,.     
17040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17050 20 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d           p->iLim
17060 69 74 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31  it, p->iOffset+1
17070 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20  , p->iOffset);. 
17080 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17090 20 20 20 7d 0a 20 20 20 20 20 20 20 20 45 78 70     }.        Exp
170a0 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
170b0 50 61 72 73 65 2c 20 31 2c 20 22 55 4e 49 4f 4e  Parse, 1, "UNION
170c0 20 41 4c 4c 22 29 29 3b 0a 20 20 20 20 20 20 20   ALL"));.       
170d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
170e0 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
170f0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 74  dest);.        t
17100 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
17110 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
17120 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
17130 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 70  Prior;.        p
17140 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
17150 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53  r;.        p->nS
17160 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
17170 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e  e3LogEstAdd(p->n
17180 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f  SelectRow, pPrio
17190 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a  r->nSelectRow);.
171a0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 69          if( pPri
171b0 6f 72 2d 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20  or->pLimit.     
171c0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78      && sqlite3Ex
171d0 70 72 49 73 49 6e 74 65 67 65 72 28 70 50 72 69  prIsInteger(pPri
171e0 6f 72 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65 66  or->pLimit->pLef
171f0 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20  t, &nLimit).    
17200 20 20 20 20 20 26 26 20 6e 4c 69 6d 69 74 3e 30       && nLimit>0
17210 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f   && p->nSelectRo
17220 77 20 3e 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w > sqlite3LogEs
17230 74 28 28 75 36 34 29 6e 4c 69 6d 69 74 29 20 0a  t((u64)nLimit) .
17240 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
17250 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
17260 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
17270 73 74 28 28 75 36 34 29 6e 4c 69 6d 69 74 29 3b  st((u64)nLimit);
17280 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17290 20 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20     if( addr ){. 
172a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
172b0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
172c0 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  addr);.        }
172d0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
172e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
172f0 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20  se TK_EXCEPT:.  
17300 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f      case TK_UNIO
17310 4e 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  N: {.        int
17320 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a   unionTab;    /*
17330 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
17340 66 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65  f the temp table
17350 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20   holding result 
17360 2a 2f 0a 20 20 20 20 20 20 20 20 75 38 20 6f 70  */.        u8 op
17370 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f   = 0;       /* O
17380 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f  ne of the SRT_ o
17390 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70  perations to app
173a0 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20  ly to self */.  
173b0 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f        int priorO
173c0 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52  p;     /* The SR
173d0 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  T_ operation to 
173e0 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73  apply to prior s
173f0 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20  elects */.      
17400 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20    Expr *pLimit; 
17410 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75     /* Saved valu
17420 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20  es of p->nLimit 
17430 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
17440 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 53 65  addr;.        Se
17450 6c 65 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65  lectDest unionde
17460 73 74 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 74  st;.  .        t
17470 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
17480 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20  TK_EXCEPT );.   
17490 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
174a0 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
174b0 3b 0a 20 20 20 20 20 20 20 20 70 72 69 6f 72 4f  ;.        priorO
174c0 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
174d0 20 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e         if( dest.
174e0 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 29  eDest==priorOp )
174f0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
17500 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65  e can reuse a te
17510 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65  mporary table ge
17520 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c  nerated by a SEL
17530 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20  ECT to our.     
17540 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20       ** right.. 
17550 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
17560 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
17570 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20  >pLimit==0 );   
17580 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65     /* Not allowe
17590 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c  d on leftward el
175a0 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  ements */.      
175b0 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64      unionTab = d
175c0 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20  est.iSDParm;.   
175d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
175e0 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c        /* We will
175f0 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
17600 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72  our own temporar
17610 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  y table to hold 
17620 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
17630 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
17640 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 20  sults..         
17650 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e   */.          un
17660 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d  ionTab = pParse-
17670 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
17680 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
17690 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
176a0 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
176b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
176c0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
176d0 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30  ral, unionTab, 0
176e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
176f0 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
17700 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[0] == -1 );
17710 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 64  .          p->ad
17720 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
17730 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 20 20  addr;.          
17740 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
17750 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
17760 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
17770 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
17780 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
17790 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20         }.  .    
177a0 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
177b0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
177c0 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20  s to our left.  
177d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
177e0 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72   assert( !pPrior
177f0 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  ->pOrderBy );.  
17800 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
17810 65 63 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69  ectDestInit(&uni
17820 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c  ondest, priorOp,
17830 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20   unionTab);.    
17840 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17850 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
17860 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73  Prior, &uniondes
17870 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
17880 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
17890 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
178a0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
178b0 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  .  .        /* C
178c0 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ode the current 
178d0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
178e0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
178f0 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
17900 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20  K_EXCEPT ){.    
17910 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45        op = SRT_E
17920 78 63 65 70 74 3b 0a 20 20 20 20 20 20 20 20 7d  xcept;.        }
17930 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
17940 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54  assert( p->op==T
17950 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20  K_UNION );.     
17960 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e       op = SRT_Un
17970 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ion;.        }. 
17980 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
17990 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4c   = 0;.        pL
179a0 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
179b0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69  ;.        p->pLi
179c0 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  mit = 0;.       
179d0 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74   uniondest.eDest
179e0 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 20 20 45   = op;.        E
179f0 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
17a00 28 70 50 61 72 73 65 2c 20 31 2c 20 22 25 73 20  (pParse, 1, "%s 
17a10 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45  USING TEMP B-TRE
17a20 45 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E",.            
17a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
17a40 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
17a50 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  )));.        rc 
17a60 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
17a70 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f  pParse, p, &unio
17a80 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20  ndest);.        
17a90 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
17aa0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
17ab0 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74     /* Query flat
17ac0 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65  tening in sqlite
17ad0 33 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20  3Select() might 
17ae0 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72  refill p->pOrder
17af0 42 79 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 42  By..        ** B
17b00 65 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74 65  e sure to delete
17b10 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74 68   p->pOrderBy, th
17b20 65 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69  erefore, to avoi
17b30 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e  d a memory leak.
17b40 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
17b50 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
17b60 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
17b70 79 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 6c  y);.        pDel
17b80 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ete = p->pPrior;
17b90 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69  .        p->pPri
17ba0 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
17bb0 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
17bc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
17bd0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
17be0 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  N ){.          p
17bf0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
17c00 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
17c10 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70  p->nSelectRow, p
17c20 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
17c30 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  w);.        }.  
17c40 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
17c50 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
17c60 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20  Limit);.        
17c70 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
17c80 69 74 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69  it;.        p->i
17c90 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
17ca0 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
17cb0 30 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a  0;.  .        /*
17cc0 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74   Convert the dat
17cd0 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61  a in the tempora
17ce0 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68  ry table into wh
17cf0 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20  atever form.    
17d00 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61      ** it is tha
17d10 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e  t we currently n
17d20 65 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  eed..        */.
17d30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17d40 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69  unionTab==dest.i
17d50 53 44 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65  SDParm || dest.e
17d60 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b  Dest!=priorOp );
17d70 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65 73  .        if( des
17d80 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70  t.eDest!=priorOp
17d90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
17da0 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
17db0 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20   iStart;.       
17dc0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
17dd0 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  List );.        
17de0 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
17df0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
17e00 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
17e10 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
17e20 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
17e30 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
17e40 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
17e50 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
17e60 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
17e70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17e80 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
17e90 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c  ewind, unionTab,
17ea0 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
17eb0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
17ec0 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
17ed0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
17ee0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20  Addr(v);.       
17ef0 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
17f00 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 75 6e  op(pParse, p, un
17f10 69 6f 6e 54 61 62 2c 0a 20 20 20 20 20 20 20 20  ionTab,.        
17f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f30 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69    0, 0, &dest, i
17f40 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  Cont, iBreak);. 
17f50 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17f60 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
17f70 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
17f80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17f90 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
17fa0 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53  xt, unionTab, iS
17fb0 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65 72  tart); VdbeCover
17fc0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
17fd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
17fe0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
17ff0 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eak);.          
18000 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18010 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75  2(v, OP_Close, u
18020 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
18030 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
18040 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
18050 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
18060 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49  ert( p->op==TK_I
18070 4e 54 45 52 53 45 43 54 20 29 3b 20 7b 0a 20 20  NTERSECT ); {.  
18080 20 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20        int tab1, 
18090 74 61 62 32 3b 0a 20 20 20 20 20 20 20 20 69 6e  tab2;.        in
180a0 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
180b0 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20   iStart;.       
180c0 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 0a 20   Expr *pLimit;. 
180d0 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b         int addr;
180e0 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44  .        SelectD
180f0 65 73 74 20 69 6e 74 65 72 73 65 63 74 64 65 73  est intersectdes
18100 74 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  t;.        int r
18110 31 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a  1;.  .        /*
18120 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69   INTERSECT is di
18130 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
18140 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74   others since it
18150 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
18160 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61    ** two tempora
18170 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63  ry tables.  Henc
18180 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e  e it has its own
18190 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20   case.  Begin.  
181a0 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f        ** by allo
181b0 63 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65  cating the table
181c0 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a  s we will need..
181d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
181e0 20 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65     tab1 = pParse
181f0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
18200 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d    tab2 = pParse-
18210 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
18220 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
18230 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 0a 20 20  erBy==0 );.  .  
18240 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
18250 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18260 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
18270 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  al, tab1, 0);.  
18280 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
18290 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
182a0 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
182b0 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
182c0 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[0] = addr;.   
182d0 20 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f       findRightmo
182e0 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20  st(p)->selFlags 
182f0 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
18300 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ral;.        ass
18310 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
18320 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  ;.  .        /* 
18330 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73  Code the SELECTs
18340 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74   to our left int
18350 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
18360 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20  e "tab1"..      
18370 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c    */.        sql
18380 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
18390 69 74 28 26 69 6e 74 65 72 73 65 63 74 64 65 73  it(&intersectdes
183a0 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61  t, SRT_Union, ta
183b0 62 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  b1);.        rc 
183c0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
183d0 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
183e0 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b  &intersectdest);
183f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
18400 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
18410 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
18420 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
18430 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  .        /* Code
18440 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
18450 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61  ECT into tempora
18460 72 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a  ry table "tab2".
18470 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
18480 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
18490 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
184a0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
184b0 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20   tab2, 0);.     
184c0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
184d0 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d  drOpenEphm[1] ==
184e0 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70   -1 );.        p
184f0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
18500 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
18510 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
18520 0a 20 20 20 20 20 20 20 20 70 4c 69 6d 69 74 20  .        pLimit 
18530 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
18540 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
18550 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 65   0;.        inte
18560 72 73 65 63 74 64 65 73 74 2e 69 53 44 50 61 72  rsectdest.iSDPar
18570 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20 20 20 20  m = tab2;.      
18580 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
18590 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22  an((pParse, 1, "
185a0 25 73 20 55 53 49 4e 47 20 54 45 4d 50 20 42 2d  %s USING TEMP B-
185b0 54 52 45 45 22 2c 0a 20 20 20 20 20 20 20 20 20  TREE",.         
185c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185d0 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
185e0 3e 6f 70 29 29 29 3b 0a 20 20 20 20 20 20 20 20  >op)));.        
185f0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
18600 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69  ct(pParse, p, &i
18610 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20  ntersectdest);. 
18620 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
18630 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18640 3b 0a 20 20 20 20 20 20 20 20 70 44 65 6c 65 74  ;.        pDelet
18650 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
18660 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
18670 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
18680 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63     if( p->nSelec
18690 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65  tRow>pPrior->nSe
186a0 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20  lectRow ){.     
186b0 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
186c0 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow = pPrior->nSe
186d0 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 20  lectRow;.       
186e0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
186f0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
18700 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
18710 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
18720 20 70 4c 69 6d 69 74 3b 0a 20 20 0a 20 20 20 20   pLimit;.  .    
18730 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
18740 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65  code to take the
18750 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66   intersection of
18760 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61   the two tempora
18770 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  ry.        ** ta
18780 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bles..        */
18790 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
187a0 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
187b0 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
187c0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
187d0 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  bel(pParse);.   
187e0 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c       iCont = sql
187f0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
18800 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
18810 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
18820 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
18830 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
18840 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18850 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
18860 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61  ind, tab1, iBrea
18870 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
18880 28 76 29 3b 0a 20 20 20 20 20 20 20 20 72 31 20  (v);.        r1 
18890 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
188a0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
188b0 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
188c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
188d0 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 74  v, OP_RowData, t
188e0 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  ab1, r1);.      
188f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18900 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74  Op4Int(v, OP_Not
18910 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f  Found, tab2, iCo
18920 6e 74 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20  nt, r1, 0);.    
18930 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
18940 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
18950 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
18960 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
18970 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e          selectIn
18980 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
18990 70 2c 20 74 61 62 31 2c 0a 20 20 20 20 20 20 20  p, tab1,.       
189a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189b0 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43   0, 0, &dest, iC
189c0 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ont, iBreak);.  
189d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
189e0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
189f0 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20   iCont);.       
18a00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18a10 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74  p2(v, OP_Next, t
18a20 61 62 31 2c 20 69 53 74 61 72 74 29 3b 20 56 64  ab1, iStart); Vd
18a30 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
18a40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18a50 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
18a60 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
18a70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18a80 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
18a90 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
18aa0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18ab0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
18ac0 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  e, tab1, 0);.   
18ad0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18ae0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 23    }.    }.  .  #
18af0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18b00 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20 69  IT_EXPLAIN.    i
18b10 66 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29  f( p->pNext==0 )
18b20 7b 0a 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51  {.      ExplainQ
18b30 75 65 72 79 50 6c 61 6e 50 6f 70 28 70 50 61 72  ueryPlanPop(pPar
18b40 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 23 65 6e  se);.    }.  #en
18b50 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  dif.  }.  .  /* 
18b60 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e  Compute collatin
18b70 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64  g sequences used
18b80 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72   by .  ** tempor
18b90 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65  ary tables neede
18ba0 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
18bb0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
18bc0 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20  ct..  ** Attach 
18bd0 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
18be0 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d  cture to all tem
18bf0 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 20  porary tables.. 
18c00 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65   **.  ** This se
18c10 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20  ction is run by 
18c20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53  the right-most S
18c30 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
18c40 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43  only..  ** SELEC
18c50 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
18c60 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20  the left always 
18c70 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e 20  skip this part. 
18c80 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a   The right-most.
18c90 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68    ** SELECT migh
18ca0 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73  t also skip this
18cb0 20 70 61 72 74 20 69 66 20 69 74 20 68 61 73 20   part if it has 
18cc0 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
18cd0 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74  se and.  ** no t
18ce0 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20 72  emp tables are r
18cf0 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20  equired..  */.  
18d00 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
18d10 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72  & SF_UsesEphemer
18d20 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  al ){.    int i;
18d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d40 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
18d50 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b  counter */.    K
18d60 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
18d70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
18d80 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
18d90 63 65 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ce for the resul
18da0 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c  t set */.    Sel
18db0 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  ect *pLoop;     
18dc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
18dd0 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
18de0 68 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  h SELECT stateme
18df0 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53  nts */.    CollS
18e00 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20  eq **apColl;    
18e10 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
18e20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
18e30 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
18e40 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  ] */.    int nCo
18e50 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
18e60 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
18e70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72   of columns in r
18e80 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
18e90 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e 65    assert( p->pNe
18ea0 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e 43 6f  xt==0 );.    nCo
18eb0 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  l = p->pEList->n
18ec0 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e  Expr;.    pKeyIn
18ed0 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
18ee0 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 43 6f  nfoAlloc(db, nCo
18ef0 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21  l, 1);.    if( !
18f00 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
18f10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
18f20 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
18f30 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
18f40 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
18f50 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c   for(i=0, apColl
18f60 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  =pKeyInfo->aColl
18f70 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61  ; i<nCol; i++, a
18f80 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20  pColl++){.      
18f90 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53  *apColl = multiS
18fa0 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
18fb0 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20  rse, p, i);.    
18fc0 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c    if( 0==*apColl
18fd0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43   ){.        *apC
18fe0 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
18ff0 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
19000 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f   }..    for(pLoo
19010 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  p=p; pLoop; pLoo
19020 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29  p=pLoop->pPrior)
19030 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
19040 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
19050 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70      int addr = p
19060 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
19070 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  hm[i];.        i
19080 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20  f( addr<0 ){.   
19090 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d         /* If [0]
190a0 20 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20   is unused then 
190b0 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73  [1] is also unus
190c0 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20  ed.  So we can. 
190d0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61           ** alwa
190e0 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20  ys safely abort 
190f0 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66  as soon as the f
19100 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74  irst unused slot
19110 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20   is found */.   
19120 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
19130 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
19140 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20  hm[1]<0 );.     
19150 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19160 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
19170 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
19180 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29  2(v, addr, nCol)
19190 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
191a0 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
191b0 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 73 71   addr, (char*)sq
191c0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28  lite3KeyInfoRef(
191d0 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20  pKeyInfo),.     
191e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191f0 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46         P4_KEYINF
19200 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f  O);.        pLoo
19210 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
19220 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  i] = -1;.      }
19230 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
19240 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
19250 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d  KeyInfo);.  }..m
19260 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a  ulti_select_end:
19270 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20  .  pDest->iSdst 
19280 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20  = dest.iSdst;.  
19290 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64  pDest->nSdst = d
192a0 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c  est.nSdst;.  sql
192b0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
192c0 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20  (db, pDelete);. 
192d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
192e0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
192f0 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
19300 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 72  ECT */../*.** Er
19310 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20  ror message for 
19320 77 68 65 6e 20 74 77 6f 20 6f 72 20 6d 6f 72 65  when two or more
19330 20 74 65 72 6d 73 20 6f 66 20 61 20 63 6f 6d 70   terms of a comp
19340 6f 75 6e 64 20 73 65 6c 65 63 74 20 68 61 76 65  ound select have
19350 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 73 69   different.** si
19360 7a 65 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a  ze result sets..
19370 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
19380 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65 72  electWrongNumTer
19390 6d 73 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70  msError(Parse *p
193a0 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
193b0 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  ){.  if( p->selF
193c0 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73  lags & SF_Values
193d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
193e0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
193f0 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75 73 74  "all VALUES must
19400 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
19410 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 22 29  umber of terms")
19420 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
19430 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
19440 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20  Parse, "SELECTs 
19450 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  to the left and 
19460 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20  right of %s".   
19470 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65     " do not have
19480 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
19490 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
194a0 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d  ns", selectOpNam
194b0 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 7d  e(p->op));.  }.}
194c0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
194d0 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
194e0 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e  e for a coroutin
194f0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
19500 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20   of a.** SELECT 
19510 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  statment..**.** 
19520 54 68 65 20 64 61 74 61 20 74 6f 20 62 65 20 6f  The data to be o
19530 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69 6e  utput is contain
19540 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73 74  ed in pIn->iSdst
19550 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20  .  There are.** 
19560 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75 6d  pIn->nSdst colum
19570 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e  ns to be output.
19580 20 20 70 44 65 73 74 20 69 73 20 77 68 65 72 65    pDest is where
19590 20 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75   the output shou
195a0 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a  ld.** be sent..*
195b0 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69  *.** regReturn i
195c0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
195d0 74 68 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c  the register hol
195e0 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74  ding the subrout
195f0 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64  ine.** return ad
19600 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  dress..**.** If 
19610 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69  regPrev>0 then i
19620 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 72  t is the first r
19630 65 67 69 73 74 65 72 20 69 6e 20 61 20 76 65 63  egister in a vec
19640 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f  tor that.** reco
19650 72 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  rds the previous
19660 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65   output.  mem[re
19670 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61 67  gPrev] is a flag
19680 20 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a 2a   that is false.*
19690 2a 20 69 66 20 74 68 65 72 65 20 68 61 73 20 62  * if there has b
196a0 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73 20  een no previous 
196b0 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65 67 50  output.  If regP
196c0 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65 20  rev>0 then code 
196d0 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20  is.** generated 
196e0 74 6f 20 73 75 70 70 72 65 73 73 20 64 75 70 6c  to suppress dupl
196f0 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e 66  icates.  pKeyInf
19700 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f  o is used for co
19710 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e  mparing.** keys.
19720 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49  .**.** If the LI
19730 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e  MIT found in p->
19740 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68 65  iLimit is reache
19750 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74  d, jump immediat
19760 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b  ely to.** iBreak
19770 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19780 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
19790 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72 73  broutine(.  Pars
197a0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
197b0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
197c0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
197d0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
197e0 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
197f0 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
19800 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49 6e   SelectDest *pIn
19810 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f  ,        /* Coro
19820 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67 20  utine supplying 
19830 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74  data */.  Select
19840 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20  Dest *pDest,    
19850 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 65    /* Where to se
19860 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20  nd the data */. 
19870 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c 20   int regReturn, 
19880 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
19890 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72  return address r
198a0 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
198b0 20 72 65 67 50 72 65 76 2c 20 20 20 20 20 20 20   regPrev,       
198c0 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
198d0 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72   result register
198e0 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73  .  No uniqueness
198f0 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e   if 0 */.  KeyIn
19900 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
19910 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72     /* For compar
19920 69 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f 75  ing with previou
19930 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74  s entry */.  int
19940 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20   iBreak         
19950 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
19960 65 20 69 66 20 77 65 20 68 69 74 20 74 68 65 20  e if we hit the 
19970 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64  LIMIT */.){.  Vd
19980 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
19990 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f  pVdbe;.  int iCo
199a0 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64  ntinue;.  int ad
199b0 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71  dr;..  addr = sq
199c0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
199d0 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74  Addr(v);.  iCont
199e0 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64  inue = sqlite3Vd
199f0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
19a00 73 65 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72  se);..  /* Suppr
19a10 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 20 66  ess duplicates f
19a20 6f 72 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54  or UNION, EXCEPT
19a30 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20  , and INTERSECT 
19a40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50  .  */.  if( regP
19a50 72 65 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  rev ){.    int a
19a60 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 20  ddr1, addr2;.   
19a70 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
19a80 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
19a90 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72 65 76 29  _IfNot, regPrev)
19aa0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
19ab0 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73  );.    addr2 = s
19ac0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
19ad0 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
19ae0 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50  pIn->iSdst, regP
19af0 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73  rev+1, pIn->nSds
19b00 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
19b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b   (char*)sqlite3K
19b30 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e  eyInfoRef(pKeyIn
19b40 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  fo), P4_KEYINFO)
19b50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19b60 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
19b70 6d 70 2c 20 61 64 64 72 32 2b 32 2c 20 69 43 6f  mp, addr2+2, iCo
19b80 6e 74 69 6e 75 65 2c 20 61 64 64 72 32 2b 32 29  ntinue, addr2+2)
19b90 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
19ba0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
19bb0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
19bc0 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dr1);.    sqlite
19bd0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
19be0 50 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64  P_Copy, pIn->iSd
19bf0 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70  st, regPrev+1, p
19c00 49 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20  In->nSdst-1);.  
19c10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19c20 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
19c30 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a  r, 1, regPrev);.
19c40 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
19c50 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
19c60 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  ed ) return 0;..
19c70 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68    /* Suppress th
19c80 65 20 66 69 72 73 74 20 4f 46 46 53 45 54 20 65  e first OFFSET e
19c90 6e 74 72 69 65 73 20 69 66 20 74 68 65 72 65 20  ntries if there 
19ca0 69 73 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61  is an OFFSET cla
19cb0 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f  use.  */.  codeO
19cc0 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
19cd0 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  set, iContinue);
19ce0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 65 73  ..  assert( pDes
19cf0 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 45 78  t->eDest!=SRT_Ex
19d00 69 73 74 73 20 29 3b 0a 20 20 61 73 73 65 72 74  ists );.  assert
19d10 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d  ( pDest->eDest!=
19d20 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 73  SRT_Table );.  s
19d30 77 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44  witch( pDest->eD
19d40 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74  est ){.    /* St
19d50 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61  ore the result a
19d60 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75  s data using a u
19d70 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a  nique key..    *
19d80 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  /.    case SRT_E
19d90 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
19da0 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
19db0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
19dc0 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  se);.      int r
19dd0 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
19de0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
19df0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19e00 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
19e10 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53  eRecord, pIn->iS
19e20 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c  dst, pIn->nSdst,
19e30 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
19e40 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19e50 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44   OP_NewRowid, pD
19e60 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 32  est->iSDParm, r2
19e70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19e80 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
19e90 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e  _Insert, pDest->
19ea0 69 53 44 50 61 72 6d 2c 20 72 31 2c 20 72 32 29  iSDParm, r1, r2)
19eb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
19ec0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
19ed0 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
19ee0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
19ef0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
19f00 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  e, r2);.      sq
19f10 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
19f20 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
19f30 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19f40 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
19f50 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
19f60 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  Y.    /* If we a
19f70 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65  re creating a se
19f80 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49  t for an "expr I
19f90 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2e  N (SELECT ...)".
19fa0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
19fb0 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
19fc0 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20    int r1;.      
19fd0 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e  testcase( pIn->n
19fe0 53 64 73 74 3e 31 20 29 3b 0a 20 20 20 20 20 20  Sdst>1 );.      
19ff0 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
1a000 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
1a010 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a020 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
1a030 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69  keRecord, pIn->i
1a040 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
1a050 2c 20 0a 20 20 20 20 20 20 20 20 20 20 72 31 2c  , .          r1,
1a060 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74   pDest->zAffSdst
1a070 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
1a080 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a090 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
1a0a0 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74  IdxInsert, pDest
1a0b0 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 0a 20  ->iSDParm, r1,. 
1a0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0d0 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 69            pIn->i
1a0e0 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
1a0f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a100 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1a110 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
1a120 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1a130 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
1a140 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63  s a scalar selec
1a150 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  t that is part o
1a160 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  f an expression,
1a170 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f   then.    ** sto
1a180 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
1a190 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
1a1a0 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
1a1b0 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20  d break out.    
1a1c0 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c  ** of the scan l
1a1d0 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
1a1e0 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
1a1f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1a200 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70  n->nSdst==1 || p
1a210 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b  Parse->nErr>0 );
1a220 20 20 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d    testcase( pIn-
1a230 3e 6e 53 64 73 74 21 3d 31 20 29 3b 0a 20 20 20  >nSdst!=1 );.   
1a240 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1a250 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70  deMove(pParse, p
1a260 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74  In->iSdst, pDest
1a270 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20  ->iSDParm, 1);. 
1a280 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
1a290 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75  T clause will ju
1a2a0 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f  mp out of the lo
1a2b0 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
1a2c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1a2d0 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
1a2e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
1a2f0 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f  BQUERY */..    /
1a300 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72  * The results ar
1a310 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65  e stored in a se
1a320 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
1a330 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  ers.    ** start
1a340 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53  ing at pDest->iS
1a350 64 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63  dst.  Then the c
1a360 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73  o-routine yields
1a370 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1a380 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a  e SRT_Coroutine:
1a390 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65   {.      if( pDe
1a3a0 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a  st->iSdst==0 ){.
1a3b0 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69          pDest->i
1a3c0 53 64 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65  Sdst = sqlite3Ge
1a3d0 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
1a3e0 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  e, pIn->nSdst);.
1a3f0 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e          pDest->n
1a400 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73  Sdst = pIn->nSds
1a410 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
1a420 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1a430 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
1a440 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e  ->iSdst, pDest->
1a450 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
1a460 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1a470 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
1a480 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
1a490 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
1a4a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1a4b0 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20    /* If none of 
1a4c0 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  the above, then 
1a4d0 74 68 65 20 72 65 73 75 6c 74 20 64 65 73 74 69  the result desti
1a4e0 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20  nation must be. 
1a4f0 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74     ** SRT_Output
1a500 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1a510 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
1a520 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20  with any other. 
1a530 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f     ** destinatio
1a540 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  n other than the
1a550 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62   ones handled ab
1a560 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75  ove or SRT_Outpu
1a570 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
1a580 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c   For SRT_Output,
1a590 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
1a5a0 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63  red in a sequenc
1a5b0 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20  e of registers. 
1a5c0 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68   .    ** Then th
1a5d0 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f  e OP_ResultRow o
1a5e0 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f  pcode is used to
1a5f0 20 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73   cause sqlite3_s
1a600 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20  tep() to.    ** 
1a610 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20  return the next 
1a620 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20  row of result.. 
1a630 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
1a640 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
1a650 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  t( pDest->eDest=
1a660 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
1a670 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a680 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
1a690 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64  ultRow, pIn->iSd
1a6a0 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
1a6b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1a6c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75    }.  }..  /* Ju
1a6d0 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
1a6e0 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65   the loop if the
1a6f0 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
1a700 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
1a710 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >iLimit ){.    s
1a720 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a730 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a  (v, OP_DecrJumpZ
1a740 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
1a750 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  iBreak); VdbeCov
1a760 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20  erage(v);.  }.. 
1a770 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
1a780 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75   subroutine retu
1a790 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rn.  */.  sqlite
1a7a0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1a7b0 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  l(v, iContinue);
1a7c0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1a7d0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
1a7e0 6e 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a  n, regReturn);..
1a7f0 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
1a800 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74  ../*.** Alternat
1a810 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  ive compound sel
1a820 65 63 74 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ect code generat
1a830 6f 72 20 66 6f 72 20 63 61 73 65 73 20 77 68 65  or for cases whe
1a840 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e  n there.** is an
1a850 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1a860 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d  ..**.** We assum
1a870 65 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  e a query of the
1a880 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a   following form:
1a890 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c  .**.**      <sel
1a8a0 65 63 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72  ectA>  <operator
1a8b0 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52  >  <selectB>  OR
1a8c0 44 45 52 20 42 59 20 3c 6f 72 64 65 72 62 79 6c  DER BY <orderbyl
1a8d0 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72  ist>.**.** <oper
1a8e0 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20  ator> is one of 
1a8f0 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e  UNION ALL, UNION
1a900 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54  , EXCEPT, or INT
1a910 45 52 53 45 43 54 2e 20 20 54 68 65 20 69 64 65  ERSECT.  The ide
1a920 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65 20  a.** is to code 
1a930 62 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e 20 61  both <selectA> a
1a940 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20 77 69 74  nd <selectB> wit
1a950 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  h the ORDER BY c
1a960 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72  lause as.** co-r
1a970 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 6e 20 72  outines.  Then r
1a980 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  un the co-routin
1a990 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61  es in parallel a
1a9a0 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72 65 73  nd merge the res
1a9b0 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65  ults.** into the
1a9c0 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 61 64 64   output.  In add
1a9d0 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f  ition to the two
1a9e0 20 63 6f 72 6f 75 74 69 6e 65 73 20 28 63 61 6c   coroutines (cal
1a9f0 6c 65 64 20 73 65 6c 65 63 74 41 20 61 6e 64 0a  led selectA and.
1aa00 2a 2a 20 73 65 6c 65 63 74 42 29 20 74 68 65 72  ** selectB) ther
1aa10 65 20 61 72 65 20 37 20 73 75 62 72 6f 75 74 69  e are 7 subrouti
1aa20 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75  nes:.**.**    ou
1aa30 74 41 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20  tA:    Move the 
1aa40 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65  output of the se
1aa50 6c 65 63 74 41 20 63 6f 72 6f 75 74 69 6e 65 20  lectA coroutine 
1aa60 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a  into the output.
1aa70 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  **             o
1aa80 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  f the compound q
1aa90 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f  uery..**.**    o
1aaa0 75 74 42 3a 20 20 20 20 4d 6f 76 65 20 74 68 65  utB:    Move the
1aab0 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73   output of the s
1aac0 65 6c 65 63 74 42 20 63 6f 72 6f 75 74 69 6e 65  electB coroutine
1aad0 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
1aae0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1aaf0 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
1ab00 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65  query.  (Only ge
1ab10 6e 65 72 61 74 65 64 20 66 6f 72 20 55 4e 49 4f  nerated for UNIO
1ab20 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  N and.**        
1ab30 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20       UNION ALL. 
1ab40 20 45 58 43 45 50 54 20 61 6e 64 20 49 4e 53 45   EXCEPT and INSE
1ab50 52 54 53 45 43 54 20 6e 65 76 65 72 20 6f 75 74  RTSECT never out
1ab60 70 75 74 20 61 20 72 6f 77 20 74 68 61 74 0a 2a  put a row that.*
1ab70 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70  *             ap
1ab80 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e  pears only in B.
1ab90 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a  ).**.**    AltB:
1aba0 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
1abb0 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72  there is data fr
1abc0 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e  om both coroutin
1abd0 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a  es and A<B..**.*
1abe0 2a 20 20 20 20 41 65 71 42 3a 20 20 20 20 43 61  *    AeqB:    Ca
1abf0 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
1ac00 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
1ac10 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
1ac20 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   A==B..**.**    
1ac30 41 67 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  AgtB:    Called 
1ac40 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61  when there is da
1ac50 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72  ta from both cor
1ac60 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e  outines and A>B.
1ac70 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20  .**.**    EofA: 
1ac80 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64     Called when d
1ac90 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64  ata is exhausted
1aca0 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a   from selectA..*
1acb0 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20 20  *.**    EofB:   
1acc0 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74   Called when dat
1acd0 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66  a is exhausted f
1ace0 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a  rom selectB..**.
1acf0 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
1ad00 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74  ation of the lat
1ad10 74 65 72 20 66 69 76 65 20 73 75 62 72 6f 75 74  ter five subrout
1ad20 69 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e 20 77  ines depend on w
1ad30 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74  hich .** <operat
1ad40 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a  or> is used:.**.
1ad50 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1ad60 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20    UNION ALL     
1ad70 20 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 20 20      UNION       
1ad80 20 20 20 20 20 45 58 43 45 50 54 20 20 20 20 20       EXCEPT     
1ad90 20 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a 2a       INTERSECT.*
1ada0 2a 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d  *          -----
1adb0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
1adc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d  -----------  ---
1add0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d  -----------  ---
1ade0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
1adf0 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f 75 74 41  *   AltB:   outA
1ae00 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74  , nextA      out
1ae10 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f  A, nextA       o
1ae20 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
1ae30 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20     nextA.**.**  
1ae40 20 41 65 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e   AeqB:   outA, n
1ae50 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78  extA         nex
1ae60 74 41 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  tA             n
1ae70 65 78 74 41 20 20 20 20 20 20 20 20 20 6f 75 74  extA         out
1ae80 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20  A, nextA.**.**  
1ae90 20 41 67 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e   AgtB:   outB, n
1aea0 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20  extB      outB, 
1aeb0 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20 6e  nextB          n
1aec0 65 78 74 42 20 20 20 20 20 20 20 20 20 20 20 20  extB            
1aed0 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f  nextB.**.**   Eo
1aee0 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74  fA:   outB, next
1aef0 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78  B      outB, nex
1af00 74 42 20 20 20 20 20 20 20 20 20 20 68 61 6c 74  tB          halt
1af10 20 20 20 20 20 20 20 20 20 20 20 20 20 68 61 6c               hal
1af20 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20  t.**.**   EofB: 
1af30 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
1af40 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
1af50 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
1af60 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a           halt.**
1af70 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74 42 2c  .** In the AltB,
1af80 20 41 65 71 42 2c 20 61 6e 64 20 41 67 74 42 20   AeqB, and AgtB 
1af90 73 75 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20  subroutines, an 
1afa0 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69  EOF on A followi
1afb0 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73  ng nextA.** caus
1afc0 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  es an immediate 
1afd0 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e 64  jump to EofA and
1afe0 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c   an EOF on B fol
1aff0 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20 63 61 75  lowing nextB cau
1b000 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69  ses.** an immedi
1b010 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42  ate jump to EofB
1b020 2e 20 20 57 69 74 68 69 6e 20 45 6f 66 41 20 61  .  Within EofA a
1b030 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46  nd EofB, and EOF
1b040 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20   on entry or.** 
1b050 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20  following nextX 
1b060 63 61 75 73 65 73 20 61 20 6a 75 6d 70 20 74 6f  causes a jump to
1b070 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1b080 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e  select processin
1b090 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61  g..**.** Duplica
1b0a0 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68  te removal in th
1b0b0 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  e UNION, EXCEPT,
1b0c0 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 63   and INTERSECT c
1b0d0 61 73 65 73 20 69 73 20 68 61 6e 64 6c 65 64 0a  ases is handled.
1b0e0 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 6f 75  ** within the ou
1b0f0 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 2e  tput subroutine.
1b100 20 20 54 68 65 20 72 65 67 50 72 65 76 20 72 65    The regPrev re
1b110 67 69 73 74 65 72 20 73 65 74 20 68 6f 6c 64 73  gister set holds
1b120 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 0a   the previously.
1b130 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c 75 65 2e  ** output value.
1b140 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69    A comparison i
1b150 73 20 6d 61 64 65 20 61 67 61 69 6e 73 74 20 74  s made against t
1b160 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20 74 68  his value and th
1b170 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20 73  e output.** is s
1b180 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6e 65  kipped if the ne
1b190 78 74 20 72 65 73 75 6c 74 73 20 77 6f 75 6c 64  xt results would
1b1a0 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
1b1b0 74 68 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a  the previous..**
1b1c0 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
1b1d0 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74  tation plan is t
1b1e0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
1b1f0 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  two coroutines a
1b200 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72  nd seven.** subr
1b210 6f 75 74 69 6e 65 73 20 66 69 72 73 74 2c 20 74  outines first, t
1b220 68 65 6e 20 70 75 74 20 74 68 65 20 63 6f 6e 74  hen put the cont
1b230 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74 68 65  rol logic at the
1b240 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74   bottom.  Like t
1b250 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
1b260 20 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a      goto Init.**
1b270 20 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74       coA: corout
1b280 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 71 75 65  ine for left que
1b290 72 79 20 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f  ry (A).**     co
1b2a0 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  B: coroutine for
1b2b0 20 72 69 67 68 74 20 71 75 65 72 79 20 28 42 29   right query (B)
1b2c0 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75 74  .**    outA: out
1b2d0 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41  put one row of A
1b2e0 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75 74  .**    outB: out
1b2f0 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42  put one row of B
1b300 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f   (UNION and UNIO
1b310 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20  N ALL only).**  
1b320 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20    EofA: ....**  
1b330 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    EofB: ....**  
1b340 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    AltB: ....**  
1b350 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    AeqB: ....**  
1b360 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    AgtB: ....**  
1b370 20 20 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69    Init: initiali
1b380 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20 72 65 67  ze coroutine reg
1b390 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20 20 20  isters.**       
1b3a0 20 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20     yield coA.** 
1b3b0 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28           if eof(
1b3c0 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20  A) goto EofA.** 
1b3d0 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63           yield c
1b3e0 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  oB.**          i
1b3f0 66 20 65 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f  f eof(B) goto Eo
1b400 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43  fB.**    Cmpr: C
1b410 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20  ompare A, B.**  
1b420 20 20 20 20 20 20 20 20 4a 75 6d 70 20 41 6c 74          Jump Alt
1b430 42 2c 20 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a  B, AeqB, AgtB.**
1b440 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a       End: ....**
1b450 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74 42  .** We call AltB
1b460 2c 20 41 65 71 42 2c 20 41 67 74 42 2c 20 45 6f  , AeqB, AgtB, Eo
1b470 66 41 2c 20 61 6e 64 20 45 6f 66 42 20 22 73 75  fA, and EofB "su
1b480 62 72 6f 75 74 69 6e 65 73 22 20 62 75 74 20 74  broutines" but t
1b490 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61  hey are not.** a
1b4a0 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75  ctually called u
1b4b0 73 69 6e 67 20 47 6f 73 75 62 20 61 6e 64 20 74  sing Gosub and t
1b4c0 68 65 79 20 64 6f 20 6e 6f 74 20 52 65 74 75 72  hey do not Retur
1b4d0 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20 45 6f 66  n.  EofA and Eof
1b4e0 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20  B loop.** until 
1b4f0 61 6c 6c 20 64 61 74 61 20 69 73 20 65 78 68 61  all data is exha
1b500 75 73 74 65 64 20 74 68 65 6e 20 6a 75 6d 70 20  usted then jump 
1b510 74 6f 20 74 68 65 20 22 65 6e 64 22 20 6c 61 62  to the "end" lab
1b520 65 2e 20 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a  e.  AltB, AeqB,.
1b530 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a 75 6d 70  ** and AgtB jump
1b540 20 74 6f 20 65 69 74 68 65 72 20 4c 32 20 6f 72   to either L2 or
1b550 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20   to one of EofA 
1b560 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e  or EofB..*/.#ifn
1b570 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b580 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
1b590 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
1b5a0 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20  SelectOrderBy(. 
1b5b0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1b5c0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
1b5d0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
1b5e0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
1b5f0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
1b600 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
1b610 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
1b620 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
1b630 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
1b640 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
1b650 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
1b660 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
1b670 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1b680 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65  counters */.  Se
1b690 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20  lect *pPrior;   
1b6a0 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
1b6b0 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c  ELECT immediatel
1b6c0 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f  y to our left */
1b6d0 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
1b6e0 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
1b6f0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69  rate code to thi
1b700 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65  s VDBE */.  Sele
1b710 63 74 44 65 73 74 20 64 65 73 74 41 3b 20 20 20  ctDest destA;   
1b720 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e    /* Destination
1b730 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 41   for coroutine A
1b740 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
1b750 20 64 65 73 74 42 3b 20 20 20 20 20 2f 2a 20 44   destB;     /* D
1b760 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63  estination for c
1b770 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20  oroutine B */.  
1b780 69 6e 74 20 72 65 67 41 64 64 72 41 3b 20 20 20  int regAddrA;   
1b790 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1b7a0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
1b7b0 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65  lect-A coroutine
1b7c0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64   */.  int regAdd
1b7d0 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  rB;         /* A
1b7e0 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
1b7f0 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63 6f 72  for select-B cor
1b800 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1b810 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20 20 20  addrSelectA;    
1b820 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1b830 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63 6f 72  the select-A cor
1b840 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1b850 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20 20 20  addrSelectB;    
1b860 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1b870 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63 6f 72  the select-B cor
1b880 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1b890 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20 20 20  regOutA;        
1b8a0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
1b8b0 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75  ister for the ou
1b8c0 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e  tput-A subroutin
1b8d0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  e */.  int regOu
1b8e0 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tB;          /* 
1b8f0 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
1b900 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d   for the output-
1b910 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
1b920 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41 3b 20    int addrOutA; 
1b930 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
1b940 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74  ss of the output
1b950 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -A subroutine */
1b960 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 42 20  .  int addrOutB 
1b970 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 64 64 72  = 0;     /* Addr
1b980 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ess of the outpu
1b990 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-B subroutine *
1b9a0 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41  /.  int addrEofA
1b9b0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
1b9c0 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
1b9d0 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64 20 73  ct-A-exhausted s
1b9e0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
1b9f0 6e 74 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 3b  nt addrEofA_noB;
1ba00 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74       /* Alternat
1ba10 65 20 61 64 64 72 45 6f 66 41 20 69 66 20 42 20  e addrEofA if B 
1ba20 69 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  is uninitialized
1ba30 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f   */.  int addrEo
1ba40 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  fB;         /* A
1ba50 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
1ba60 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74 65 64  lect-B-exhausted
1ba70 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
1ba80 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b 20 20   int addrAltB;  
1ba90 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
1baa0 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73 75 62  s of the A<B sub
1bab0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1bac0 20 61 64 64 72 41 65 71 42 3b 20 20 20 20 20 20   addrAeqB;      
1bad0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
1bae0 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72 6f 75   the A==B subrou
1baf0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
1bb00 64 72 41 67 74 42 3b 20 20 20 20 20 20 20 20 20  drAgtB;         
1bb10 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
1bb20 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69 6e 65  e A>B subroutine
1bb30 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d   */.  int regLim
1bb40 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  itA;        /* L
1bb50 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f  imit register fo
1bb60 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20  r select-A */.  
1bb70 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b 20 20  int regLimitB;  
1bb80 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72        /* Limit r
1bb90 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
1bba0 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ct-A */.  int re
1bbb0 67 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20  gPrev;          
1bbc0 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20 72 65  /* A range of re
1bbd0 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20  gisters to hold 
1bbe0 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 20  previous output 
1bbf0 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4c 69  */.  int savedLi
1bc00 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61  mit;       /* Sa
1bc10 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e  ved value of p->
1bc20 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20  iLimit */.  int 
1bc30 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20 20 20  savedOffset;    
1bc40 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65    /* Saved value
1bc50 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a   of p->iOffset *
1bc60 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70  /.  int labelCmp
1bc70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62  r;        /* Lab
1bc80 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61 72 74  el for the start
1bc90 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20 61 6c   of the merge al
1bca0 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74  gorithm */.  int
1bcb0 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20 20 20   labelEnd;      
1bcc0 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20     /* Label for 
1bcd0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f  the end of the o
1bce0 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20 73 74  verall SELECT st
1bcf0 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  mt */.  int addr
1bd00 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
1bd10 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f   Jump instructio
1bd20 6e 73 20 74 68 61 74 20 67 65 74 20 72 65 74 61  ns that get reta
1bd30 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74  rgetted */.  int
1bd40 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
1bd50 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f     /* One of TK_
1bd60 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54  ALL, TK_UNION, T
1bd70 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54  K_EXCEPT, TK_INT
1bd80 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49  ERSECT */.  KeyI
1bd90 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20 30  nfo *pKeyDup = 0
1bda0 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20  ; /* Comparison 
1bdb0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
1bdc0 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61  duplicate remova
1bdd0 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  l */.  KeyInfo *
1bde0 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20  pKeyMerge;   /* 
1bdf0 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72  Comparison infor
1be00 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69  mation for mergi
1be10 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c  ng rows */.  sql
1be20 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
1be30 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
1be40 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45  onnection */.  E
1be50 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
1be60 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  y;   /* The ORDE
1be70 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
1be80 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20   int nOrderBy;  
1be90 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1bea0 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65   of terms in the
1beb0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1bec0 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d   */.  int *aPerm
1bed0 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d  ute;        /* M
1bee0 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45  apping from ORDE
1bef0 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 72 65  R BY terms to re
1bf00 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73  sult set columns
1bf10 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1bf20 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b  ->pOrderBy!=0 );
1bf30 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 44  .  assert( pKeyD
1bf40 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e  up==0 ); /* "Man
1bf50 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65 64 73  aged" code needs
1bf60 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74 20 23   this.  Ticket #
1bf70 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20  3382. */.  db = 
1bf80 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20  pParse->db;.  v 
1bf90 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1bfa0 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
1bfb0 29 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 72 65  );       /* Alre
1bfc0 61 64 79 20 74 68 72 6f 77 6e 20 74 68 65 20 65  ady thrown the e
1bfd0 72 72 6f 72 20 69 66 20 56 44 42 45 20 61 6c 6c  rror if VDBE all
1bfe0 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c  oc failed */.  l
1bff0 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65  abelEnd = sqlite
1c000 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
1c010 50 61 72 73 65 29 3b 0a 20 20 6c 61 62 65 6c 43  Parse);.  labelC
1c020 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  mpr = sqlite3Vdb
1c030 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
1c040 65 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68  e);...  /* Patch
1c050 20 75 70 20 74 68 65 20 4f 52 44 45 52 20 42 59   up the ORDER BY
1c060 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f   clause.  */.  o
1c070 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70  p = p->op;  .  p
1c080 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
1c090 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72  r;.  assert( pPr
1c0a0 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ior->pOrderBy==0
1c0b0 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d   );.  pOrderBy =
1c0c0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
1c0d0 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
1c0e0 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d   );.  nOrderBy =
1c0f0 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
1c100 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72  ;..  /* For oper
1c110 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e  ators other than
1c120 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61   UNION ALL we ha
1c130 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ve to make sure 
1c140 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52  that.  ** the OR
1c150 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f  DER BY clause co
1c160 76 65 72 73 20 65 76 65 72 79 20 74 65 72 6d 20  vers every term 
1c170 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  of the result se
1c180 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72  t.  Add.  ** ter
1c190 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  ms to the ORDER 
1c1a0 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63  BY clause as nec
1c1b0 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69  essary..  */.  i
1c1c0 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op!=TK_ALL ){
1c1d0 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62  .    for(i=1; db
1c1e0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
1c1f0 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73  0 && i<=p->pELis
1c200 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1c210 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
1c220 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
1c230 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  m;.      for(j=0
1c240 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79  , pItem=pOrderBy
1c250 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b  ->a; j<nOrderBy;
1c260 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
1c270 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1c280 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
1c290 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20  rByCol>0 );.    
1c2a0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75      if( pItem->u
1c2b0 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d  .x.iOrderByCol==
1c2c0 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  i ) break;.     
1c2d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d   }.      if( j==
1c2e0 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
1c2f0 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
1c300 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
1c310 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b   TK_INTEGER, 0);
1c320 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
1c330 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
1c340 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
1c350 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
1c360 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61  lags |= EP_IntVa
1c370 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  lue;.        pNe
1c380 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b  w->u.iValue = i;
1c390 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64  .        p->pOrd
1c3a0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 20  erBy = pOrderBy 
1c3b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1c3c0 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
1c3d0 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29 3b  pOrderBy, pNew);
1c3e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72  .        if( pOr
1c3f0 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42 79  derBy ) pOrderBy
1c400 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e  ->a[nOrderBy++].
1c410 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
1c420 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20  = (u16)i;.      
1c430 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
1c440 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
1c450 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61  mparison permuta
1c460 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f  tion and keyinfo
1c470 20 74 68 61 74 20 69 73 20 75 73 65 64 20 77 69   that is used wi
1c480 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d  th.  ** the perm
1c490 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20  utation used to 
1c4a0 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
1c4b0 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f   next.  ** row o
1c4c0 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20  f results comes 
1c4d0 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20  from selectA or 
1c4e0 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61  selectB.  Also a
1c4f0 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a  dd explicit.  **
1c500 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74   collations to t
1c510 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1c520 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74  se terms so that
1c530 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75 65   when the subque
1c540 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  ries.  ** to the
1c550 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c   right and the l
1c560 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74 65  eft are evaluate
1c570 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65 20  d, they use the 
1c580 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c  correct.  ** col
1c590 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61  lation..  */.  a
1c5a0 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65  Permute = sqlite
1c5b0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
1c5c0 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28  b, sizeof(int)*(
1c5d0 6e 4f 72 64 65 72 42 79 20 2b 20 31 29 29 3b 0a  nOrderBy + 1));.
1c5e0 20 20 69 66 28 20 61 50 65 72 6d 75 74 65 20 29    if( aPermute )
1c5f0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
1c600 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
1c610 6d 3b 0a 20 20 20 20 61 50 65 72 6d 75 74 65 5b  m;.    aPermute[
1c620 30 5d 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20  0] = nOrderBy;. 
1c630 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 74 65     for(i=1, pIte
1c640 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69  m=pOrderBy->a; i
1c650 3c 3d 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c  <=nOrderBy; i++,
1c660 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
1c670 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
1c680 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e  u.x.iOrderByCol>
1c690 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
1c6a0 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  t( pItem->u.x.iO
1c6b0 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45  rderByCol<=p->pE
1c6c0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
1c6d0 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69 5d       aPermute[i]
1c6e0 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f   = pItem->u.x.iO
1c6f0 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20  rderByCol - 1;. 
1c700 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72     }.    pKeyMer
1c710 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ge = multiSelect
1c720 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70  OrderByKeyInfo(p
1c730 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20  Parse, p, 1);.  
1c740 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d  }else{.    pKeyM
1c750 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  erge = 0;.  }.. 
1c760 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68 65   /* Reattach the
1c770 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1c780 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a 20   to the query.. 
1c790 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42   */.  p->pOrderB
1c7a0 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
1c7b0 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
1c7c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
1c7d0 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  stDup(pParse->db
1c7e0 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a  , pOrderBy, 0);.
1c7f0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
1c800 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72   range of tempor
1c810 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61 6e  ary registers an
1c820 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65  d the KeyInfo ne
1c830 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68  eded.  ** for th
1c840 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65 6d  e logic that rem
1c850 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65 20 72  oves duplicate r
1c860 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e 20  esult rows when 
1c870 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f  the.  ** operato
1c880 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45  r is UNION, EXCE
1c890 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
1c8a0 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20   (but not UNION 
1c8b0 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ALL)..  */.  if(
1c8c0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
1c8d0 20 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b 0a     regPrev = 0;.
1c8e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1c8f0 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   nExpr = p->pELi
1c900 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61  st->nExpr;.    a
1c910 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e  ssert( nOrderBy>
1c920 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61  =nExpr || db->ma
1c930 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1c940 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72    regPrev = pPar
1c950 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
1c960 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
1c970 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 73 71 6c  nExpr+1;.    sql
1c980 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1c990 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
1c9a0 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20 70   regPrev);.    p
1c9b0 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65 33  KeyDup = sqlite3
1c9c0 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
1c9d0 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20 20   nExpr, 1);.    
1c9e0 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20  if( pKeyDup ){. 
1c9f0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
1ca00 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
1ca10 74 65 61 62 6c 65 28 70 4b 65 79 44 75 70 29 20  teable(pKeyDup) 
1ca20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
1ca30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ; i<nExpr; i++){
1ca40 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70  .        pKeyDup
1ca50 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c  ->aColl[i] = mul
1ca60 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
1ca70 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
1ca80 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e         pKeyDup->
1ca90 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
1caa0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
1cab0 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61  .  }. .  /* Sepa
1cac0 72 61 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e  rate the left an
1cad0 64 20 74 68 65 20 72 69 67 68 74 20 71 75 65 72  d the right quer
1cae0 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68  y from one anoth
1caf0 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72  er.  */.  p->pPr
1cb00 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f  ior = 0;.  pPrio
1cb10 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  r->pNext = 0;.  
1cb20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
1cb30 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
1cb40 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e, p, p->pOrderB
1cb50 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 69  y, "ORDER");.  i
1cb60 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f  f( pPrior->pPrio
1cb70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
1cb80 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
1cb90 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
1cba0 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70  Prior, pPrior->p
1cbb0 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22  OrderBy, "ORDER"
1cbc0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  );.  }..  /* Com
1cbd0 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20 72  pute the limit r
1cbe0 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f  egisters */.  co
1cbf0 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
1cc00 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 6c  ers(pParse, p, l
1cc10 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20  abelEnd);.  if( 
1cc20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d  p->iLimit && op=
1cc30 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72  =TK_ALL ){.    r
1cc40 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61  egLimitA = ++pPa
1cc50 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
1cc60 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61  egLimitB = ++pPa
1cc70 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
1cc80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1cc90 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e  (v, OP_Copy, p->
1cca0 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66  iOffset ? p->iOf
1ccb0 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d  fset+1 : p->iLim
1ccc0 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  it,.            
1ccd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cce0 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41 29        regLimitA)
1ccf0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1cd00 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
1cd10 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20 72  py, regLimitA, r
1cd20 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c  egLimitB);.  }el
1cd30 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74  se{.    regLimit
1cd40 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d 20  A = regLimitB = 
1cd50 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
1cd60 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
1cd70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e  ->pLimit);.  p->
1cd80 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 72  pLimit = 0;..  r
1cd90 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72  egAddrA = ++pPar
1cda0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41  se->nMem;.  regA
1cdb0 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ddrB = ++pParse-
1cdc0 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41  >nMem;.  regOutA
1cdd0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1cde0 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b  m;.  regOutB = +
1cdf0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1ce00 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1ce10 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53  stInit(&destA, S
1ce20 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  RT_Coroutine, re
1ce30 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74  gAddrA);.  sqlit
1ce40 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
1ce50 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72  (&destB, SRT_Cor
1ce60 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42  outine, regAddrB
1ce70 29 3b 0a 0a 20 20 45 78 70 6c 61 69 6e 51 75 65  );..  ExplainQue
1ce80 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
1ce90 31 2c 20 22 4d 45 52 47 45 20 28 25 73 29 22 2c  1, "MERGE (%s)",
1cea0 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
1ceb0 3e 6f 70 29 29 29 3b 0a 0a 20 20 2f 2a 20 47 65  >op)));..  /* Ge
1cec0 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69  nerate a corouti
1ced0 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  ne to evaluate t
1cee0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
1cef0 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ent to the.  ** 
1cf00 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70  left of the comp
1cf10 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20  ound operator - 
1cf20 74 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a  the "A" select..
1cf30 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63    */.  addrSelec
1cf40 74 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tA = sqlite3Vdbe
1cf50 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
1cf60 20 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71   1;.  addr1 = sq
1cf70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1cf80 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  v, OP_InitCorout
1cf90 69 6e 65 2c 20 72 65 67 41 64 64 72 41 2c 20 30  ine, regAddrA, 0
1cfa0 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a  , addrSelectA);.
1cfb0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1cfc0 2c 20 22 6c 65 66 74 20 53 45 4c 45 43 54 22 29  , "left SELECT")
1cfd0 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69  );.  pPrior->iLi
1cfe0 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b  mit = regLimitA;
1cff0 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50  .  ExplainQueryP
1d000 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20  lan((pParse, 1, 
1d010 22 4c 45 46 54 22 29 29 3b 0a 20 20 73 71 6c 69  "LEFT"));.  sqli
1d020 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
1d030 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 41  , pPrior, &destA
1d040 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1d050 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20  EndCoroutine(v, 
1d060 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c  regAddrA);.  sql
1d070 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
1d080 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 2f  (v, addr1);..  /
1d090 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72  * Generate a cor
1d0a0 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61  outine to evalua
1d0b0 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  te the SELECT st
1d0c0 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a  atement on .  **
1d0d0 20 74 68 65 20 72 69 67 68 74 20 2d 20 74 68 65   the right - the
1d0e0 20 22 42 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f   "B" select.  */
1d0f0 0a 20 20 61 64 64 72 53 65 6c 65 63 74 42 20 3d  .  addrSelectB =
1d100 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1d110 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a  entAddr(v) + 1;.
1d120 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
1d130 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1d140 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c  P_InitCoroutine,
1d150 20 72 65 67 41 64 64 72 42 2c 20 30 2c 20 61 64   regAddrB, 0, ad
1d160 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20 56 64  drSelectB);.  Vd
1d170 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
1d180 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  ight SELECT"));.
1d190 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70    savedLimit = p
1d1a0 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65  ->iLimit;.  save
1d1b0 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66  dOffset = p->iOf
1d1c0 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69  fset;.  p->iLimi
1d1d0 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20  t = regLimitB;. 
1d1e0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
1d1f0 20 20 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72    .  ExplainQuer
1d200 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31  yPlan((pParse, 1
1d210 2c 20 22 52 49 47 48 54 22 29 29 3b 0a 20 20 73  , "RIGHT"));.  s
1d220 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
1d230 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29 3b  rse, p, &destB);
1d240 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73  .  p->iLimit = s
1d250 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e  avedLimit;.  p->
1d260 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f  iOffset = savedO
1d270 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33  ffset;.  sqlite3
1d280 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65  VdbeEndCoroutine
1d290 28 76 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a  (v, regAddrB);..
1d2a0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1d2b0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
1d2c0 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72  outputs the curr
1d2d0 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 41  ent row of the A
1d2e0 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20  .  ** select as 
1d2f0 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20  the next output 
1d300 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  row of the compo
1d310 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  und select..  */
1d320 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
1d330 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72  nt((v, "Output r
1d340 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29 3b  outine for A"));
1d350 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67 65  .  addrOutA = ge
1d360 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
1d370 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20  outine(pParse,. 
1d380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d390 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73 74  p, &destA, pDest
1d3a0 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20 20  , regOutA,.     
1d3b0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50              regP
1d3c0 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61  rev, pKeyDup, la
1d3d0 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a  belEnd);.  .  /*
1d3e0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
1d3f0 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
1d400 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  uts the current 
1d410 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a  row of the B.  *
1d420 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20  * select as the 
1d430 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20  next output row 
1d440 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
1d450 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69  select..  */.  i
1d460 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  f( op==TK_ALL ||
1d470 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b   op==TK_UNION ){
1d480 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
1d490 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74  ment((v, "Output
1d4a0 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29   routine for B")
1d4b0 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20  );.    addrOutB 
1d4c0 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  = generateOutput
1d4d0 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73  Subroutine(pPars
1d4e0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1d4f0 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70      p, &destB, p
1d500 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20  Dest, regOutB,. 
1d510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d520 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70  regPrev, pKeyDup
1d530 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d  , labelEnd);.  }
1d540 0a 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  .  sqlite3KeyInf
1d550 6f 55 6e 72 65 66 28 70 4b 65 79 44 75 70 29 3b  oUnref(pKeyDup);
1d560 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1d570 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  a subroutine to 
1d580 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73  run when the res
1d590 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74  ults from select
1d5a0 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61   A.  ** are exha
1d5b0 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64  usted and only d
1d5c0 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20  ata in select B 
1d5d0 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  remains..  */.  
1d5e0 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50  if( op==TK_EXCEP
1d5f0 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45  T || op==TK_INTE
1d600 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64  RSECT ){.    add
1d610 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64 64 72  rEofA_noB = addr
1d620 45 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e 64 3b  EofA = labelEnd;
1d630 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20  .  }else{  .    
1d640 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1d650 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f  (v, "eof-A subro
1d660 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64  utine"));.    ad
1d670 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33  drEofA = sqlite3
1d680 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d690 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c  _Gosub, regOutB,
1d6a0 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20   addrOutB);.    
1d6b0 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 73  addrEofA_noB = s
1d6c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1d6d0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1d6e0 67 41 64 64 72 42 2c 20 6c 61 62 65 6c 45 6e 64  gAddrB, labelEnd
1d6f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1d700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d710 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
1d720 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
1d730 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1d740 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 70  addrEofA);.    p
1d750 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
1d760 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
1d770 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70  p->nSelectRow, p
1d780 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
1d790 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  w);.  }..  /* Ge
1d7a0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
1d7b0 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20  ine to run when 
1d7c0 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  the results from
1d7d0 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61   select B.  ** a
1d7e0 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64  re exhausted and
1d7f0 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65   only data in se
1d800 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a  lect A remains..
1d810 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
1d820 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
1d830 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61 64     addrEofB = ad
1d840 64 72 45 6f 66 41 3b 0a 20 20 20 20 69 66 28 20  drEofA;.    if( 
1d850 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20  p->nSelectRow > 
1d860 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
1d870 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ow ) p->nSelectR
1d880 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow = pPrior->nSe
1d890 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65  lectRow;.  }else
1d8a0 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70  {  .    VdbeNoop
1d8b0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66  Comment((v, "eof
1d8c0 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
1d8d0 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d  ;.    addrEofB =
1d8e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d8f0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
1d900 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
1d910 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
1d920 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1d930 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
1d940 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56 64 62 65   labelEnd); Vdbe
1d950 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1d960 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
1d970 28 76 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20  (v, addrEofB);. 
1d980 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
1d990 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
1d9a0 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c 42   the case of A<B
1d9b0 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
1d9c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c  Comment((v, "A-l
1d9d0 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  t-B subroutine")
1d9e0 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d 20  );.  addrAltB = 
1d9f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1da00 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
1da10 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41  egOutA, addrOutA
1da20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1da30 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1da40 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64  ld, regAddrA, ad
1da50 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76  drEofA); VdbeCov
1da60 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
1da70 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c  te3VdbeGoto(v, l
1da80 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a  abelCmpr);..  /*
1da90 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1daa0 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
1dab0 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20  e of A==B.  */. 
1dac0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
1dad0 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20  ){.    addrAeqB 
1dae0 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65  = addrAltB;.  }e
1daf0 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  lse if( op==TK_I
1db00 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
1db10 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
1db20 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74  ltB;.    addrAlt
1db30 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  B++;.  }else{.  
1db40 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1db50 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75  t((v, "A-eq-B su
1db60 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
1db70 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20   addrAeqB =.    
1db80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1db90 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1dba0 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66  egAddrA, addrEof
1dbb0 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  A); VdbeCoverage
1dbc0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1dbd0 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65  VdbeGoto(v, labe
1dbe0 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  lCmpr);.  }..  /
1dbf0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1dc00 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
1dc10 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20  se of A>B.  */. 
1dc20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1dc30 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62  ((v, "A-gt-B sub
1dc40 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64  routine"));.  ad
1dc50 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33  drAgtB = sqlite3
1dc60 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1dc70 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  v);.  if( op==TK
1dc80 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55  _ALL || op==TK_U
1dc90 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69  NION ){.    sqli
1dca0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1dcb0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
1dcc0 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20  tB, addrOutB);. 
1dcd0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
1dce0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1dcf0 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64  ld, regAddrB, ad
1dd00 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76  drEofB); VdbeCov
1dd10 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
1dd20 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c  te3VdbeGoto(v, l
1dd30 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a  abelCmpr);..  /*
1dd40 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73 20   This code runs 
1dd50 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69  once to initiali
1dd60 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20  ze everything.. 
1dd70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1dd80 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
1dd90 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  r1);.  sqlite3Vd
1dda0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1ddb0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
1ddc0 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 20 56  addrEofA_noB); V
1ddd0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1dde0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ddf0 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1de00 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45   regAddrB, addrE
1de10 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ofB); VdbeCovera
1de20 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70  ge(v);..  /* Imp
1de30 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20  lement the main 
1de40 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a  merge loop.  */.
1de50 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1de60 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
1de70 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74  elCmpr);.  sqlit
1de80 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1de90 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20  OP_Permutation, 
1dea0 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29  0, 0, 0, (char*)
1deb0 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54  aPermute, P4_INT
1dec0 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65  ARRAY);.  sqlite
1ded0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1dee0 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41  P_Compare, destA
1def0 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e 69 53  .iSdst, destB.iS
1df00 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20  dst, nOrderBy,. 
1df10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
1df30 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59  KeyMerge, P4_KEY
1df40 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33  INFO);.  sqlite3
1df50 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
1df60 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b  OPFLAG_PERMUTE);
1df70 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1df80 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
1df90 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41   addrAltB, addrA
1dfa0 65 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b 20  eqB, addrAgtB); 
1dfb0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1dfc0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
1dfd0 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  he this point in
1dfe0 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e   order to termin
1dff0 61 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20  ate the query.. 
1e000 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1e010 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1e020 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f   labelEnd);..  /
1e030 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65  * Reassembly the
1e040 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
1e050 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  so that it will 
1e060 62 65 20 66 72 65 65 64 20 63 6f 72 72 65 63 74  be freed correct
1e070 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63  ly.  ** by the c
1e080 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
1e090 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
1e0a0 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
1e0b0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
1e0c0 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
1e0d0 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  }.  p->pPrior = 
1e0e0 70 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72  pPrior;.  pPrior
1e0f0 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20  ->pNext = p;..  
1e100 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72  /*** TBD:  Inser
1e110 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c  t subroutine cal
1e120 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73  ls to close curs
1e130 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74  ors on incomplet
1e140 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72  e.  **** subquer
1e150 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 45 78 70 6c  ies ****/.  Expl
1e160 61 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f 70 28  ainQueryPlanPop(
1e170 70 50 61 72 73 65 29 3b 0a 20 20 72 65 74 75 72  pParse);.  retur
1e180 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 21 3d  n pParse->nErr!=
1e190 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0;.}.#endif..#if
1e1a0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1e1b0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
1e1c0 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
1e1d0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 0a 2f  TE_OMIT_VIEW)../
1e1e0 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
1e1f0 20 74 68 65 20 53 75 62 73 74 43 6f 6e 74 65 78   the SubstContex
1e200 74 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62  t object describ
1e210 65 73 20 61 6e 20 73 75 62 73 74 69 74 75 74 69  es an substituti
1e220 6f 6e 20 65 64 69 74 0a 2a 2a 20 74 6f 20 62 65  on edit.** to be
1e230 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 61 20   performed on a 
1e240 70 61 72 73 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a  parse tree..**.*
1e250 2a 20 41 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  * All references
1e260 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   to columns in t
1e270 61 62 6c 65 20 69 54 61 62 6c 65 20 61 72 65 20  able iTable are 
1e280 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20 62  to be replaced b
1e290 79 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  y corresponding.
1e2a0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  ** expressions i
1e2b0 6e 20 70 45 4c 69 73 74 2e 0a 2a 2f 0a 74 79 70  n pEList..*/.typ
1e2c0 65 64 65 66 20 73 74 72 75 63 74 20 53 75 62 73  edef struct Subs
1e2d0 74 43 6f 6e 74 65 78 74 20 7b 0a 20 20 50 61 72  tContext {.  Par
1e2e0 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
1e2f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1e300 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1e310 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 3b 20 20  .  int iTable;  
1e320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e330 52 65 70 6c 61 63 65 20 72 65 66 65 72 65 6e 63  Replace referenc
1e340 65 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  es to this table
1e350 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77 54 61   */.  int iNewTa
1e360 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ble;            
1e370 2f 2a 20 4e 65 77 20 74 61 62 6c 65 20 6e 75 6d  /* New table num
1e380 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c  ber */.  int isL
1e390 65 66 74 4a 6f 69 6e 3b 20 20 20 20 20 20 20 20  eftJoin;        
1e3a0 20 20 20 2f 2a 20 41 64 64 20 54 4b 5f 49 46 5f     /* Add TK_IF_
1e3b0 4e 55 4c 4c 5f 52 4f 57 20 6f 70 63 6f 64 65 73  NULL_ROW opcodes
1e3c0 20 6f 6e 20 65 61 63 68 20 72 65 70 6c 61 63 65   on each replace
1e3d0 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ment */.  ExprLi
1e3e0 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20  st *pEList;     
1e3f0 20 20 20 20 2f 2a 20 52 65 70 6c 61 63 65 6d 65      /* Replaceme
1e400 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a  nt expressions *
1e410 2f 0a 7d 20 53 75 62 73 74 43 6f 6e 74 65 78 74  /.} SubstContext
1e420 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65  ;../* Forward De
1e430 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74  clarations */.st
1e440 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
1e450 78 70 72 4c 69 73 74 28 53 75 62 73 74 43 6f 6e  xprList(SubstCon
1e460 74 65 78 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a  text*, ExprList*
1e470 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  );.static void s
1e480 75 62 73 74 53 65 6c 65 63 74 28 53 75 62 73 74  ubstSelect(Subst
1e490 43 6f 6e 74 65 78 74 2a 2c 20 53 65 6c 65 63 74  Context*, Select
1e4a0 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
1e4b0 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  Scan through the
1e4c0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
1e4d0 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72  r.  Replace ever
1e4e0 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a  y reference to.*
1e4f0 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61  * a column in ta
1e500 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c  ble number iTabl
1e510 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  e with a copy of
1e520 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a   the iColumn-th.
1e530 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69  ** entry in pELi
1e540 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20  st.  (But leave 
1e550 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
1e560 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a  e ROWID column .
1e570 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a  ** unchanged.).*
1e580 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1e590 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  e is part of the
1e5a0 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63   flattening proc
1e5b0 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65  edure.  A subque
1e5c0 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75  ry.** whose resu
1e5d0 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65  lt set is define
1e5e0 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65  d by pEList appe
1e5f0 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20  ars as entry in 
1e600 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75  the.** FROM clau
1e610 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  se of a SELECT s
1e620 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42  uch that the VDB
1e630 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65  E cursor assigne
1e640 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52  d to that.** FOR
1e650 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69  M clause entry i
1e660 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20  s iTable.  This 
1e670 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 74 68  routine makes th
1e680 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20  e necessary .** 
1e690 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72  changes to pExpr
1e6a0 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65   so that it refe
1e6b0 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74  rs directly to t
1e6c0 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a  he source table.
1e6d0 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
1e6e0 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65  ry rather the re
1e6f0 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
1e700 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61  subquery..*/.sta
1e710 74 69 63 20 45 78 70 72 20 2a 73 75 62 73 74 45  tic Expr *substE
1e720 78 70 72 28 0a 20 20 53 75 62 73 74 43 6f 6e 74  xpr(.  SubstCont
1e730 65 78 74 20 2a 70 53 75 62 73 74 2c 20 20 2f 2a  ext *pSubst,  /*
1e740 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
1e750 74 68 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  the substitution
1e760 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
1e770 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r            /* 
1e780 45 78 70 72 20 69 6e 20 77 68 69 63 68 20 73 75  Expr in which su
1e790 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72  bstitution occur
1e7a0 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45  s */.){.  if( pE
1e7b0 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  xpr==0 ) return 
1e7c0 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  0;.  if( ExprHas
1e7d0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1e7e0 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20  EP_FromJoin).   
1e7f0 26 26 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74  && pExpr->iRight
1e800 4a 6f 69 6e 54 61 62 6c 65 3d 3d 70 53 75 62 73  JoinTable==pSubs
1e810 74 2d 3e 69 54 61 62 6c 65 0a 20 20 29 7b 0a 20  t->iTable.  ){. 
1e820 20 20 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74     pExpr->iRight
1e830 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 53 75 62  JoinTable = pSub
1e840 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20  st->iNewTable;. 
1e850 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e   }.  if( pExpr->
1e860 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
1e870 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
1e880 70 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 20 29  pSubst->iTable )
1e890 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  {.    if( pExpr-
1e8a0 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
1e8b0 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
1e8c0 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  TK_NULL;.    }el
1e8d0 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
1e8e0 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72  pNew;.      Expr
1e8f0 20 2a 70 43 6f 70 79 20 3d 20 70 53 75 62 73 74   *pCopy = pSubst
1e900 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70  ->pEList->a[pExp
1e910 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70  r->iColumn].pExp
1e920 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20 69 66  r;.      Expr if
1e930 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20 61  NullRow;.      a
1e940 73 73 65 72 74 28 20 70 53 75 62 73 74 2d 3e 70  ssert( pSubst->p
1e950 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70  EList!=0 && pExp
1e960 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 53 75 62 73  r->iColumn<pSubs
1e970 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
1e980 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1e990 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  ( pExpr->pRight=
1e9a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
1e9b0 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63  sqlite3ExprIsVec
1e9c0 74 6f 72 28 70 43 6f 70 79 29 20 29 7b 0a 20 20  tor(pCopy) ){.  
1e9d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 65 63        sqlite3Vec
1e9e0 74 6f 72 45 72 72 6f 72 4d 73 67 28 70 53 75 62  torErrorMsg(pSub
1e9f0 73 74 2d 3e 70 50 61 72 73 65 2c 20 70 43 6f 70  st->pParse, pCop
1ea00 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  y);.      }else{
1ea10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ea20 20 2a 64 62 20 3d 20 70 53 75 62 73 74 2d 3e 70   *db = pSubst->p
1ea30 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20  Parse->db;.     
1ea40 20 20 20 69 66 28 20 70 53 75 62 73 74 2d 3e 69     if( pSubst->i
1ea50 73 4c 65 66 74 4a 6f 69 6e 20 26 26 20 70 43 6f  sLeftJoin && pCo
1ea60 70 79 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  py->op!=TK_COLUM
1ea70 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  N ){.          m
1ea80 65 6d 73 65 74 28 26 69 66 4e 75 6c 6c 52 6f 77  emset(&ifNullRow
1ea90 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 66 4e 75  , 0, sizeof(ifNu
1eaa0 6c 6c 52 6f 77 29 29 3b 0a 20 20 20 20 20 20 20  llRow));.       
1eab0 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 6f 70 20     ifNullRow.op 
1eac0 3d 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57  = TK_IF_NULL_ROW
1ead0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 4e 75  ;.          ifNu
1eae0 6c 6c 52 6f 77 2e 70 4c 65 66 74 20 3d 20 70 43  llRow.pLeft = pC
1eaf0 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69  opy;.          i
1eb00 66 4e 75 6c 6c 52 6f 77 2e 69 54 61 62 6c 65 20  fNullRow.iTable 
1eb10 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61  = pSubst->iNewTa
1eb20 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ble;.          p
1eb30 43 6f 70 79 20 3d 20 26 69 66 4e 75 6c 6c 52 6f  Copy = &ifNullRo
1eb40 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  w;.        }.   
1eb50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 45       testcase( E
1eb60 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1eb70 43 6f 70 79 2c 20 45 50 5f 53 75 62 71 75 65 72  Copy, EP_Subquer
1eb80 79 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  y) );.        pN
1eb90 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
1eba0 44 75 70 28 64 62 2c 20 70 43 6f 70 79 2c 20 30  Dup(db, pCopy, 0
1ebb0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1ebc0 4e 65 77 20 26 26 20 70 53 75 62 73 74 2d 3e 69  New && pSubst->i
1ebd0 73 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  sLeftJoin ){.   
1ebe0 20 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72         ExprSetPr
1ebf0 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
1ec00 43 61 6e 42 65 4e 75 6c 6c 29 3b 0a 20 20 20 20  CanBeNull);.    
1ec10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1ec20 28 20 70 4e 65 77 20 26 26 20 45 78 70 72 48 61  ( pNew && ExprHa
1ec30 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1ec40 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
1ec50 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
1ec60 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
1ec70 3d 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a  = pExpr->iRightJ
1ec80 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  oinTable;.      
1ec90 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
1eca0 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 46 72 6f  rty(pNew, EP_Fro
1ecb0 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  mJoin);.        
1ecc0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
1ecd0 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
1ece0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
1ecf0 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20  pExpr = pNew;.  
1ed00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
1ed10 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 45 78  lse{.    if( pEx
1ed20 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55  pr->op==TK_IF_NU
1ed30 4c 4c 5f 52 4f 57 20 26 26 20 70 45 78 70 72 2d  LL_ROW && pExpr-
1ed40 3e 69 54 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d  >iTable==pSubst-
1ed50 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  >iTable ){.     
1ed60 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
1ed70 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62   pSubst->iNewTab
1ed80 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45  le;.    }.    pE
1ed90 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62  xpr->pLeft = sub
1eda0 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70  stExpr(pSubst, p
1edb0 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
1edc0 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20    pExpr->pRight 
1edd0 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62  = substExpr(pSub
1ede0 73 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  st, pExpr->pRigh
1edf0 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72  t);.    if( Expr
1ee00 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1ee10 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1ee20 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53   ){.      substS
1ee30 65 6c 65 63 74 28 70 53 75 62 73 74 2c 20 70 45  elect(pSubst, pE
1ee40 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20  xpr->x.pSelect, 
1ee50 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1);.    }else{. 
1ee60 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69       substExprLi
1ee70 73 74 28 70 53 75 62 73 74 2c 20 70 45 78 70 72  st(pSubst, pExpr
1ee80 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
1ee90 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
1eea0 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Expr;.}.static v
1eeb0 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73  oid substExprLis
1eec0 74 28 0a 20 20 53 75 62 73 74 43 6f 6e 74 65 78  t(.  SubstContex
1eed0 74 20 2a 70 53 75 62 73 74 2c 20 2f 2a 20 44 65  t *pSubst, /* De
1eee0 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
1eef0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f   substitution */
1ef00 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
1ef10 73 74 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  st       /* List
1ef20 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20   to scan and in 
1ef30 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
1ef40 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 29 7b 0a  bstitutes */.){.
1ef50 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1ef60 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1ef70 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1ef80 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1ef90 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  ){.    pList->a[
1efa0 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74  i].pExpr = subst
1efb0 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 4c 69  Expr(pSubst, pLi
1efc0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
1efd0 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
1efe0 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a  id substSelect(.
1eff0 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a    SubstContext *
1f000 70 53 75 62 73 74 2c 20 2f 2a 20 44 65 73 63 72  pSubst, /* Descr
1f010 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  iption of the su
1f020 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20  bstitution */.  
1f030 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
1f040 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20        /* SELECT 
1f050 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69  statement in whi
1f060 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74  ch to make subst
1f070 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  itutions */.  in
1f080 74 20 64 6f 50 72 69 6f 72 20 20 20 20 20 20 20  t doPrior       
1f090 20 20 20 20 2f 2a 20 44 6f 20 73 75 62 73 74 69      /* Do substi
1f0a0 74 75 74 65 73 20 6f 6e 20 70 2d 3e 70 50 72 69  tutes on p->pPri
1f0b0 6f 72 20 74 6f 6f 20 2a 2f 0a 29 7b 0a 20 20 53  or too */.){.  S
1f0c0 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20  rcList *pSrc;.  
1f0d0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1f0e0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
1f0f0 74 20 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20  t i;.  if( !p ) 
1f100 72 65 74 75 72 6e 3b 0a 20 20 64 6f 7b 0a 20 20  return;.  do{.  
1f110 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1f120 70 53 75 62 73 74 2c 20 70 2d 3e 70 45 4c 69 73  pSubst, p->pELis
1f130 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  t);.    substExp
1f140 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 2d  rList(pSubst, p-
1f150 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
1f160 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53  substExprList(pS
1f170 75 62 73 74 2c 20 70 2d 3e 70 4f 72 64 65 72 42  ubst, p->pOrderB
1f180 79 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69  y);.    p->pHavi
1f190 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 70  ng = substExpr(p
1f1a0 53 75 62 73 74 2c 20 70 2d 3e 70 48 61 76 69 6e  Subst, p->pHavin
1f1b0 67 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72  g);.    p->pWher
1f1c0 65 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53  e = substExpr(pS
1f1d0 75 62 73 74 2c 20 70 2d 3e 70 57 68 65 72 65 29  ubst, p->pWhere)
1f1e0 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 2d 3e  ;.    pSrc = p->
1f1f0 70 53 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74  pSrc;.    assert
1f200 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20  ( pSrc!=0 );.   
1f210 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72   for(i=pSrc->nSr
1f220 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61  c, pItem=pSrc->a
1f230 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65  ; i>0; i--, pIte
1f240 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73  m++){.      subs
1f250 74 53 65 6c 65 63 74 28 70 53 75 62 73 74 2c 20  tSelect(pSubst, 
1f260 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pItem->pSelect, 
1f270 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  1);.      if( pI
1f280 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  tem->fg.isTabFun
1f290 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 75 62  c ){.        sub
1f2a0 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73  stExprList(pSubs
1f2b0 74 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75  t, pItem->u1.pFu
1f2c0 6e 63 41 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a  ncArg);.      }.
1f2d0 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
1f2e0 64 6f 50 72 69 6f 72 20 26 26 20 28 70 20 3d 20  doPrior && (p = 
1f2f0 70 2d 3e 70 50 72 69 6f 72 29 21 3d 30 20 29 3b  p->pPrior)!=0 );
1f300 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
1f310 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1f320 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
1f330 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1f340 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69  MIT_VIEW) */..#i
1f350 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1f360 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
1f370 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
1f380 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f  ITE_OMIT_VIEW)./
1f390 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1f3a0 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c  e attempts to fl
1f3b0 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73  atten subqueries
1f3c0 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63   as a performanc
1f3d0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a  e optimization..
1f3e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1f3f0 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20  returns 1 if it 
1f400 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e  makes changes an
1f410 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65  d 0 if no flatte
1f420 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  ning occurs..**.
1f430 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64  ** To understand
1f440 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20   the concept of 
1f450 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73  flattening, cons
1f460 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
1f470 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a  ng.** query:.**.
1f480 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
1f490 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79  FROM (SELECT x+y
1f4a0 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
1f4b0 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45  ERE z<100) WHERE
1f4c0 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64   a>5.**.** The d
1f4d0 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d  efault way of im
1f4e0 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20  plementing this 
1f4f0 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63  query is to exec
1f500 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75  ute the.** subqu
1f510 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74  ery first and st
1f520 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
1f530 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  in a temporary t
1f540 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75  able, then.** ru
1f550 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1f560 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72  y on that tempor
1f570 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ary table.  This
1f580 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a   requires two.**
1f590 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65   passes over the
1f5a0 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d   data.  Furtherm
1f5b0 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65  ore, because the
1f5c0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1f5d0 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63  .** has no indic
1f5e0 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c  es, the WHERE cl
1f5f0 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65  ause on the oute
1f600 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62  r query cannot b
1f610 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a  e.** optimized..
1f620 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1f630 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  ne attempts to r
1f640 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73  ewrite queries s
1f650 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65  uch as the above
1f660 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
1f670 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c  e flat select, l
1f680 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
1f690 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41      SELECT x+y A
1f6a0 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S a FROM t1 WHER
1f6b0 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a  E z<100 AND a>5.
1f6c0 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67  **.** The code g
1f6d0 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69  enerated for thi
1f6e0 73 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e  s simplification
1f6f0 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20   gives the same 
1f700 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e  result.** but on
1f710 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74  ly has to scan t
1f720 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41  he data once.  A
1f730 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63  nd because indic
1f740 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69  es might .** exi
1f750 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  st on the table 
1f760 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73  t1, a complete s
1f770 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20  can of the data 
1f780 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69  might be.** avoi
1f790 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74  ded..**.** Flatt
1f7a0 65 6e 69 6e 67 20 69 73 20 73 75 62 6a 65 63 74  ening is subject
1f7b0 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
1f7c0 67 20 63 6f 6e 73 74 72 61 69 6e 74 73 3a 0a 2a  g constraints:.*
1f7d0 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e  *.**  (**)  We n
1f7e0 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74  o longer attempt
1f7f0 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72   to flatten aggr
1f800 65 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73  egate subqueries
1f810 2e 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20  . Was:.**       
1f820 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
1f830 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
1f840 79 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65  y cannot both be
1f850 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
1f860 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20  **  (**)  We no 
1f870 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74  longer attempt t
1f880 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67  o flatten aggreg
1f890 61 74 65 20 73 75 62 71 75 65 72 69 65 73 2e 20  ate subqueries. 
1f8a0 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 28  Was:.**        (
1f8b0 32 29 20 49 66 20 74 68 65 20 73 75 62 71 75 65  2) If the subque
1f8c0 72 79 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  ry is an aggrega
1f8d0 74 65 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20  te then.**      
1f8e0 20 20 28 32 61 29 20 74 68 65 20 6f 75 74 65 72    (2a) the outer
1f8f0 20 71 75 65 72 79 20 6d 75 73 74 20 6e 6f 74 20   query must not 
1f900 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a 2a  be a join and.**
1f910 20 20 20 20 20 20 20 20 28 32 62 29 20 74 68 65          (2b) the
1f920 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 75 73   outer query mus
1f930 74 20 6e 6f 74 20 75 73 65 20 73 75 62 71 75 65  t not use subque
1f940 72 69 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ries.**         
1f950 20 20 20 20 6f 74 68 65 72 20 74 68 61 6e 20 74      other than t
1f960 68 65 20 6f 6e 65 20 46 52 4f 4d 2d 63 6c 61 75  he one FROM-clau
1f970 73 65 20 73 75 62 71 75 65 72 79 20 74 68 61 74  se subquery that
1f980 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 0a   is a candidate.
1f990 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 66  **             f
1f9a0 6f 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20  or flattening.  
1f9b0 28 54 68 69 73 20 69 73 20 64 75 65 20 74 6f 20  (This is due to 
1f9c0 74 69 63 6b 65 74 20 5b 32 66 37 31 37 30 64 37  ticket [2f7170d7
1f9d0 33 62 66 39 61 62 66 38 30 5d 0a 2a 2a 20 20 20  3bf9abf80].**   
1f9e0 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20 32            from 2
1f9f0 30 31 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a 2a  015-02-09.).**.*
1fa00 2a 20 20 20 28 33 29 20 20 49 66 20 74 68 65 20  *   (3)  If the 
1fa10 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20  subquery is the 
1fa20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
1fa30 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 74 68 65   a LEFT JOIN the
1fa40 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 61 29  n.**        (3a)
1fa50 20 74 68 65 20 73 75 62 71 75 65 72 79 20 6d 61   the subquery ma
1fa60 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20  y not be a join 
1fa70 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 33  and.**        (3
1fa80 62 29 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  b) the FROM clau
1fa90 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  se of the subque
1faa0 72 79 20 6d 61 79 20 6e 6f 74 20 63 6f 6e 74 61  ry may not conta
1fab0 69 6e 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20  in a virtual.** 
1fac0 20 20 20 20 20 20 20 20 20 20 20 20 74 61 62 6c              tabl
1fad0 65 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  e and.**        
1fae0 28 33 63 29 20 74 68 65 20 6f 75 74 65 72 20 71  (3c) the outer q
1faf0 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20  uery may not be 
1fb00 61 6e 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a  an aggregate..**
1fb10 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73  .**   (4)  The s
1fb20 75 62 71 75 65 72 79 20 63 61 6e 20 6e 6f 74 20  ubquery can not 
1fb30 62 65 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a  be DISTINCT..**.
1fb40 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65  **  (**)  At one
1fb50 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63 74 69   point restricti
1fb60 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35 29 20  ons (4) and (5) 
1fb70 64 65 66 69 6e 65 64 20 61 20 73 75 62 73 65 74  defined a subset
1fb80 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20   of DISTINCT.** 
1fb90 20 20 20 20 20 20 20 73 75 62 2d 71 75 65 72 69         sub-queri
1fba0 65 73 20 74 68 61 74 20 77 65 72 65 20 65 78 63  es that were exc
1fbb0 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69 73 20  luded from this 
1fbc0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65  optimization. Re
1fbd0 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  striction .**   
1fbe0 20 20 20 20 20 28 34 29 20 68 61 73 20 73 69 6e       (4) has sin
1fbf0 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65 64  ce been expanded
1fc00 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c 20   to exclude all 
1fc10 44 49 53 54 49 4e 43 54 20 73 75 62 71 75 65 72  DISTINCT subquer
1fc20 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  ies..**.**  (**)
1fc30 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61    We no longer a
1fc40 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74 65  ttempt to flatte
1fc50 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71  n aggregate subq
1fc60 75 65 72 69 65 73 2e 20 20 57 61 73 3a 0a 2a 2a  ueries.  Was:.**
1fc70 20 20 20 20 20 20 20 20 49 66 20 74 68 65 20 73          If the s
1fc80 75 62 71 75 65 72 79 20 69 73 20 61 67 67 72 65  ubquery is aggre
1fc90 67 61 74 65 2c 20 74 68 65 20 6f 75 74 65 72 20  gate, the outer 
1fca0 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
1fcb0 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
1fcc0 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71     (7)  The subq
1fcd0 75 65 72 79 20 6d 75 73 74 20 68 61 76 65 20 61  uery must have a
1fce0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
1fcf0 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71 75 65  ODO:  For subque
1fd00 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20  ries without.** 
1fd10 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20 63 6c         A FROM cl
1fd20 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72 20 61  ause, consider a
1fd30 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c 61  dding a FROM cla
1fd40 75 73 65 20 77 69 74 68 20 74 68 65 20 73 70 65  use with the spe
1fd50 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74  cial.**        t
1fd60 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65  able sqlite_once
1fd70 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f   that consists o
1fd80 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 63  f a single row c
1fd90 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20  ontaining a.**  
1fda0 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c        single NUL
1fdb0 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20  L..**.**   (8)  
1fdc0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1fdd0 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e 20  uses LIMIT then 
1fde0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1fdf0 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69  may not be a joi
1fe00 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20  n..**.**   (9)  
1fe10 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1fe20 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e 20  uses LIMIT then 
1fe30 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1fe40 6d 61 79 20 6e 6f 74 20 62 65 20 61 67 67 72 65  may not be aggre
1fe50 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  gate..**.**  (**
1fe60 29 20 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  )  Restriction (
1fe70 31 30 29 20 77 61 73 20 72 65 6d 6f 76 65 64 20  10) was removed 
1fe80 66 72 6f 6d 20 74 68 65 20 63 6f 64 65 20 6f 6e  from the code on
1fe90 20 32 30 30 35 2d 30 32 2d 30 35 20 62 75 74 20   2005-02-05 but 
1fea0 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 63 63  we.**        acc
1feb0 69 64 65 6e 74 6c 79 20 63 61 72 72 69 65 64 20  idently carried 
1fec0 74 68 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 77  the comment forw
1fed0 61 72 64 20 75 6e 74 69 6c 20 32 30 31 34 2d 30  ard until 2014-0
1fee0 39 2d 31 35 2e 20 20 4f 72 69 67 69 6e 61 6c 0a  9-15.  Original.
1fef0 2a 2a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72  **        constr
1ff00 61 69 6e 74 3a 20 22 49 66 20 74 68 65 20 73 75  aint: "If the su
1ff10 62 71 75 65 72 79 20 69 73 20 61 67 67 72 65 67  bquery is aggreg
1ff20 61 74 65 20 74 68 65 6e 20 74 68 65 20 6f 75 74  ate then the out
1ff30 65 72 20 71 75 65 72 79 20 0a 2a 2a 20 20 20 20  er query .**    
1ff40 20 20 20 20 6d 61 79 20 6e 6f 74 20 75 73 65 20      may not use 
1ff50 4c 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28  LIMIT.".**.**  (
1ff60 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  11)  The subquer
1ff70 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  y and the outer 
1ff80 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 6f  query may not bo
1ff90 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59  th have ORDER BY
1ffa0 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
1ffb0 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65   (**)  Not imple
1ffc0 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65  mented.  Subsume
1ffd0 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69  d into restricti
1ffe0 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72 65  on (3).  Was pre
1fff0 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20  viously.**      
20000 20 20 61 20 73 65 70 61 72 61 74 65 20 72 65 73    a separate res
20010 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e  triction derivin
20020 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33  g from ticket #3
20030 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20  50..**.**  (13) 
20040 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
20050 64 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61  d outer query ma
20060 79 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c  y not both use L
20070 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34  IMIT..**.**  (14
20080 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
20090 6d 61 79 20 6e 6f 74 20 75 73 65 20 4f 46 46 53  may not use OFFS
200a0 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20  ET..**.**  (15) 
200b0 20 49 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   If the outer qu
200c0 65 72 79 20 69 73 20 70 61 72 74 20 6f 66 20 61  ery is part of a
200d0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
200e0 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20  , then the.**   
200f0 20 20 20 20 20 73 75 62 71 75 65 72 79 20 6d 61       subquery ma
20100 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e  y not use LIMIT.
20110 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65 20  .**        (See 
20120 74 69 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64  ticket #2339 and
20130 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31   ticket [02a8e81
20140 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  d44])..**.**  (1
20150 36 29 20 20 49 66 20 74 68 65 20 6f 75 74 65 72  6)  If the outer
20160 20 71 75 65 72 79 20 69 73 20 61 67 67 72 65 67   query is aggreg
20170 61 74 65 2c 20 74 68 65 6e 20 74 68 65 20 73 75  ate, then the su
20180 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a  bquery may not.*
20190 2a 20 20 20 20 20 20 20 20 75 73 65 20 4f 52 44  *        use ORD
201a0 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20  ER BY.  (Ticket 
201b0 23 32 39 34 32 29 20 20 54 68 69 73 20 75 73 65  #2942)  This use
201c0 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a  d to not matter.
201d0 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20  **        until 
201e0 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68  we introduced th
201f0 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29  e group_concat()
20200 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a   function.  .**.
20210 2a 2a 20 20 28 31 37 29 20 20 49 66 20 74 68 65  **  (17)  If the
20220 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20 63   subquery is a c
20230 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
20240 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28  then.**        (
20250 31 37 61 29 20 61 6c 6c 20 63 6f 6d 70 6f 75 6e  17a) all compoun
20260 64 20 6f 70 65 72 61 74 6f 72 73 20 6d 75 73 74  d operators must
20270 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 2c   be a UNION ALL,
20280 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28   and.**        (
20290 31 37 62 29 20 6e 6f 20 74 65 72 6d 73 20 77 69  17b) no terms wi
202a0 74 68 69 6e 20 74 68 65 20 73 75 62 71 75 65 72  thin the subquer
202b0 79 20 63 6f 6d 70 6f 75 6e 64 20 6d 61 79 20 62  y compound may b
202c0 65 20 61 67 67 72 65 67 61 74 65 0a 2a 2a 20 20  e aggregate.**  
202d0 20 20 20 20 20 20 20 20 20 20 20 20 6f 72 20 44              or D
202e0 49 53 54 49 4e 43 54 2c 20 61 6e 64 0a 2a 2a 20  ISTINCT, and.** 
202f0 20 20 20 20 20 20 20 28 31 37 63 29 20 65 76 65         (17c) eve
20300 72 79 20 74 65 72 6d 20 77 69 74 68 69 6e 20 74  ry term within t
20310 68 65 20 73 75 62 71 75 65 72 79 20 63 6f 6d 70  he subquery comp
20320 6f 75 6e 64 20 6d 75 73 74 20 68 61 76 65 20 61  ound must have a
20330 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20   FROM clause.** 
20340 20 20 20 20 20 20 20 28 31 37 64 29 20 74 68 65         (17d) the
20350 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79   outer query may
20360 20 6e 6f 74 20 62 65 0a 2a 2a 20 20 20 20 20 20   not be.**      
20370 20 20 20 20 20 20 20 20 28 31 37 64 31 29 20 61          (17d1) a
20380 67 67 72 65 67 61 74 65 2c 20 6f 72 0a 2a 2a 20  ggregate, or.** 
20390 20 20 20 20 20 20 20 20 20 20 20 20 20 28 31 37               (17
203a0 64 32 29 20 44 49 53 54 49 4e 43 54 2c 20 6f 72  d2) DISTINCT, or
203b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
203c0 20 28 31 37 64 33 29 20 61 20 6a 6f 69 6e 2e 0a   (17d3) a join..
203d0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65  **.**        The
203e0 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d   parent and sub-
203f0 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69  query may contai
20400 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e  n WHERE clauses.
20410 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20   Subject to.**  
20420 20 20 20 20 20 20 72 75 6c 65 73 20 28 31 31 29        rules (11)
20430 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c  , (13) and (14),
20440 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63   they may also c
20450 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c  ontain ORDER BY,
20460 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54  .**        LIMIT
20470 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75   and OFFSET clau
20480 73 65 73 2e 20 20 54 68 65 20 73 75 62 71 75 65  ses.  The subque
20490 72 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e  ry cannot use an
204a0 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20  y compound.**   
204b0 20 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f 74       operator ot
204c0 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41  her than UNION A
204d0 4c 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74  LL because all t
204e0 68 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e  he other compoun
204f0 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72  d.**        oper
20500 61 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69 6d  ators have an im
20510 70 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20 77  plied DISTINCT w
20520 68 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f 77  hich is disallow
20530 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20 20  ed by.**        
20540 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29 2e  restriction (4).
20550 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c  .**.**        Al
20560 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65  so, each compone
20570 6e 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75  nt of the sub-qu
20580 65 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e 20  ery must return 
20590 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
205a0 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65 73  **        of res
205b0 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69  ult columns. Thi
205c0 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  s is actually a 
205d0 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72 20  requirement for 
205e0 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  any compound.** 
205f0 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 73 74         SELECT st
20600 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c  atement, but all
20610 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20 64   the code here d
20620 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72 65  oes is make sure
20630 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20   that no.**     
20640 20 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61 6c     such (illegal
20650 29 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 66  ) sub-query is f
20660 6c 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63 61  lattened. The ca
20670 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63 74  ller will detect
20680 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73   the.**        s
20690 79 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64 20  yntax error and 
206a0 72 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c 65  return a detaile
206b0 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a  d message..**.**
206c0 20 20 28 31 38 29 20 20 49 66 20 74 68 65 20 73    (18)  If the s
206d0 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
206e0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74  mpound select, t
206f0 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66  hen all terms of
20700 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f   the.**        O
20710 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
20720 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73  f the parent mus
20730 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65  t be simple refe
20740 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20  rences to .**   
20750 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20       columns of 
20760 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a  the sub-query..*
20770 2a 0a 2a 2a 20 20 28 31 39 29 20 20 49 66 20 74  *.**  (19)  If t
20780 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
20790 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20   LIMIT then the 
207a0 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20  outer query may 
207b0 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61  not.**        ha
207c0 76 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  ve a WHERE claus
207d0 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20  e..**.**  (20)  
207e0 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
207f0 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   is a compound s
20800 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d  elect, then it m
20810 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  ust not use.**  
20820 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42        an ORDER B
20830 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65  Y clause.  Ticke
20840 74 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75  t #3773.  We cou
20850 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f  ld relax this co
20860 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20  nstraint.**     
20870 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73     somewhat by s
20880 61 79 69 6e 67 20 74 68 61 74 20 74 68 65 20 74  aying that the t
20890 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
208a0 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74  R BY clause must
208b0 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65 61  .**        appea
208c0 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20  r as unmodified 
208d0 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69  result columns i
208e0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
208f0 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20  y.  But we.**   
20900 20 20 20 20 20 68 61 76 65 20 6f 74 68 65 72 20       have other 
20910 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e  optimizations in
20920 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69   mind to deal wi
20930 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a  th that case..**
20940 0a 2a 2a 20 20 28 32 31 29 20 20 49 66 20 74 68  .**  (21)  If th
20950 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
20960 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f  LIMIT then the o
20970 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
20980 6f 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20  ot be.**        
20990 44 49 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20  DISTINCT.  (See 
209a0 74 69 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36  ticket [752e1646
209b0 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32  fc])..**.**  (22
209c0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
209d0 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 72 65 63  may not be a rec
209e0 75 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a  ursive CTE..**.*
209f0 2a 20 20 28 2a 2a 29 20 20 53 75 62 73 75 6d 65  *  (**)  Subsume
20a00 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69  d into restricti
20a10 6f 6e 20 28 31 37 64 33 29 2e 20 20 57 61 73 3a  on (17d3).  Was:
20a20 20 49 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   If the outer qu
20a30 65 72 79 20 69 73 0a 2a 2a 20 20 20 20 20 20 20  ery is.**       
20a40 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45   a recursive CTE
20a50 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 2d 71  , then the sub-q
20a60 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20  uery may not be 
20a70 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
20a80 2e 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 69 73  ..**        This
20a90 20 72 65 73 74 72 69 63 74 69 6f 6e 20 69 73 20   restriction is 
20aa0 62 65 63 61 75 73 65 20 74 72 61 6e 73 66 6f 72  because transfor
20ab0 6d 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20  ming the.**     
20ac0 20 20 20 70 61 72 65 6e 74 20 74 6f 20 61 20 63     parent to a c
20ad0 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 63 6f  ompound query co
20ae0 6e 66 75 73 65 73 20 74 68 65 20 63 6f 64 65 20  nfuses the code 
20af0 74 68 61 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20  that handles.** 
20b00 20 20 20 20 20 20 20 72 65 63 75 72 73 69 76 65         recursive
20b10 20 71 75 65 72 69 65 73 20 69 6e 20 6d 75 6c 74   queries in mult
20b20 69 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a  iSelect()..**.**
20b30 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f    (**)  We no lo
20b40 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20  nger attempt to 
20b50 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61 74  flatten aggregat
20b60 65 20 73 75 62 71 75 65 72 69 65 73 2e 20 20 57  e subqueries.  W
20b70 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68  as:.**        Th
20b80 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  e subquery may n
20b90 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65 67 61  ot be an aggrega
20ba0 74 65 20 74 68 61 74 20 75 73 65 73 20 74 68 65  te that uses the
20bb0 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 20   built-in min() 
20bc0 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72  or .**        or
20bd0 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 73   max() functions
20be0 2e 20 20 28 57 69 74 68 6f 75 74 20 74 68 69 73  .  (Without this
20bf0 20 72 65 73 74 72 69 63 74 69 6f 6e 2c 20 61 20   restriction, a 
20c00 71 75 65 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20  query like:.**  
20c10 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 78 20        "SELECT x 
20c20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 6d 61 78  FROM (SELECT max
20c30 28 79 29 2c 20 78 20 46 52 4f 4d 20 74 31 29 22  (y), x FROM t1)"
20c40 20 77 6f 75 6c 64 20 6e 6f 74 20 6e 65 63 65 73   would not neces
20c50 73 61 72 69 6c 79 0a 2a 2a 20 20 20 20 20 20 20  sarily.**       
20c60 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   return the valu
20c70 65 20 58 20 66 6f 72 20 77 68 69 63 68 20 59 20  e X for which Y 
20c80 77 61 73 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a  was maximal.).**
20c90 0a 2a 2a 20 20 28 32 35 29 20 20 49 66 20 65 69  .**  (25)  If ei
20ca0 74 68 65 72 20 74 68 65 20 73 75 62 71 75 65 72  ther the subquer
20cb0 79 20 6f 72 20 74 68 65 20 70 61 72 65 6e 74 20  y or the parent 
20cc0 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 61  query contains a
20cd0 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 20 20 20   window.**      
20ce0 20 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68    function in th
20cf0 65 20 73 65 6c 65 63 74 20 6c 69 73 74 20 6f 72  e select list or
20d00 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
20d10 2c 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20  , flattening.** 
20d20 20 20 20 20 20 20 20 69 73 20 6e 6f 74 20 61 74         is not at
20d30 74 65 6d 70 74 65 64 2e 0a 2a 2a 0a 2a 2a 0a 2a  tempted..**.**.*
20d40 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  * In this routin
20d50 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d  e, the "p" param
20d60 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65  eter is a pointe
20d70 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71  r to the outer q
20d80 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62  uery..** The sub
20d90 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63  query is p->pSrc
20da0 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41  ->a[iFrom].  isA
20db0 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  gg is true if th
20dc0 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a  e outer query.**
20dd0 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73   uses aggregates
20de0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74  ..**.** If flatt
20df0 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74  ening is not att
20e00 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75  empted, this rou
20e10 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
20e20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a  and returns 0..*
20e30 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
20e40 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69  is attempted thi
20e50 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
20e60 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  s 1..**.** All o
20e70 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
20e80 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f   analysis must o
20e90 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65  ccur on both the
20ea0 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
20eb0 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79  .** the subquery
20ec0 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
20ed0 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74  tine runs..*/.st
20ee0 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e  atic int flatten
20ef0 53 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73  Subquery(.  Pars
20f00 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
20f10 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
20f20 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
20f30 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
20f40 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f   The parent or o
20f50 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74  uter SELECT stat
20f60 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
20f70 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  From,           
20f80 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70  /* Index in p->p
20f90 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20  Src->a[] of the 
20fa0 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a  inner subquery *
20fb0 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 20 20 20  /.  int isAgg   
20fc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
20fd0 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54   if outer SELECT
20fe0 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
20ff0 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  functions */.){.
21000 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
21010 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20  avedAuthContext 
21020 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43  = pParse->zAuthC
21030 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74  ontext;.  Select
21040 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 2f 2a   *pParent;    /*
21050 20 43 75 72 72 65 6e 74 20 55 4e 49 4f 4e 20 41   Current UNION A
21060 4c 4c 20 74 65 72 6d 20 6f 66 20 74 68 65 20 6f  LL term of the o
21070 74 68 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  ther query */.  
21080 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20  Select *pSub;   
21090 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72      /* The inner
210a0 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75   query or "subqu
210b0 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ery" */.  Select
210c0 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a   *pSub1;      /*
210d0 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
210e0 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74  rightmost select
210f0 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f   in sub-query */
21100 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
21110 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ;      /* The FR
21120 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
21130 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
21140 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53    SrcList *pSubS
21150 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  rc;   /* The FRO
21160 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
21170 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  subquery */.  in
21180 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20  t iParent;      
21190 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72    /* VDBE cursor
211a0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
211b0 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20 74  Sub result set t
211c0 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  emp table */.  i
211d0 6e 74 20 69 4e 65 77 50 61 72 65 6e 74 20 3d 20  nt iNewParent = 
211e0 2d 31 3b 2f 2a 20 52 65 70 6c 61 63 65 6d 65 6e  -1;/* Replacemen
211f0 74 20 74 61 62 6c 65 20 66 6f 72 20 69 50 61 72  t table for iPar
21200 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c  ent */.  int isL
21210 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 20 2f 2a 20  eftJoin = 0; /* 
21220 54 72 75 65 20 69 66 20 70 53 75 62 20 69 73 20  True if pSub is 
21230 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f  the right side o
21240 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f  f a LEFT JOIN */
21250 20 20 20 20 0a 20 20 69 6e 74 20 69 3b 20 20 20      .  int i;   
21260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
21270 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
21280 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
21290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212a0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
212b0 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
212c0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
212d0 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68  Subitem;   /* Th
212e0 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
212f0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
21300 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
21310 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
21320 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
21330 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e  rmitted.  Return
21340 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a   0 if not..  */.
21350 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
21360 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
21370 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 69 66  Prior==0 );.  if
21380 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  ( OptimizationDi
21390 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  sabled(db, SQLIT
213a0 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72  E_QueryFlattener
213b0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
213c0 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
213d0 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26    assert( pSrc &
213e0 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46  & iFrom>=0 && iF
213f0 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29  rom<pSrc->nSrc )
21400 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26  ;.  pSubitem = &
21410 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a  pSrc->a[iFrom];.
21420 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62    iParent = pSub
21430 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  item->iCursor;. 
21440 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d   pSub = pSubitem
21450 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73  ->pSelect;.  ass
21460 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a  ert( pSub!=0 );.
21470 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21480 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a  OMIT_WINDOWFUNC.
21490 20 20 69 66 28 20 70 2d 3e 70 57 69 6e 20 7c 7c    if( p->pWin ||
214a0 20 70 53 75 62 2d 3e 70 57 69 6e 20 29 20 72 65   pSub->pWin ) re
214b0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
214c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
214d0 72 69 63 74 69 6f 6e 20 28 32 35 29 20 2a 2f 0a  riction (25) */.
214e0 23 65 6e 64 69 66 0a 0a 20 20 70 53 75 62 53 72  #endif..  pSubSr
214f0 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a  c = pSub->pSrc;.
21500 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72    assert( pSubSr
21510 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20  c );.  /* Prior 
21520 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32  to version 3.1.2
21530 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64  , when LIMIT and
21540 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20 62   OFFSET had to b
21550 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e  e simple constan
21560 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62  ts,.  ** not arb
21570 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f  itrary expressio
21580 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73  ns, we allowed s
21590 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66  ome combining of
215a0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
215b0 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74  T.  ** because t
215c0 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d  hey could be com
215d0 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  puted at compile
215e0 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e  -time.  But when
215f0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
21600 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72  T.  ** became ar
21610 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69  bitrary expressi
21620 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72  ons, we were for
21630 63 65 64 20 74 6f 20 61 64 64 20 72 65 73 74 72  ced to add restr
21640 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a  ictions (13).  *
21650 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20  * and (14). */. 
21660 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
21670 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29  t && p->pLimit )
21680 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
21690 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
216a0 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20  iction (13) */. 
216b0 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
216c0 74 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69  t && pSub->pLimi
216d0 74 2d 3e 70 52 69 67 68 74 20 29 20 72 65 74 75  t->pRight ) retu
216e0 72 6e 20 30 3b 20 20 20 2f 2a 20 52 65 73 74 72  rn 0;   /* Restr
216f0 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20  iction (14) */. 
21700 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
21710 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e 64 29  s & SF_Compound)
21720 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 4c 69  !=0 && pSub->pLi
21730 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  mit ){.    retur
21740 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
21750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21770 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
21780 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  15) */.  }.  if(
21790 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d   pSubSrc->nSrc==
217a0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
217b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217c0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
217d0 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28  on (7)  */.  if(
217e0 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
217f0 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20  & SF_Distinct ) 
21800 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
21810 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
21820 6f 6e 20 28 34 29 20 20 2a 2f 0a 20 20 69 66 28  on (4)  */.  if(
21830 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
21840 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c   (pSrc->nSrc>1 |
21850 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20  | isAgg) ){.    
21860 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
21870 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
21880 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d  ns (8)(9) */.  }
21890 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
218a0 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  By && pSub->pOrd
218b0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74  erBy ){.     ret
218c0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
218d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218f0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
21900 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (11) */.  }.  if
21910 28 20 69 73 41 67 67 20 26 26 20 70 53 75 62 2d  ( isAgg && pSub-
21920 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75  >pOrderBy ) retu
21930 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
21940 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
21950 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66  ion (16) */.  if
21960 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
21970 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65  & p->pWhere ) re
21980 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
21990 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
219a0 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66  ion (19) */.  if
219b0 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
219c0 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
219d0 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
219e0 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
219f0 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
21a00 73 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a  striction (21) *
21a10 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  /.  }.  if( pSub
21a20 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
21a30 5f 52 65 63 75 72 73 69 76 65 29 20 29 7b 0a 20  _Recursive) ){. 
21a40 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
21a50 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 32 32  Restrictions (22
21a60 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  ) */.  }..  /*. 
21a70 20 2a 2a 20 49 66 20 74 68 65 20 73 75 62 71 75   ** If the subqu
21a80 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
21a90 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45   operand of a LE
21aa0 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 74 68  FT JOIN, then th
21ab0 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20  e.  ** subquery 
21ac0 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69  may not be a joi
21ad0 6e 20 69 74 73 65 6c 66 20 28 33 61 29 2e 20 45  n itself (3a). E
21ae0 78 61 6d 70 6c 65 20 6f 66 20 77 68 79 20 74 68  xample of why th
21af0 69 73 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61  is is not.  ** a
21b00 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
21b10 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
21b20 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32  T OUTER JOIN (t2
21b30 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20   JOIN t3).  **. 
21b40 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
21b50 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
21b60 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
21b70 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
21b80 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
21b90 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a  t2) JOIN t3.  **
21ba0 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e  .  ** which is n
21bb0 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61  ot at all the sa
21bc0 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20  me thing..  **. 
21bd0 20 2a 2a 20 49 66 20 74 68 65 20 73 75 62 71 75   ** If the subqu
21be0 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
21bf0 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45   operand of a LE
21c00 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 74 68  FT JOIN, then th
21c10 65 20 6f 75 74 65 72 0a 20 20 2a 2a 20 71 75 65  e outer.  ** que
21c20 72 79 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20  ry cannot be an 
21c30 61 67 67 72 65 67 61 74 65 2e 20 28 33 63 29 20  aggregate. (3c) 
21c40 20 54 68 69 73 20 69 73 20 61 6e 20 61 72 74 69   This is an arti
21c50 66 61 63 74 20 6f 66 20 74 68 65 20 77 61 79 0a  fact of the way.
21c60 20 20 2a 2a 20 61 67 67 72 65 67 61 74 65 73 20    ** aggregates 
21c70 61 72 65 20 70 72 6f 63 65 73 73 65 64 20 2d 20  are processed - 
21c80 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 65 63 68  there is no mech
21c90 61 6e 69 73 6d 20 74 6f 20 64 65 74 65 72 6d 69  anism to determi
21ca0 6e 65 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 4c  ne if.  ** the L
21cb0 45 46 54 20 4a 4f 49 4e 20 74 61 62 6c 65 20 73  EFT JOIN table s
21cc0 68 6f 75 6c 64 20 62 65 20 61 6c 6c 2d 4e 55 4c  hould be all-NUL
21cd0 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65  L..  **.  ** See
21ce0 20 61 6c 73 6f 20 74 69 63 6b 65 74 73 20 23 33   also tickets #3
21cf0 30 36 2c 20 23 33 35 30 2c 20 61 6e 64 20 23 33  06, #350, and #3
21d00 33 30 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  300..  */.  if( 
21d10 28 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f  (pSubitem->fg.jo
21d20 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
21d30 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 73 4c  R)!=0 ){.    isL
21d40 65 66 74 4a 6f 69 6e 20 3d 20 31 3b 0a 20 20 20  eftJoin = 1;.   
21d50 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
21d60 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 20 7c 7c  rc>1 || isAgg ||
21d70 20 49 73 56 69 72 74 75 61 6c 28 70 53 75 62 53   IsVirtual(pSubS
21d80 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20 29  rc->a[0].pTab) )
21d90 7b 0a 20 20 20 20 20 20 2f 2a 20 20 28 33 61 29  {.      /*  (3a)
21da0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 33 63               (3c
21db0 29 20 20 20 20 20 28 33 62 29 20 2a 2f 0a 20 20  )     (3b) */.  
21dc0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
21dd0 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53    }.  }.#ifdef S
21de0 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 46 4e 55  QLITE_EXTRA_IFNU
21df0 4c 4c 52 4f 57 0a 20 20 65 6c 73 65 20 69 66 28  LLROW.  else if(
21e00 20 69 46 72 6f 6d 3e 30 20 26 26 20 21 69 73 41   iFrom>0 && !isA
21e10 67 67 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 74  gg ){.    /* Set
21e20 74 69 6e 67 20 69 73 4c 65 66 74 4a 6f 69 6e 20  ting isLeftJoin 
21e30 74 6f 20 2d 31 20 63 61 75 73 65 73 20 4f 50 5f  to -1 causes OP_
21e40 49 66 4e 75 6c 6c 52 6f 77 20 6f 70 63 6f 64 65  IfNullRow opcode
21e50 73 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65  s to be generate
21e60 64 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65  d for.    ** eve
21e70 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ry reference to 
21e80 61 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  any result colum
21e90 6e 20 66 72 6f 6d 20 73 75 62 71 75 65 72 79 20  n from subquery 
21ea0 69 6e 20 61 20 6a 6f 69 6e 2c 20 65 76 65 6e 0a  in a join, even.
21eb0 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 74 68      ** though th
21ec0 65 79 20 61 72 65 20 6e 6f 74 20 6e 65 63 65 73  ey are not neces
21ed0 73 61 72 79 2e 20 20 54 68 69 73 20 77 69 6c 6c  sary.  This will
21ee0 20 73 74 72 65 73 73 2d 74 65 73 74 20 74 68 65   stress-test the
21ef0 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 20 0a 20   OP_IfNullRow . 
21f00 20 20 20 2a 2a 20 6f 70 63 6f 64 65 2e 20 2a 2f     ** opcode. */
21f10 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f 69 6e 20  .    isLeftJoin 
21f20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  = -1;.  }.#endif
21f30 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  ..  /* Restricti
21f40 6f 6e 20 28 31 37 29 3a 20 49 66 20 74 68 65 20  on (17): If the 
21f50 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
21f60 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20  ompound SELECT, 
21f70 74 68 65 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a  then it must.  *
21f80 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 55  * use only the U
21f90 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
21fa0 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74  r. And none of t
21fb0 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74  he simple select
21fc0 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 68   queries.  ** th
21fd0 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63  at make up the c
21fe0 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61  ompound SELECT a
21ff0 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  re allowed to be
22000 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 64 69   aggregate or di
22010 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72  stinct.  ** quer
22020 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ies..  */.  if( 
22030 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  pSub->pPrior ){.
22040 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f      if( pSub->pO
22050 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
22060 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65  return 0;  /* Re
22070 73 74 72 69 63 74 69 6f 6e 20 28 32 30 29 20 2a  striction (20) *
22080 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  /.    }.    if( 
22090 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c  isAgg || (p->sel
220a0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
220b0 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d  nct)!=0 || pSrc-
220c0 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20  >nSrc!=1 ){.    
220d0 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 28    return 0; /* (
220e0 31 37 64 31 29 2c 20 28 31 37 64 32 29 2c 20 6f  17d1), (17d2), o
220f0 72 20 28 31 37 64 33 29 20 2a 2f 0a 20 20 20 20  r (17d3) */.    
22100 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31 3d  }.    for(pSub1=
22110 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53 75  pSub; pSub1; pSu
22120 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f 72  b1=pSub1->pPrior
22130 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
22140 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c  e( (pSub1->selFl
22150 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
22160 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
22170 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29  )==SF_Distinct )
22180 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
22190 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61  ( (pSub1->selFla
221a0 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
221b0 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
221c0 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29  ==SF_Aggregate )
221d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
221e0 70 53 75 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b  pSub->pSrc!=0 );
221f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22200 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  Sub->pEList->nEx
22210 70 72 3d 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73  pr==pSub1->pELis
22220 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
22230 20 20 69 66 28 20 28 70 53 75 62 31 2d 3e 73 65    if( (pSub1->se
22240 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
22250 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
22260 74 65 29 29 21 3d 30 20 20 20 20 2f 2a 20 28 31  te))!=0    /* (1
22270 37 62 29 20 2a 2f 0a 20 20 20 20 20 20 20 7c 7c  7b) */.       ||
22280 20 28 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20   (pSub1->pPrior 
22290 26 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b  && pSub1->op!=TK
222a0 5f 41 4c 4c 29 20 20 20 20 20 20 20 20 20 20 20  _ALL)           
222b0 20 20 20 20 20 20 2f 2a 20 28 31 37 61 29 20 2a        /* (17a) *
222c0 2f 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62  /.       || pSub
222d0 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31 20  1->pSrc->nSrc<1 
222e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22300 20 2f 2a 20 28 31 37 63 29 20 2a 2f 0a 20 20 20   /* (17c) */.   
22310 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65     ){.        re
22320 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
22330 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22340 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72  pSub1->pSrc->nSr
22350 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  c>1 );.    }..  
22360 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
22370 20 28 31 38 29 2e 20 2a 2f 0a 20 20 20 20 69 66   (18). */.    if
22380 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
22390 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  .      int ii;. 
223a0 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
223b0 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  i<p->pOrderBy->n
223c0 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
223d0 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
223e0 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e  erBy->a[ii].u.x.
223f0 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29  iOrderByCol==0 )
22400 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
22410 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
22420 2f 2a 20 45 78 2d 72 65 73 74 72 69 63 74 69 6f  /* Ex-restrictio
22430 6e 20 28 32 33 29 3a 0a 20 20 2a 2a 20 54 68 65  n (23):.  ** The
22440 20 6f 6e 6c 79 20 77 61 79 20 74 68 61 74 20 74   only way that t
22450 68 65 20 72 65 63 75 72 73 69 76 65 20 70 61 72  he recursive par
22460 74 20 6f 66 20 61 20 43 54 45 20 63 61 6e 20 63  t of a CTE can c
22470 6f 6e 74 61 69 6e 20 61 20 63 6f 6d 70 6f 75 6e  ontain a compoun
22480 64 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20  d.  ** subquery 
22490 69 73 20 66 6f 72 20 74 68 65 20 73 75 62 71 75  is for the subqu
224a0 65 72 79 20 74 6f 20 62 65 20 6f 6e 65 20 74 65  ery to be one te
224b0 72 6d 20 6f 66 20 61 20 6a 6f 69 6e 2e 20 20 42  rm of a join.  B
224c0 75 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 73  ut if the.  ** s
224d0 75 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69  ubquery is a joi
224e0 6e 2c 20 74 68 65 6e 20 74 68 65 20 66 6c 61 74  n, then the flat
224f0 74 65 6e 69 6e 67 20 68 61 73 20 61 6c 72 65 61  tening has alrea
22500 64 79 20 62 65 65 6e 20 73 74 6f 70 70 65 64 20  dy been stopped 
22510 62 79 0a 20 20 2a 2a 20 72 65 73 74 72 69 63 74  by.  ** restrict
22520 69 6f 6e 20 28 31 37 64 33 29 0a 20 20 2a 2f 0a  ion (17d3).  */.
22530 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65    assert( (p->se
22540 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
22550 72 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 53 75  rsive)==0 || pSu
22560 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a  b->pPrior==0 );.
22570 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20  .  /***** If we 
22580 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
22590 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  , flattening is 
225a0 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a  permitted. *****
225b0 2f 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28  /.  SELECTTRACE(
225c0 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 66 6c 61  1,pParse,p,("fla
225d0 74 74 65 6e 20 25 75 2e 25 70 20 66 72 6f 6d 20  tten %u.%p from 
225e0 74 65 72 6d 20 25 64 5c 6e 22 2c 0a 20 20 20 20  term %d\n",.    
225f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
22600 53 75 62 2d 3e 73 65 6c 49 64 2c 20 70 53 75 62  Sub->selId, pSub
22610 2c 20 69 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a  , iFrom));..  /*
22620 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73   Authorize the s
22630 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61  ubquery */.  pPa
22640 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
22650 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  t = pSubitem->zN
22660 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  ame;.  TESTONLY(
22670 69 20 3d 29 20 73 71 6c 69 74 65 33 41 75 74 68  i =) sqlite3Auth
22680 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
22690 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
226a0 30 2c 20 30 29 3b 0a 20 20 74 65 73 74 63 61 73  0, 0);.  testcas
226b0 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e  e( i==SQLITE_DEN
226c0 59 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a  Y );.  pParse->z
226d0 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53  AuthContext = zS
226e0 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b  avedAuthContext;
226f0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75  ..  /* If the su
22700 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
22710 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61  pound SELECT sta
22720 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79  tement, then (by
22730 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20   restrictions.  
22740 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f  ** 17 and 18 abo
22750 76 65 29 20 69 74 20 6d 75 73 74 20 62 65 20 61  ve) it must be a
22760 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74   UNION ALL and t
22770 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
22780 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66  must .  ** be of
22790 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a   the form:.  **.
227a0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
227b0 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d  <expr-list> FROM
227c0 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c   (<sub-query>) <
227d0 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20  where-clause> . 
227e0 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65   **.  ** followe
227f0 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42  d by any ORDER B
22800 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20  Y, LIMIT and/or 
22810 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
22820 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20  This block.  ** 
22830 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69  creates N-1 copi
22840 65 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  es of the parent
22850 20 71 75 65 72 79 20 77 69 74 68 6f 75 74 20 61   query without a
22860 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d  ny ORDER BY, LIM
22870 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53  IT or .  ** OFFS
22880 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a  ET clauses and j
22890 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65  oins them to the
228a0 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20   left-hand-side 
228b0 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  of the original.
228c0 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e    ** using UNION
228d0 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20   ALL operators. 
228e0 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20 69  In this case N i
228f0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
22900 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65  simple.  ** sele
22910 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ct statements in
22920 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75   the compound su
22930 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20  b-query..  **.  
22940 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  ** Example:.  **
22950 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
22960 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a   a+1 FROM (.  **
22970 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78          SELECT x
22980 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20   FROM tab.  **  
22990 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a        UNION ALL.
229a0 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
229b0 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20  CT y FROM tab.  
229c0 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  **        UNION 
229d0 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ALL.  **        
229e0 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20  SELECT abs(z*2) 
229f0 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20  FROM tab2.  **  
22a00 20 20 20 29 20 57 48 45 52 45 20 61 21 3d 35 20     ) WHERE a!=5 
22a10 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a  ORDER BY 1.  **.
22a20 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64    ** Transformed
22a30 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   into:.  **.  **
22a40 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20       SELECT x+1 
22a50 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78  FROM tab WHERE x
22a60 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55  +1!=5.  **     U
22a70 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
22a80 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f    SELECT y+1 FRO
22a90 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b 31 21  M tab WHERE y+1!
22aa0 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f  =5.  **     UNIO
22ab0 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  N ALL.  **     S
22ac0 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31  ELECT abs(z*2)+1
22ad0 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45   FROM tab2 WHERE
22ae0 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20   abs(z*2)+1!=5. 
22af0 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59   **     ORDER BY
22b00 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20   1.  **.  ** We 
22b10 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63  call this the "c
22b20 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
22b30 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20   flattening"..  
22b40 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53  */.  for(pSub=pS
22b50 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62  ub->pPrior; pSub
22b60 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  ; pSub=pSub->pPr
22b70 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ior){.    Select
22b80 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72   *pNew;.    Expr
22b90 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
22ba0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
22bb0 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d    Expr *pLimit =
22bc0 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
22bd0 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d  Select *pPrior =
22be0 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
22bf0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
22c00 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30  .    p->pSrc = 0
22c10 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  ;.    p->pPrior 
22c20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d  = 0;.    p->pLim
22c30 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  it = 0;.    pNew
22c40 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
22c50 44 75 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20  Dup(db, p, 0);. 
22c60 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
22c70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f  Limit;.    p->pO
22c80 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
22c90 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d  y;.    p->pSrc =
22ca0 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70   pSrc;.    p->op
22cb0 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69   = TK_ALL;.    i
22cc0 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
22cd0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
22ce0 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73  pPrior;.    }els
22cf0 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  e{.      pNew->p
22d00 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
22d10 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72        if( pPrior
22d20 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74   ) pPrior->pNext
22d30 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70   = pNew;.      p
22d40 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a  New->pNext = p;.
22d50 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
22d60 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 53 45  = pNew;.      SE
22d70 4c 45 43 54 54 52 41 43 45 28 32 2c 70 50 61 72  LECTTRACE(2,pPar
22d80 73 65 2c 70 2c 28 22 63 6f 6d 70 6f 75 6e 64 2d  se,p,("compound-
22d90 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e  subquery flatten
22da0 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  er".            
22db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22dc0 20 20 22 20 63 72 65 61 74 65 73 20 25 75 20 61    " creates %u a
22dd0 73 20 70 65 65 72 5c 6e 22 2c 70 4e 65 77 2d 3e  s peer\n",pNew->
22de0 73 65 6c 49 64 29 29 3b 0a 20 20 20 20 7d 0a 20  selId));.    }. 
22df0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
22e00 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
22e10 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65   1;.  }..  /* Be
22e20 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74  gin flattening t
22e30 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72  he iFrom-th entr
22e40 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
22e50 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68  ause .  ** in th
22e60 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
22e70 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75   */.  pSub = pSu
22e80 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  b1 = pSubitem->p
22e90 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65  Select;..  /* De
22ea0 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73 69 65  lete the transie
22eb0 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
22ec0 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  re associated wi
22ed0 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  th the.  ** subq
22ee0 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  uery.  */.  sqli
22ef0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
22f00 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
22f10 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
22f20 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
22f30 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ->zName);.  sqli
22f40 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
22f50 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ubitem->zAlias);
22f60 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61  .  pSubitem->zDa
22f70 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53  tabase = 0;.  pS
22f80 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ubitem->zName = 
22f90 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  0;.  pSubitem->z
22fa0 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75  Alias = 0;.  pSu
22fb0 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  bitem->pSelect =
22fc0 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20   0;..  /* Defer 
22fd0 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62  deleting the Tab
22fe0 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69  le object associ
22ff0 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  ated with the.  
23000 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74 69  ** subquery unti
23010 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  l code generatio
23020 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65  n is.  ** comple
23030 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20  te, since there 
23040 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20  may still exist 
23050 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65  Expr.pTab entrie
23060 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65  s that.  ** refe
23070 72 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  r to the subquer
23080 79 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61  y even after fla
23090 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74  ttening.  Ticket
230a0 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a   #3346..  **.  *
230b0 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  * pSubitem->pTab
230c0 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e   is always non-N
230d0 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73 74  ULL by test rest
230e0 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65 73  rictions and tes
230f0 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20  ts above..  */. 
23100 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 75 62   if( ALWAYS(pSub
23110 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29  item->pTab!=0) )
23120 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
23130 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65  bToDel = pSubite
23140 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
23150 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 54 61 62   pTabToDel->nTab
23160 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Ref==1 ){.      
23170 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
23180 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
23190 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
231a0 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c  .      pTabToDel
231b0 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20  ->pNextZombie = 
231c0 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62  pToplevel->pZomb
231d0 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f  ieTab;.      pTo
231e0 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54  plevel->pZombieT
231f0 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a  ab = pTabToDel;.
23200 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23210 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 54 61 62   pTabToDel->nTab
23220 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  Ref--;.    }.   
23230 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20   pSubitem->pTab 
23240 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  = 0;.  }..  /* T
23250 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f  he following loo
23260 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  p runs once for 
23270 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61 20 63  each term in a c
23280 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
23290 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67  .  ** flattening
232a0 20 28 61 73 20 64 65 73 63 72 69 62 65 64 20 61   (as described a
232b0 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20 61 72  bove).  If we ar
232c0 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66 65 72  e doing a differ
232d0 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66  ent kind.  ** of
232e0 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61 20   flattening - a 
232f0 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68 65 72  flattening other
23300 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64   than a compound
23310 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65  -subquery flatte
23320 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e  ning -.  ** then
23330 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20   this loop only 
23340 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a  runs once..  **.
23350 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d    ** This loop m
23360 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68 65 20  oves all of the 
23370 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66  FROM elements of
23380 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e   the subquery in
23390 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  to the.  ** the 
233a0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
233b0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
233c0 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68   Before doing th
233d0 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a  is, remember.  *
233e0 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  * the cursor num
233f0 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67  ber for the orig
23400 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79  inal outer query
23410 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e   FROM element in
23420 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20  .  ** iParent.  
23430 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72 73  The iParent curs
23440 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  or will never be
23450 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75 65   used.  Subseque
23460 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c  nt code.  ** wil
23470 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f  l scan expressio
23480 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69  ns looking for i
23490 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65  Parent reference
234a0 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20  s and replace.  
234b0 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e  ** those referen
234c0 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73 73  ces with express
234d0 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76  ions that resolv
234e0 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  e to the subquer
234f0 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d  y FROM.  ** elem
23500 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20  ents we are now 
23510 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f  copying in..  */
23520 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74 3d 70  .  for(pParent=p
23530 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61 72 65  ; pParent; pPare
23540 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72 69  nt=pParent->pPri
23550 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e 70  or, pSub=pSub->p
23560 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20  Prior){.    int 
23570 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 75 38 20  nSubSrc;.    u8 
23580 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
23590 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62    pSubSrc = pSub
235a0 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46  ->pSrc;     /* F
235b0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 73 75  ROM clause of su
235c0 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53  bquery */.    nS
235d0 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d  ubSrc = pSubSrc-
235e0 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65  >nSrc;  /* Numbe
235f0 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 73 75  r of terms in su
23600 62 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75  bquery FROM clau
23610 73 65 20 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d  se */.    pSrc =
23620 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20   pParent->pSrc; 
23630 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
23640 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
23650 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66  query */..    if
23660 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20  ( pSrc ){.      
23670 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d  assert( pParent=
23680 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72 73 74 20  =p );  /* First 
23690 74 69 6d 65 20 74 68 72 6f 75 67 68 20 74 68 65  time through the
236a0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a   loop */.      j
236b0 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74  ointype = pSubit
236c0 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b  em->fg.jointype;
236d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
236e0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
236f0 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20  t!=p );  /* 2nd 
23700 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 74  and subsequent t
23710 69 6d 65 73 20 74 68 72 6f 75 67 68 20 74 68 65  imes through the
23720 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70   loop */.      p
23730 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
23740 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
23750 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  e, 0, 0, 0);.   
23760 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29     if( pSrc==0 )
23770 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 50   break;.      pP
23780 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53  arent->pSrc = pS
23790 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
237a0 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75  * The subquery u
237b0 73 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f  ses a single slo
237c0 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
237d0 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
237e0 72 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20  r.    ** query. 
237f0 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
23800 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
23810 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74  ne element in it
23820 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20  s FROM clause,. 
23830 20 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e     ** then expan
23840 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
23850 79 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20  y to make space 
23860 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61  for it to hold a
23870 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20  ll elements.    
23880 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
23890 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ry..    **.    *
238a0 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
238b0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45  *.    **    SELE
238c0 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20  CT * FROM tabA, 
238d0 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73  (SELECT * FROM s
238e0 75 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42  ub1, sub2), tabB
238f0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
23900 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
23910 68 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69  has 3 slots in i
23920 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  ts FROM clause. 
23930 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65   One slot of the
23940 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
23950 65 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20  ery (the middle 
23960 73 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79  slot) is used by
23970 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
23980 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20  The next.    ** 
23990 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69  block of code wi
239a0 6c 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75  ll expand the ou
239b0 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 63  ter query FROM c
239c0 6c 61 75 73 65 20 74 6f 20 34 20 73 6c 6f 74 73  lause to 4 slots
239d0 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6d 69 64  ..    ** The mid
239e0 64 6c 65 20 73 6c 6f 74 20 69 73 20 65 78 70 61  dle slot is expa
239f0 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74  nded to two slot
23a00 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61  s in order to ma
23a10 6b 65 20 73 70 61 63 65 0a 20 20 20 20 2a 2a 20  ke space.    ** 
23a20 66 6f 72 20 74 68 65 20 74 77 6f 20 65 6c 65 6d  for the two elem
23a30 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ents in the FROM
23a40 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
23a50 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  ubquery..    */.
23a60 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e      if( nSubSrc>
23a70 31 20 29 7b 0a 20 20 20 20 20 20 70 53 72 63 20  1 ){.      pSrc 
23a80 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
23a90 45 6e 6c 61 72 67 65 28 70 50 61 72 73 65 2c 20  Enlarge(pParse, 
23aa0 70 53 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c  pSrc, nSubSrc-1,
23ab0 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20  iFrom+1);.      
23ac0 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 62 72  if( pSrc==0 ) br
23ad0 65 61 6b 3b 0a 20 20 20 20 20 20 70 50 61 72 65  eak;.      pPare
23ae0 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b  nt->pSrc = pSrc;
23af0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
23b00 72 61 6e 73 66 65 72 20 74 68 65 20 46 52 4f 4d  ransfer the FROM
23b10 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 72   clause terms fr
23b20 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72 79 20  om the subquery 
23b30 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  into the.    ** 
23b40 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20  outer query..   
23b50 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
23b60 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29   i<nSubSrc; i++)
23b70 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49  {.      sqlite3I
23b80 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
23b90 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d  pSrc->a[i+iFrom]
23ba0 2e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 20 20  .pUsing);.      
23bb0 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b  assert( pSrc->a[
23bc0 69 2b 69 46 72 6f 6d 5d 2e 66 67 2e 69 73 54 61  i+iFrom].fg.isTa
23bd0 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  bFunc==0 );.    
23be0 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f    pSrc->a[i+iFro
23bf0 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b  m] = pSubSrc->a[
23c00 69 5d 3b 0a 20 20 20 20 20 20 69 4e 65 77 50 61  i];.      iNewPa
23c10 72 65 6e 74 20 3d 20 70 53 75 62 53 72 63 2d 3e  rent = pSubSrc->
23c20 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[i].iCursor;.  
23c30 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
23c40 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
23c50 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
23c60 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
23c70 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66  pSrc->a[iFrom].f
23c80 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69  g.jointype = joi
23c90 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a  ntype;.  .    /*
23ca0 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74   Now begin subst
23cb0 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79  ituting subquery
23cc0 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72   result set expr
23cd0 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20  essions for .   
23ce0 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74   ** references t
23cf0 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e  o the iParent in
23d00 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
23d10 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  ..    ** .    **
23d20 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
23d30 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  .    **   SELECT
23d40 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20   a+5, b*10 FROM 
23d50 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61  (SELECT x*3 AS a
23d60 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d  , y+10 AS b FROM
23d70 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a   t1) WHERE a>b;.
23d80 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20      **   \      
23d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
23da0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75  _____________ su
23db0 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f  bquery _________
23dc0 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20  _/          /.  
23dd0 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f    **    \_______
23de0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f  ______________ o
23df0 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f  uter query _____
23e00 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23e10 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a  _________/.    *
23e20 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b  *.    ** We look
23e30 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73   at every expres
23e40 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65  sion in the oute
23e50 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72  r query and ever
23e60 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20  y place we see. 
23e70 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62     ** "a" we sub
23e80 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e  stitute "x*3" an
23e90 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
23ea0 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73   see "b" we subs
23eb0 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20  titute "y+10".. 
23ec0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
23ed0 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
23ee0 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
23ef0 20 70 6f 69 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d   point, any non-
23f00 7a 65 72 6f 20 69 4f 72 64 65 72 42 79 43 6f 6c  zero iOrderByCol
23f10 20 76 61 6c 75 65 73 20 69 6e 64 69 63 61 74 65   values indicate
23f20 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
23f30 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 6c 75  ** ORDER BY colu
23f40 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  mn expression is
23f50 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 74 68   identical to th
23f60 65 20 69 4f 72 64 65 72 42 79 43 6f 6c 27 74 68  e iOrderByCol'th
23f70 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73  .      ** expres
23f80 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 62 79  sion returned by
23f90 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
23fa0 74 20 70 53 75 62 2e 20 53 69 6e 63 65 20 74 68  t pSub. Since th
23fb0 65 73 65 20 76 61 6c 75 65 73 0a 20 20 20 20 20  ese values.     
23fc0 20 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 63 65 73   ** do not neces
23fd0 73 61 72 69 6c 79 20 63 6f 72 72 65 73 70 6f 6e  sarily correspon
23fe0 64 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  d to columns in 
23ff0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
24000 20 70 50 61 72 65 6e 74 2c 0a 20 20 20 20 20 20   pParent,.      
24010 2a 2a 20 7a 65 72 6f 20 74 68 65 6d 20 62 65 66  ** zero them bef
24020 6f 72 65 20 74 72 61 6e 73 66 65 72 69 6e 67 20  ore transfering 
24030 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
24040 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  use..      **.  
24050 20 20 20 20 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67      ** Not doing
24060 20 74 68 69 73 20 6d 61 79 20 63 61 75 73 65 20   this may cause 
24070 61 6e 20 65 72 72 6f 72 20 69 66 20 61 20 73 75  an error if a su
24080 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f  bsequent call to
24090 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66   this.      ** f
240a0 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
240b0 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 20 63 6f   to flatten a co
240c0 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79  mpound sub-query
240d0 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 0a 20 20   into pParent.  
240e0 20 20 20 20 2a 2a 20 28 74 68 65 20 6f 6e 6c 79      ** (the only
240f0 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61   way this can ha
24100 70 70 65 6e 20 69 73 20 69 66 20 74 68 65 20 63  ppen is if the c
24110 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72  ompound sub-quer
24120 79 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 75  y is.      ** cu
24130 72 72 65 6e 74 6c 79 20 70 61 72 74 20 6f 66 20  rrently part of 
24140 70 53 75 62 2d 3e 70 53 72 63 29 2e 20 53 65 65  pSub->pSrc). See
24150 20 74 69 63 6b 65 74 20 5b 64 31 31 61 36 65 39   ticket [d11a6e9
24160 30 38 66 5d 2e 20 20 2a 2f 0a 20 20 20 20 20 20  08f].  */.      
24170 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
24180 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65  By = pSub->pOrde
24190 72 42 79 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  rBy;.      for(i
241a0 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
241b0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
241c0 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61       pOrderBy->a
241d0 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
241e0 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  Col = 0;.      }
241f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
24200 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
24210 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ==0 );.      pPa
24220 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d  rent->pOrderBy =
24230 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20   pOrderBy;.     
24240 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
24250 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
24260 57 68 65 72 65 20 3d 20 70 53 75 62 2d 3e 70 57  Where = pSub->pW
24270 68 65 72 65 3b 0a 20 20 20 20 70 53 75 62 2d 3e  here;.    pSub->
24280 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20  pWhere = 0;.    
24290 69 66 28 20 69 73 4c 65 66 74 4a 6f 69 6e 3e 30  if( isLeftJoin>0
242a0 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4a 6f 69   ){.      setJoi
242b0 6e 45 78 70 72 28 70 57 68 65 72 65 2c 20 69 4e  nExpr(pWhere, iN
242c0 65 77 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d  ewParent);.    }
242d0 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57  .    pParent->pW
242e0 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
242f0 70 72 41 6e 64 28 64 62 2c 20 70 57 68 65 72 65  prAnd(db, pWhere
24300 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72  , pParent->pWher
24310 65 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  e);.    if( db->
24320 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
24330 29 7b 0a 20 20 20 20 20 20 53 75 62 73 74 43 6f  ){.      SubstCo
24340 6e 74 65 78 74 20 78 3b 0a 20 20 20 20 20 20 78  ntext x;.      x
24350 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
24360 3b 0a 20 20 20 20 20 20 78 2e 69 54 61 62 6c 65  ;.      x.iTable
24370 20 3d 20 69 50 61 72 65 6e 74 3b 0a 20 20 20 20   = iParent;.    
24380 20 20 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20    x.iNewTable = 
24390 69 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20 20 20  iNewParent;.    
243a0 20 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20 3d    x.isLeftJoin =
243b0 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 0a 20 20 20   isLeftJoin;.   
243c0 20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20 70 53     x.pEList = pS
243d0 75 62 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  ub->pEList;.    
243e0 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 26 78    substSelect(&x
243f0 2c 20 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20  , pParent, 0);. 
24400 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54     }.  .    /* T
24410 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65  he flattened que
24420 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69  ry is distinct i
24430 66 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e  f either the inn
24440 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  er or the.    **
24450 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
24460 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a  distinct. .    *
24470 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73  /.    pParent->s
24480 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d  elFlags |= pSub-
24490 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
244a0 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20  istinct;.  .    
244b0 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  /*.    ** SELECT
244c0 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43   ... FROM (SELEC
244d0 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46  T ... LIMIT a OF
244e0 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20  FSET b) LIMIT x 
244f0 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a  OFFSET y;.    **
24500 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74  .    ** One is t
24510 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f  empted to try to
24520 20 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20   add a and b to 
24530 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69  combine the limi
24540 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20  ts.  But this.  
24550 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f    ** does not wo
24560 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d  rk if either lim
24570 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a  it is negative..
24580 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
24590 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  Sub->pLimit ){. 
245a0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c       pParent->pL
245b0 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69  imit = pSub->pLi
245c0 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75 62 2d  mit;.      pSub-
245d0 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
245e0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
245f0 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68  ially, delete wh
24600 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68  at is left of th
24610 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72  e subquery and r
24620 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65  eturn.  ** succe
24630 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ss..  */.  sqlit
24640 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
24650 62 2c 20 70 53 75 62 31 29 3b 0a 0a 23 69 66 20  b, pSub1);..#if 
24660 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
24670 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LED.  if( sqlite
24680 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
24690 78 31 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45  x100 ){.    SELE
246a0 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50  CTTRACE(0x100,pP
246b0 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 66  arse,p,("After f
246c0 6c 61 74 74 65 6e 69 6e 67 3a 5c 6e 22 29 29 3b  lattening:\n"));
246d0 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
246e0 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
246f0 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
24700 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
24710 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
24720 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
24730 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
24740 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
24750 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  VIEW) */../*.** 
24760 41 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 6b  A structure to k
24770 65 65 70 20 74 72 61 63 6b 20 6f 66 20 61 6c 6c  eep track of all
24780 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76   of the column v
24790 61 6c 75 65 73 20 74 68 61 74 20 61 72 65 20 66  alues that are f
247a0 69 78 65 64 20 74 6f 0a 2a 2a 20 61 20 6b 6e 6f  ixed to.** a kno
247b0 77 6e 20 76 61 6c 75 65 20 64 75 65 20 74 6f 20  wn value due to 
247c0 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
247d0 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20  straints of the 
247e0 66 6f 72 6d 20 43 4f 4c 55 4d 4e 3d 56 41 4c 55  form COLUMN=VALU
247f0 45 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  E..*/.typedef st
24800 72 75 63 74 20 57 68 65 72 65 43 6f 6e 73 74 20  ruct WhereConst 
24810 57 68 65 72 65 43 6f 6e 73 74 3b 0a 73 74 72 75  WhereConst;.stru
24820 63 74 20 57 68 65 72 65 43 6f 6e 73 74 20 7b 0a  ct WhereConst {.
24830 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
24840 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
24850 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ntext */.  int n
24860 43 6f 6e 73 74 3b 20 20 20 20 20 20 2f 2a 20 4e  Const;      /* N
24870 75 6d 62 65 72 20 66 6f 72 20 43 4f 4c 55 4d 4e  umber for COLUMN
24880 3d 43 4f 4e 53 54 41 4e 54 20 74 65 72 6d 73 20  =CONSTANT terms 
24890 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 6e 67 3b 20  */.  int nChng; 
248a0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
248b0 6f 66 20 74 69 6d 65 73 20 61 20 63 6f 6e 73 74  of times a const
248c0 61 6e 74 20 69 73 20 70 72 6f 70 61 67 61 74 65  ant is propagate
248d0 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 61 70  d */.  Expr **ap
248e0 45 78 70 72 3b 20 20 20 2f 2a 20 5b 69 2a 32 5d  Expr;   /* [i*2]
248f0 20 69 73 20 43 4f 4c 55 4d 4e 20 61 6e 64 20 5b   is COLUMN and [
24900 69 2a 32 2b 31 5d 20 69 73 20 56 41 4c 55 45 20  i*2+1] is VALUE 
24910 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  */.};../*.** Add
24920 20 61 20 6e 65 77 20 65 6e 74 72 79 20 74 6f 20   a new entry to 
24930 74 68 65 20 70 43 6f 6e 73 74 20 6f 62 6a 65 63  the pConst objec
24940 74 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e  t.  Except, do n
24950 6f 74 20 61 64 64 20 64 75 70 6c 69 63 61 74 65  ot add duplicate
24960 0a 2a 2a 20 70 43 6f 6c 75 6d 6e 20 65 6e 74 69  .** pColumn enti
24970 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  res..*/.static v
24980 6f 69 64 20 63 6f 6e 73 74 49 6e 73 65 72 74 28  oid constInsert(
24990 0a 20 20 57 68 65 72 65 43 6f 6e 73 74 20 2a 70  .  WhereConst *p
249a0 43 6f 6e 73 74 2c 20 20 20 20 20 20 2f 2a 20 54  Const,      /* T
249b0 68 65 20 57 68 65 72 65 43 6f 6e 73 74 20 69 6e  he WhereConst in
249c0 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20  to which we are 
249d0 69 6e 73 65 72 74 69 6e 67 20 2a 2f 0a 20 20 45  inserting */.  E
249e0 78 70 72 20 2a 70 43 6f 6c 75 6d 6e 2c 20 20 20  xpr *pColumn,   
249f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 43          /* The C
24a00 4f 4c 55 4d 4e 20 70 61 72 74 20 6f 66 20 74 68  OLUMN part of th
24a10 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  e constraint */.
24a20 20 20 45 78 70 72 20 2a 70 56 61 6c 75 65 20 20    Expr *pValue  
24a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
24a40 65 20 56 41 4c 55 45 20 70 61 72 74 20 6f 66 20  e VALUE part of 
24a50 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  the constraint *
24a60 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
24a70 61 73 73 65 72 74 28 20 70 43 6f 6c 75 6d 6e 2d  assert( pColumn-
24a80 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
24a90 3b 0a 0a 20 20 2f 2a 20 32 30 31 38 2d 31 30 2d  ;..  /* 2018-10-
24aa0 32 35 20 74 69 63 6b 65 74 20 5b 63 66 35 65 64  25 ticket [cf5ed
24ab0 32 30 66 5d 0a 20 20 2a 2a 20 4d 61 6b 65 20 73  20f].  ** Make s
24ac0 75 72 65 20 74 68 65 20 73 61 6d 65 20 70 43 6f  ure the same pCo
24ad0 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 69 6e 73 65  lumn is not inse
24ae0 72 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f  rted more than o
24af0 6e 63 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  nce */.  for(i=0
24b00 3b 20 69 3c 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e  ; i<pConst->nCon
24b10 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  st; i++){.    co
24b20 6e 73 74 20 45 78 70 72 20 2a 70 45 78 70 72 20  nst Expr *pExpr 
24b30 3d 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72  = pConst->apExpr
24b40 5b 69 2a 32 5d 3b 0a 20 20 20 20 61 73 73 65 72  [i*2];.    asser
24b50 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
24b60 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 69  _COLUMN );.    i
24b70 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
24b80 3d 3d 70 43 6f 6c 75 6d 6e 2d 3e 69 54 61 62 6c  ==pColumn->iTabl
24b90 65 0a 20 20 20 20 20 26 26 20 70 45 78 70 72 2d  e.     && pExpr-
24ba0 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 43 6f 6c 75 6d  >iColumn==pColum
24bb0 6e 2d 3e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 29  n->iColumn.    )
24bc0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 20  {.      return; 
24bd0 20 2f 2a 20 41 6c 72 65 61 64 79 20 70 72 65 73   /* Already pres
24be0 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 77 69 74  ent.  Return wit
24bf0 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
24c00 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  ing. */.    }.  
24c10 7d 0a 0a 20 20 70 43 6f 6e 73 74 2d 3e 6e 43 6f  }..  pConst->nCo
24c20 6e 73 74 2b 2b 3b 0a 20 20 70 43 6f 6e 73 74 2d  nst++;.  pConst-
24c30 3e 61 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  >apExpr = sqlite
24c40 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  3DbReallocOrFree
24c50 28 70 43 6f 6e 73 74 2d 3e 70 50 61 72 73 65 2d  (pConst->pParse-
24c60 3e 64 62 2c 20 70 43 6f 6e 73 74 2d 3e 61 70 45  >db, pConst->apE
24c70 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
24c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
24c90 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2a 32 2a 73  onst->nConst*2*s
24ca0 69 7a 65 6f 66 28 45 78 70 72 2a 29 29 3b 0a 20  izeof(Expr*));. 
24cb0 20 69 66 28 20 70 43 6f 6e 73 74 2d 3e 61 70 45   if( pConst->apE
24cc0 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43  xpr==0 ){.    pC
24cd0 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 20 3d 20 30  onst->nConst = 0
24ce0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
24cf0 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
24d00 74 79 28 70 56 61 6c 75 65 2c 20 45 50 5f 46 69  ty(pValue, EP_Fi
24d10 78 65 64 43 6f 6c 29 20 29 20 70 56 61 6c 75 65  xedCol) ) pValue
24d20 20 3d 20 70 56 61 6c 75 65 2d 3e 70 4c 65 66 74   = pValue->pLeft
24d30 3b 0a 20 20 20 20 70 43 6f 6e 73 74 2d 3e 61 70  ;.    pConst->ap
24d40 45 78 70 72 5b 70 43 6f 6e 73 74 2d 3e 6e 43 6f  Expr[pConst->nCo
24d50 6e 73 74 2a 32 2d 32 5d 20 3d 20 70 43 6f 6c 75  nst*2-2] = pColu
24d60 6d 6e 3b 0a 20 20 20 20 70 43 6f 6e 73 74 2d 3e  mn;.    pConst->
24d70 61 70 45 78 70 72 5b 70 43 6f 6e 73 74 2d 3e 6e  apExpr[pConst->n
24d80 43 6f 6e 73 74 2a 32 2d 31 5d 20 3d 20 70 56 61  Const*2-1] = pVa
24d90 6c 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  lue;.  }.}../*.*
24da0 2a 20 46 69 6e 64 20 61 6c 6c 20 74 65 72 6d 73  * Find all terms
24db0 20 6f 66 20 43 4f 4c 55 4d 4e 3d 56 41 4c 55 45   of COLUMN=VALUE
24dc0 20 6f 72 20 56 41 4c 55 45 3d 43 4f 4c 55 4d 4e   or VALUE=COLUMN
24dd0 20 69 6e 20 70 45 78 70 72 20 77 68 65 72 65 20   in pExpr where 
24de0 56 41 4c 55 45 0a 2a 2a 20 69 73 20 61 20 63 6f  VALUE.** is a co
24df0 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f  nstant expressio
24e00 6e 20 61 6e 64 20 77 68 65 72 65 20 74 68 65 20  n and where the 
24e10 74 65 72 6d 20 6d 75 73 74 20 62 65 20 74 72 75  term must be tru
24e20 65 20 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20  e because it.** 
24e30 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 41  is part of the A
24e40 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72  ND-connected ter
24e50 6d 73 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ms of the expres
24e60 73 69 6f 6e 2e 20 20 46 6f 72 20 65 61 63 68 20  sion.  For each 
24e70 74 65 72 6d 0a 2a 2a 20 66 6f 75 6e 64 2c 20 61  term.** found, a
24e80 64 64 20 69 74 20 74 6f 20 74 68 65 20 70 43 6f  dd it to the pCo
24e90 6e 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  nst structure..*
24ea0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69  /.static void fi
24eb0 6e 64 43 6f 6e 73 74 49 6e 57 68 65 72 65 28 57  ndConstInWhere(W
24ec0 68 65 72 65 43 6f 6e 73 74 20 2a 70 43 6f 6e 73  hereConst *pCons
24ed0 74 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  t, Expr *pExpr){
24ee0 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
24ef0 20 2a 70 4c 65 66 74 3b 0a 20 20 69 66 28 20 70   *pLeft;.  if( p
24f00 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
24f10 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
24f20 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
24f30 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65  P_FromJoin) ) re
24f40 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70  turn;.  if( pExp
24f50 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b  r->op==TK_AND ){
24f60 0a 20 20 20 20 66 69 6e 64 43 6f 6e 73 74 49 6e  .    findConstIn
24f70 57 68 65 72 65 28 70 43 6f 6e 73 74 2c 20 70 45  Where(pConst, pE
24f80 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
24f90 20 20 66 69 6e 64 43 6f 6e 73 74 49 6e 57 68 65    findConstInWhe
24fa0 72 65 28 70 43 6f 6e 73 74 2c 20 70 45 78 70 72  re(pConst, pExpr
24fb0 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 72 65  ->pLeft);.    re
24fc0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
24fd0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51  pExpr->op!=TK_EQ
24fe0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 52 69   ) return;.  pRi
24ff0 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69  ght = pExpr->pRi
25000 67 68 74 3b 0a 20 20 70 4c 65 66 74 20 3d 20 70  ght;.  pLeft = p
25010 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 61  Expr->pLeft;.  a
25020 73 73 65 72 74 28 20 70 52 69 67 68 74 21 3d 30  ssert( pRight!=0
25030 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c   );.  assert( pL
25040 65 66 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  eft!=0 );.  if( 
25050 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43  pRight->op==TK_C
25060 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 21 45 78 70  OLUMN.   && !Exp
25070 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 52 69  rHasProperty(pRi
25080 67 68 74 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c  ght, EP_FixedCol
25090 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45  ).   && sqlite3E
250a0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 4c  xprIsConstant(pL
250b0 65 66 74 29 0a 20 20 20 26 26 20 73 71 6c 69 74  eft).   && sqlit
250c0 65 33 49 73 42 69 6e 61 72 79 28 73 71 6c 69 74  e3IsBinary(sqlit
250d0 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
250e0 6f 6c 6c 53 65 71 28 70 43 6f 6e 73 74 2d 3e 70  ollSeq(pConst->p
250f0 50 61 72 73 65 2c 70 4c 65 66 74 2c 70 52 69 67  Parse,pLeft,pRig
25100 68 74 29 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f  ht)).  ){.    co
25110 6e 73 74 49 6e 73 65 72 74 28 70 43 6f 6e 73 74  nstInsert(pConst
25120 2c 20 70 52 69 67 68 74 2c 20 70 4c 65 66 74 29  , pRight, pLeft)
25130 3b 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20  ;.  }else.  if( 
25140 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pLeft->op==TK_CO
25150 4c 55 4d 4e 0a 20 20 20 26 26 20 21 45 78 70 72  LUMN.   && !Expr
25160 48 61 73 50 72 6f 70 65 72 74 79 28 70 4c 65 66  HasProperty(pLef
25170 74 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 0a  t, EP_FixedCol).
25180 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
25190 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 52 69 67  rIsConstant(pRig
251a0 68 74 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65  ht).   && sqlite
251b0 33 49 73 42 69 6e 61 72 79 28 73 71 6c 69 74 65  3IsBinary(sqlite
251c0 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
251d0 6c 6c 53 65 71 28 70 43 6f 6e 73 74 2d 3e 70 50  llSeq(pConst->pP
251e0 61 72 73 65 2c 70 4c 65 66 74 2c 70 52 69 67 68  arse,pLeft,pRigh
251f0 74 29 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e  t)).  ){.    con
25200 73 74 49 6e 73 65 72 74 28 70 43 6f 6e 73 74 2c  stInsert(pConst,
25210 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b   pLeft, pRight);
25220 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
25230 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72 20 65  is is a Walker e
25240 78 70 72 65 73 73 69 6f 6e 20 63 61 6c 6c 62 61  xpression callba
25250 63 6b 2e 20 20 70 45 78 70 72 20 69 73 20 61 20  ck.  pExpr is a 
25260 63 61 6e 64 69 64 61 74 65 20 65 78 70 72 65 73  candidate expres
25270 73 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 72 65  sion.** to be re
25280 70 6c 61 63 65 64 20 62 79 20 61 20 76 61 6c 75  placed by a valu
25290 65 2e 20 20 49 66 20 70 45 78 70 72 20 69 73 20  e.  If pExpr is 
252a0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6f 6e  equivalent to on
252b0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75  e of the.** colu
252c0 6d 6e 73 20 6e 61 6d 65 64 20 69 6e 20 70 57 61  mns named in pWa
252d0 6c 6b 65 72 2d 3e 75 2e 70 43 6f 6e 73 74 2c 20  lker->u.pConst, 
252e0 74 68 65 6e 20 6f 76 65 72 77 72 69 74 65 20 69  then overwrite i
252f0 74 20 77 69 74 68 20 69 74 73 0a 2a 2a 20 63 6f  t with its.** co
25300 72 72 65 73 70 6f 6e 64 69 6e 67 20 76 61 6c 75  rresponding valu
25310 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
25320 20 70 72 6f 70 61 67 61 74 65 43 6f 6e 73 74 61   propagateConsta
25330 6e 74 45 78 70 72 52 65 77 72 69 74 65 28 57 61  ntExprRewrite(Wa
25340 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
25350 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
25360 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 43 6f 6e  nt i;.  WhereCon
25370 73 74 20 2a 70 43 6f 6e 73 74 3b 0a 20 20 69 66  st *pConst;.  if
25380 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
25390 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20  COLUMN ) return 
253a0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
253b0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
253c0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 69  rty(pExpr, EP_Fi
253d0 78 65 64 43 6f 6c 29 20 29 20 72 65 74 75 72 6e  xedCol) ) return
253e0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
253f0 20 70 43 6f 6e 73 74 20 3d 20 70 57 61 6c 6b 65   pConst = pWalke
25400 72 2d 3e 75 2e 70 43 6f 6e 73 74 3b 0a 20 20 66  r->u.pConst;.  f
25410 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 73 74  or(i=0; i<pConst
25420 2d 3e 6e 43 6f 6e 73 74 3b 20 69 2b 2b 29 7b 0a  ->nConst; i++){.
25430 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 75 6d      Expr *pColum
25440 6e 20 3d 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78  n = pConst->apEx
25450 70 72 5b 69 2a 32 5d 3b 0a 20 20 20 20 69 66 28  pr[i*2];.    if(
25460 20 70 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 20   pColumn==pExpr 
25470 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
25480 69 66 28 20 70 43 6f 6c 75 6d 6e 2d 3e 69 54 61  if( pColumn->iTa
25490 62 6c 65 21 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble!=pExpr->iTab
254a0 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  le ) continue;. 
254b0 20 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e 2d 3e     if( pColumn->
254c0 69 43 6f 6c 75 6d 6e 21 3d 70 45 78 70 72 2d 3e  iColumn!=pExpr->
254d0 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e  iColumn ) contin
254e0 75 65 3b 0a 20 20 20 20 2f 2a 20 41 20 6d 61 74  ue;.    /* A mat
254f0 63 68 20 69 73 20 66 6f 75 6e 64 2e 20 20 41 64  ch is found.  Ad
25500 64 20 74 68 65 20 45 50 5f 46 69 78 65 64 43 6f  d the EP_FixedCo
25510 6c 20 70 72 6f 70 65 72 74 79 20 2a 2f 0a 20 20  l property */.  
25520 20 20 70 43 6f 6e 73 74 2d 3e 6e 43 68 6e 67 2b    pConst->nChng+
25530 2b 3b 0a 20 20 20 20 45 78 70 72 43 6c 65 61 72  +;.    ExprClear
25540 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
25550 45 50 5f 4c 65 61 66 29 3b 0a 20 20 20 20 45 78  EP_Leaf);.    Ex
25560 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
25570 78 70 72 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c  xpr, EP_FixedCol
25580 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
25590 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 29  Expr->pLeft==0 )
255a0 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65  ;.    pExpr->pLe
255b0 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
255c0 44 75 70 28 70 43 6f 6e 73 74 2d 3e 70 50 61 72  Dup(pConst->pPar
255d0 73 65 2d 3e 64 62 2c 20 70 43 6f 6e 73 74 2d 3e  se->db, pConst->
255e0 61 70 45 78 70 72 5b 69 2a 32 2b 31 5d 2c 20 30  apExpr[i*2+1], 0
255f0 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
25600 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50  }.  return WRC_P
25610 72 75 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rune;.}../*.** T
25620 68 65 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20  he WHERE-clause 
25630 63 6f 6e 73 74 61 6e 74 20 70 72 6f 70 61 67 61  constant propaga
25640 74 69 6f 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  tion optimizatio
25650 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
25660 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
25670 74 61 69 6e 73 20 74 65 72 6d 73 20 6f 66 20 74  tains terms of t
25680 68 65 20 66 6f 72 6d 20 43 4f 4c 55 4d 4e 3d 43  he form COLUMN=C
25690 4f 4e 53 54 41 4e 54 20 6f 72 0a 2a 2a 20 43 4f  ONSTANT or.** CO
256a0 4e 53 54 41 4e 54 3d 43 4f 4c 55 4d 4e 20 74 68  NSTANT=COLUMN th
256b0 61 74 20 6d 75 73 74 20 62 65 20 74 72 65 65 20  at must be tree 
256c0 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (in other words,
256d0 20 69 66 20 74 68 65 20 74 65 72 6d 73 20 74 6f   if the terms to
256e0 70 2d 6c 65 76 65 6c 0a 2a 2a 20 41 4e 44 2d 63  p-level.** AND-c
256f0 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20 74  onnected terms t
25700 68 61 74 20 61 72 65 20 6e 6f 74 20 70 61 72 74  hat are not part
25710 20 6f 66 20 61 20 4f 4e 20 63 6c 61 75 73 65 20   of a ON clause 
25720 66 72 6f 6d 20 61 20 4c 45 46 54 20 4a 4f 49 4e  from a LEFT JOIN
25730 29 0a 2a 2a 20 74 68 65 6e 20 74 68 72 6f 75 67  ).** then throug
25740 68 6f 75 74 20 74 68 65 20 71 75 65 72 79 20 72  hout the query r
25750 65 70 6c 61 63 65 20 61 6c 6c 20 6f 74 68 65 72  eplace all other
25760 20 6f 63 63 75 72 72 65 6e 63 65 73 20 6f 66 20   occurrences of 
25770 43 4f 4c 55 4d 4e 0a 2a 2a 20 77 69 74 68 20 43  COLUMN.** with C
25780 4f 4e 53 54 41 4e 54 20 77 69 74 68 69 6e 20 74  ONSTANT within t
25790 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
257a0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
257b0 6c 65 2c 20 74 68 65 20 71 75 65 72 79 3a 0a 2a  le, the query:.*
257c0 2a 0a 2a 2a 20 20 20 20 20 20 53 45 4c 45 43 54  *.**      SELECT
257d0 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20   * FROM t1, t2, 
257e0 74 33 20 57 48 45 52 45 20 74 31 2e 61 3d 33 39  t3 WHERE t1.a=39
257f0 20 41 4e 44 20 74 32 2e 62 3d 74 31 2e 61 20 41   AND t2.b=t1.a A
25800 4e 44 20 74 33 2e 63 3d 74 32 2e 62 0a 2a 2a 0a  ND t3.c=t2.b.**.
25810 2a 2a 20 49 73 20 74 72 61 6e 73 66 6f 72 6d 65  ** Is transforme
25820 64 20 69 6e 74 6f 0a 2a 2a 0a 2a 2a 20 20 20 20  d into.**.**    
25830 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
25840 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45  t1, t2, t3 WHERE
25850 20 74 31 2e 61 3d 33 39 20 41 4e 44 20 74 32 2e   t1.a=39 AND t2.
25860 62 3d 33 39 20 41 4e 44 20 74 33 2e 63 3d 33 39  b=39 AND t3.c=39
25870 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
25880 75 65 20 69 66 20 61 6e 79 20 74 72 61 6e 73 66  ue if any transf
25890 6f 72 6d 61 74 69 6f 6e 73 20 77 68 65 72 65 20  ormations where 
258a0 6d 61 64 65 20 61 6e 64 20 66 61 6c 73 65 20 69  made and false i
258b0 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70  f not..**.** Imp
258c0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65  lementation note
258d0 3a 20 20 43 6f 6e 73 74 61 6e 74 20 70 72 6f 70  :  Constant prop
258e0 61 67 61 74 69 6f 6e 20 69 73 20 74 72 69 63 6b  agation is trick
258f0 79 20 64 75 65 20 74 6f 20 61 66 66 69 6e 69 74  y due to affinit
25900 79 0a 2a 2a 20 61 6e 64 20 63 6f 6c 6c 61 74 69  y.** and collati
25910 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e 74 65  ng sequence inte
25920 72 61 63 74 69 6f 6e 73 2e 20 20 43 6f 6e 73 69  ractions.  Consi
25930 64 65 72 20 74 68 69 73 20 65 78 61 6d 70 6c 65  der this example
25940 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41 54  :.**.**    CREAT
25950 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54  E TABLE t1(a INT
25960 2c 62 20 54 45 58 54 29 3b 0a 2a 2a 20 20 20 20  ,b TEXT);.**    
25970 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
25980 41 4c 55 45 53 28 31 32 33 2c 27 30 31 32 33 27  ALUES(123,'0123'
25990 29 3b 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  );.**    SELECT 
259a0 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
259b0 61 3d 31 32 33 20 41 4e 44 20 62 3d 61 3b 0a 2a  a=123 AND b=a;.*
259c0 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
259d0 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31 32  OM t1 WHERE a=12
259e0 33 20 41 4e 44 20 62 3d 31 32 33 3b 0a 2a 2a 0a  3 AND b=123;.**.
259f0 2a 2a 20 54 68 65 20 74 77 6f 20 53 45 4c 45 43  ** The two SELEC
25a00 54 20 73 74 61 74 65 6d 65 6e 74 73 20 61 62 6f  T statements abo
25a10 76 65 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e  ve should return
25a20 20 64 69 66 66 65 72 65 6e 74 20 61 6e 73 77 65   different answe
25a30 72 73 2e 20 20 62 3d 61 0a 2a 2a 20 69 73 20 61  rs.  b=a.** is a
25a40 6c 77 61 79 20 74 72 75 65 20 62 65 63 61 75 73  lway true becaus
25a50 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
25a60 20 75 73 65 73 20 6e 75 6d 65 72 69 63 20 61 66   uses numeric af
25a70 66 69 6e 69 74 79 2c 20 62 75 74 20 62 3d 31 32  finity, but b=12
25a80 33 0a 2a 2a 20 69 73 20 66 61 6c 73 65 20 62 65  3.** is false be
25a90 63 61 75 73 65 20 69 74 20 75 73 65 73 20 74 65  cause it uses te
25aa0 78 74 20 61 66 66 69 6e 69 74 79 20 61 6e 64 20  xt affinity and 
25ab0 27 30 31 32 33 27 20 69 73 20 6e 6f 74 20 74 68  '0123' is not th
25ac0 65 20 73 61 6d 65 20 61 73 20 27 31 32 33 27 2e  e same as '123'.
25ad0 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  .** To work arou
25ae0 6e 64 20 74 68 69 73 2c 20 74 68 65 20 65 78 70  nd this, the exp
25af0 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20  ression tree is 
25b00 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 68 61  not actually cha
25b10 6e 67 65 64 20 66 72 6f 6d 0a 2a 2a 20 22 62 3d  nged from.** "b=
25b20 61 22 20 74 6f 20 22 62 3d 31 32 33 22 20 62 75  a" to "b=123" bu
25b30 74 20 72 61 74 68 65 72 20 74 68 65 20 22 61 22  t rather the "a"
25b40 20 69 6e 20 22 62 3d 61 22 20 69 73 20 74 61 67   in "b=a" is tag
25b50 67 65 64 20 77 69 74 68 20 45 50 5f 46 69 78 65  ged with EP_Fixe
25b60 64 43 6f 6c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  dCol.** and the 
25b70 22 31 32 33 22 20 76 61 6c 75 65 20 69 73 20 68  "123" value is h
25b80 75 6e 67 20 6f 66 66 20 6f 66 20 74 68 65 20 70  ung off of the p
25b90 4c 65 66 74 20 70 6f 69 6e 74 65 72 2e 20 20 43  Left pointer.  C
25ba0 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a  ode generator.**
25bb0 20 72 6f 75 74 69 6e 65 73 20 6b 6e 6f 77 20 74   routines know t
25bc0 6f 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 63  o generate the c
25bd0 6f 6e 73 74 61 6e 74 20 22 31 32 33 22 20 69 6e  onstant "123" in
25be0 73 74 65 61 64 20 6f 66 20 6c 6f 6f 6b 69 6e 67  stead of looking
25bf0 20 75 70 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d   up the.** colum
25c00 6e 20 76 61 6c 75 65 2e 20 20 41 6c 73 6f 2c 20  n value.  Also, 
25c10 74 6f 20 61 76 6f 69 64 20 63 6f 6c 6c 61 74 69  to avoid collati
25c20 6f 6e 20 70 72 6f 62 6c 65 6d 73 2c 20 74 68 69  on problems, thi
25c30 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  s optimization i
25c40 73 0a 2a 2a 20 6f 6e 6c 79 20 61 74 74 65 6d 70  s.** only attemp
25c50 74 65 64 20 69 66 20 74 68 65 20 22 61 3d 31 32  ted if the "a=12
25c60 33 22 20 74 65 72 6d 20 75 73 65 73 20 74 68 65  3" term uses the
25c70 20 64 65 66 61 75 6c 74 20 42 49 4e 41 52 59 20   default BINARY 
25c80 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  collation..*/.st
25c90 61 74 69 63 20 69 6e 74 20 70 72 6f 70 61 67 61  atic int propaga
25ca0 74 65 43 6f 6e 73 74 61 6e 74 73 28 0a 20 20 50  teConstants(.  P
25cb0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
25cc0 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
25cd0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
25ce0 63 74 20 2a 70 20 20 20 20 20 20 20 20 2f 2a 20  ct *p        /* 
25cf0 54 68 65 20 71 75 65 72 79 20 69 6e 20 77 68 69  The query in whi
25d00 63 68 20 74 6f 20 70 72 6f 70 61 67 61 74 65 20  ch to propagate 
25d10 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 29 7b 0a  constants */.){.
25d20 20 20 57 68 65 72 65 43 6f 6e 73 74 20 78 3b 0a    WhereConst x;.
25d30 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 69 6e    Walker w;.  in
25d40 74 20 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 78  t nChng = 0;.  x
25d50 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
25d60 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 78 2e 6e 43  ;.  do{.    x.nC
25d70 6f 6e 73 74 20 3d 20 30 3b 0a 20 20 20 20 78 2e  onst = 0;.    x.
25d80 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 78  nChng = 0;.    x
25d90 2e 61 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20  .apExpr = 0;.   
25da0 20 66 69 6e 64 43 6f 6e 73 74 49 6e 57 68 65 72   findConstInWher
25db0 65 28 26 78 2c 20 70 2d 3e 70 57 68 65 72 65 29  e(&x, p->pWhere)
25dc0 3b 0a 20 20 20 20 69 66 28 20 78 2e 6e 43 6f 6e  ;.    if( x.nCon
25dd0 73 74 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  st ){.      mems
25de0 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&w, 0, sizeof
25df0 28 77 29 29 3b 0a 20 20 20 20 20 20 77 2e 70 50  (w));.      w.pP
25e00 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
25e10 20 20 20 20 20 77 2e 78 45 78 70 72 43 61 6c 6c       w.xExprCall
25e20 62 61 63 6b 20 3d 20 70 72 6f 70 61 67 61 74 65  back = propagate
25e30 43 6f 6e 73 74 61 6e 74 45 78 70 72 52 65 77 72  ConstantExprRewr
25e40 69 74 65 3b 0a 20 20 20 20 20 20 77 2e 78 53 65  ite;.      w.xSe
25e50 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
25e60 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b  qlite3SelectWalk
25e70 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 77 2e 78 53  Noop;.      w.xS
25e80 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
25e90 20 30 3b 0a 20 20 20 20 20 20 77 2e 77 61 6c 6b   0;.      w.walk
25ea0 65 72 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 20  erDepth = 0;.   
25eb0 20 20 20 77 2e 75 2e 70 43 6f 6e 73 74 20 3d 20     w.u.pConst = 
25ec0 26 78 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  &x;.      sqlite
25ed0 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 2d  3WalkExpr(&w, p-
25ee0 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20  >pWhere);.      
25ef0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 78 2e  sqlite3DbFree(x.
25f00 70 50 61 72 73 65 2d 3e 64 62 2c 20 78 2e 61 70  pParse->db, x.ap
25f10 45 78 70 72 29 3b 0a 20 20 20 20 20 20 6e 43 68  Expr);.      nCh
25f20 6e 67 20 2b 3d 20 78 2e 6e 43 68 6e 67 3b 0a 20  ng += x.nChng;. 
25f30 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 78     }.  }while( x
25f40 2e 6e 43 68 6e 67 20 29 3b 20 20 0a 20 20 72 65  .nChng );  .  re
25f50 74 75 72 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 0a 23  turn nChng;.}..#
25f60 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
25f70 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
25f80 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
25f90 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
25fa0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65  /*.** Make copie
25fb0 73 20 6f 66 20 72 65 6c 65 76 61 6e 74 20 57 48  s of relevant WH
25fc0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
25fd0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
25fe0 65 72 79 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20  ery into.** the 
25ff0 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20  WHERE clause of 
26000 73 75 62 71 75 65 72 79 2e 20 20 45 78 61 6d 70  subquery.  Examp
26010 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  le:.**.**    SEL
26020 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45  ECT * FROM (SELE
26030 43 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41  CT a AS x, c-d A
26040 53 20 79 20 46 52 4f 4d 20 74 31 29 20 57 48 45  S y FROM t1) WHE
26050 52 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b  RE x=5 AND y=10;
26060 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 6f 72 6d  .**.** Transform
26070 65 64 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20  ed into:.**.**  
26080 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
26090 28 53 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20  (SELECT a AS x, 
260a0 63 2d 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31  c-d AS y FROM t1
260b0 20 57 48 45 52 45 20 61 3d 35 20 41 4e 44 20 63   WHERE a=5 AND c
260c0 2d 64 3d 31 30 29 0a 2a 2a 20 20 20 20 20 57 48  -d=10).**     WH
260d0 45 52 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30  ERE x=5 AND y=10
260e0 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 6f 70 65  ;.**.** The hope
260f0 20 69 73 20 74 68 61 74 20 74 68 65 20 74 65 72   is that the ter
26100 6d 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ms added to the 
26110 69 6e 6e 65 72 20 71 75 65 72 79 20 77 69 6c 6c  inner query will
26120 20 6d 61 6b 65 20 69 74 20 6d 6f 72 65 0a 2a 2a   make it more.**
26130 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a   efficient..**.*
26140 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * Do not attempt
26150 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
26160 6f 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 28  on if:.**.**   (
26170 31 29 20 28 2a 2a 20 54 68 69 73 20 72 65 73 74  1) (** This rest
26180 72 69 63 74 69 6f 6e 20 77 61 73 20 72 65 6d 6f  riction was remo
26190 76 65 64 20 6f 6e 20 32 30 31 37 2d 30 39 2d 32  ved on 2017-09-2
261a0 39 2e 20 20 57 65 20 75 73 65 64 20 74 6f 0a 2a  9.  We used to.*
261b0 2a 20 20 20 20 20 20 20 20 20 20 20 64 69 73 61  *           disa
261c0 6c 6c 6f 77 20 74 68 69 73 20 6f 70 74 69 6d 69  llow this optimi
261d0 7a 61 74 69 6f 6e 20 66 6f 72 20 61 67 67 72 65  zation for aggre
261e0 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73 2c  gate subqueries,
261f0 20 62 75 74 20 6e 6f 77 0a 2a 2a 20 20 20 20 20   but now.**     
26200 20 20 20 20 20 20 69 74 20 69 73 20 61 6c 6c 6f        it is allo
26210 77 65 64 20 62 79 20 70 75 74 74 69 6e 67 20 74  wed by putting t
26220 68 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f  he extra terms o
26230 6e 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61  n the HAVING cla
26240 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  use..**         
26250 20 20 54 68 65 20 61 64 64 65 64 20 48 41 56 49    The added HAVI
26260 4e 47 20 63 6c 61 75 73 65 20 69 73 20 70 6f 69  NG clause is poi
26270 6e 74 6c 65 73 73 20 69 66 20 74 68 65 20 73 75  ntless if the su
26280 62 71 75 65 72 79 20 6c 61 63 6b 73 0a 2a 2a 20  bquery lacks.** 
26290 20 20 20 20 20 20 20 20 20 20 61 20 47 52 4f 55            a GROU
262a0 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 42 75  P BY clause.  Bu
262b0 74 20 73 75 63 68 20 61 20 48 41 56 49 4e 47 20  t such a HAVING 
262c0 63 6c 61 75 73 65 20 69 73 20 61 6c 73 6f 20 68  clause is also h
262d0 61 72 6d 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20  armless.**      
262e0 20 20 20 20 20 73 6f 20 74 68 65 72 65 20 64 6f       so there do
262f0 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 74 6f  es not appear to
26300 20 62 65 20 61 6e 79 20 72 65 61 73 6f 6e 20 74   be any reason t
26310 6f 20 61 64 64 20 65 78 74 72 61 20 6c 6f 67 69  o add extra logi
26320 63 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 74  c.**           t
26330 6f 20 73 75 70 70 72 65 73 73 20 69 74 2e 20 2a  o suppress it. *
26340 2a 29 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 54  *).**.**   (2) T
26350 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69  he inner query i
26360 73 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  s the recursive 
26370 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 6d 6f 6e  part of a common
26380 20 74 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f   table expressio
26390 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 54  n..**.**   (3) T
263a0 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 68  he inner query h
263b0 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  as a LIMIT claus
263c0 65 20 28 73 69 6e 63 65 20 74 68 65 20 63 68 61  e (since the cha
263d0 6e 67 65 73 20 74 6f 20 74 68 65 20 57 48 45 52  nges to the WHER
263e0 45 0a 2a 2a 20 20 20 20 20 20 20 63 6c 61 75 73  E.**       claus
263f0 65 20 77 6f 75 6c 64 20 63 68 61 6e 67 65 20 74  e would change t
26400 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
26410 65 20 4c 49 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a 20  e LIMIT)..**.** 
26420 20 20 28 34 29 20 54 68 65 20 69 6e 6e 65 72 20    (4) The inner 
26430 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
26440 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
26450 4c 45 46 54 20 4a 4f 49 4e 20 61 6e 64 20 74 68  LEFT JOIN and th
26460 65 0a 2a 2a 20 20 20 20 20 20 20 65 78 70 72 65  e.**       expre
26470 73 73 69 6f 6e 20 74 6f 20 62 65 20 70 75 73 68  ssion to be push
26480 65 64 20 64 6f 77 6e 20 64 6f 65 73 20 6e 6f 74  ed down does not
26490 20 63 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20 4f   come from the O
264a0 4e 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20  N clause.**     
264b0 20 20 6f 6e 20 74 68 61 74 20 4c 45 46 54 20 4a    on that LEFT J
264c0 4f 49 4e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29  OIN..**.**   (5)
264d0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
264e0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69  e expression ori
264f0 67 69 6e 61 74 65 73 20 69 6e 20 74 68 65 20 4f  ginates in the O
26500 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
26510 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 61 20  e.**       of a 
26520 4c 45 46 54 20 4a 4f 49 4e 20 77 68 65 72 65 20  LEFT JOIN where 
26530 69 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 74  iCursor is not t
26540 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 74 61  he right-hand ta
26550 62 6c 65 20 6f 66 20 74 68 61 74 0a 2a 2a 20 20  ble of that.**  
26560 20 20 20 20 20 6c 65 66 74 20 6a 6f 69 6e 2e 20       left join. 
26570 20 41 6e 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a   An example:.**.
26580 2a 2a 20 20 20 20 20 20 20 20 20 20 20 53 45 4c  **           SEL
26590 45 43 54 20 2a 0a 2a 2a 20 20 20 20 20 20 20 20  ECT *.**        
265a0 20 20 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20     FROM (SELECT 
265b0 31 20 41 53 20 61 31 20 55 4e 49 4f 4e 20 41 4c  1 AS a1 UNION AL
265c0 4c 20 53 45 4c 45 43 54 20 32 29 20 41 53 20 61  L SELECT 2) AS a
265d0 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4a  a.**           J
265e0 4f 49 4e 20 28 53 45 4c 45 43 54 20 31 20 41 53  OIN (SELECT 1 AS
265f0 20 62 32 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45   b2 UNION ALL SE
26600 4c 45 43 54 20 32 29 20 41 53 20 62 62 20 4f 4e  LECT 2) AS bb ON
26610 20 28 61 31 3d 62 32 29 0a 2a 2a 20 20 20 20 20   (a1=b2).**     
26620 20 20 20 20 20 20 4c 45 46 54 20 4a 4f 49 4e 20        LEFT JOIN 
26630 28 53 45 4c 45 43 54 20 38 20 41 53 20 63 33 20  (SELECT 8 AS c3 
26640 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
26650 20 39 29 20 41 53 20 63 63 20 4f 4e 20 28 62 32   9) AS cc ON (b2
26660 3d 32 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  =2);.**.**      
26670 20 54 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73   The correct ans
26680 77 65 72 20 69 73 20 74 68 72 65 65 20 72 6f 77  wer is three row
26690 73 3a 20 20 28 31 2c 31 2c 4e 55 4c 4c 29 2c 28  s:  (1,1,NULL),(
266a0 32 2c 32 2c 38 29 2c 28 32 2c 32 2c 39 29 2e 0a  2,2,8),(2,2,9)..
266b0 2a 2a 20 20 20 20 20 20 20 42 75 74 20 69 66 20  **       But if 
266c0 74 68 65 20 28 62 32 3d 32 29 20 74 65 72 6d 20  the (b2=2) term 
266d0 77 65 72 65 20 74 6f 20 62 65 20 70 75 73 68 65  were to be pushe
266e0 64 20 64 6f 77 6e 20 69 6e 74 6f 20 74 68 65 20  d down into the 
266f0 62 62 20 73 75 62 71 75 65 72 79 2c 0a 2a 2a 20  bb subquery,.** 
26700 20 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 28        then the (
26710 31 2c 31 2c 4e 55 4c 4c 29 20 72 6f 77 20 77 6f  1,1,NULL) row wo
26720 75 6c 64 20 62 65 20 73 75 70 70 72 65 73 73 65  uld be suppresse
26730 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 54  d..**.**   (6) T
26740 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 66  he inner query f
26750 65 61 74 75 72 65 73 20 6f 6e 65 20 6f 72 20 6d  eatures one or m
26760 6f 72 65 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74  ore window-funct
26770 69 6f 6e 73 20 28 73 69 6e 63 65 20 0a 2a 2a 20  ions (since .** 
26780 20 20 20 20 20 20 63 68 61 6e 67 65 73 20 74 6f        changes to
26790 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
267a0 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 71  e of the inner q
267b0 75 65 72 79 20 63 6f 75 6c 64 20 63 68 61 6e 67  uery could chang
267c0 65 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20  e the .**       
267d0 77 69 6e 64 6f 77 20 6f 76 65 72 20 77 68 69 63  window over whic
267e0 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  h window functio
267f0 6e 73 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65  ns are calculate
26800 64 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  d)..**.** Return
26810 20 30 20 69 66 20 6e 6f 20 63 68 61 6e 67 65 73   0 if no changes
26820 20 61 72 65 20 6d 61 64 65 20 61 6e 64 20 6e 6f   are made and no
26830 6e 2d 7a 65 72 6f 20 69 66 20 6f 6e 65 20 6f 72  n-zero if one or
26840 20 6d 6f 72 65 20 57 48 45 52 45 20 63 6c 61 75   more WHERE clau
26850 73 65 0a 2a 2a 20 74 65 72 6d 73 20 61 72 65 20  se.** terms are 
26860 64 75 70 6c 69 63 61 74 65 64 20 69 6e 74 6f 20  duplicated into 
26870 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f  the subquery..*/
26880 0a 73 74 61 74 69 63 20 69 6e 74 20 70 75 73 68  .static int push
26890 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 0a  DownWhereTerms(.
268a0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
268b0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
268c0 20 63 6f 6e 74 65 78 74 20 28 66 6f 72 20 6d 61   context (for ma
268d0 6c 6c 6f 63 28 29 20 61 6e 64 20 65 72 72 6f 72  lloc() and error
268e0 20 72 65 70 6f 72 74 69 6e 67 29 20 2a 2f 0a 20   reporting) */. 
268f0 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 2c 20   Select *pSubq, 
26900 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75         /* The su
26910 62 71 75 65 72 79 20 77 68 6f 73 65 20 57 48 45  bquery whose WHE
26920 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 6f 20  RE clause is to 
26930 62 65 20 61 75 67 6d 65 6e 74 65 64 20 2a 2f 0a  be augmented */.
26940 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20    Expr *pWhere, 
26950 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
26960 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74  HERE clause of t
26970 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
26980 2f 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72 2c  /.  int iCursor,
26990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
269a0 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
269b0 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
269c0 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e 20 20  int isLeftJoin  
269d0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
269e0 20 70 53 75 62 71 20 69 73 20 74 68 65 20 72 69   pSubq is the ri
269f0 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45  ght term of a LE
26a00 46 54 20 4a 4f 49 4e 20 2a 2f 0a 29 7b 0a 20 20  FT JOIN */.){.  
26a10 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Expr *pNew;.  in
26a20 74 20 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 69  t nChng = 0;.  i
26a30 66 28 20 70 57 68 65 72 65 3d 3d 30 20 29 20 72  f( pWhere==0 ) r
26a40 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
26a50 53 75 62 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Subq->selFlags &
26a60 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 20   SF_Recursive ) 
26a70 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 72 65  return 0;  /* re
26a80 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20 2a 2f  striction (2) */
26a90 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
26aa0 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
26ab0 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e 70 57  .  if( pSubq->pW
26ac0 69 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  in ) return 0;  
26ad0 20 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e    /* restriction
26ae0 20 28 36 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a   (6) */.#endif..
26af0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
26b00 42 55 47 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68  BUG.  /* Only th
26b10 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20  e first term of 
26b20 61 20 63 6f 6d 70 6f 75 6e 64 20 63 61 6e 20 68  a compound can h
26b30 61 76 65 20 61 20 57 49 54 48 20 63 6c 61 75 73  ave a WITH claus
26b40 65 2e 20 20 42 75 74 20 6d 61 6b 65 0a 20 20 2a  e.  But make.  *
26b50 2a 20 73 75 72 65 20 6e 6f 20 6f 74 68 65 72 20  * sure no other 
26b60 74 65 72 6d 73 20 61 72 65 20 6d 61 72 6b 65 64  terms are marked
26b70 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 69 6e   SF_Recursive in
26b80 20 63 61 73 65 20 73 6f 6d 65 74 68 69 6e 67 20   case something 
26b90 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 69 6e 20  changes.  ** in 
26ba0 74 68 65 20 66 75 74 75 72 65 2e 0a 20 20 2a 2f  the future..  */
26bb0 0a 20 20 7b 0a 20 20 20 20 53 65 6c 65 63 74 20  .  {.    Select 
26bc0 2a 70 58 3b 20 20 0a 20 20 20 20 66 6f 72 28 70  *pX;  .    for(p
26bd0 58 3d 70 53 75 62 71 3b 20 70 58 3b 20 70 58 3d  X=pSubq; pX; pX=
26be0 70 58 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  pX->pPrior){.   
26bf0 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e     assert( (pX->
26c00 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 52  selFlags & (SF_R
26c10 65 63 75 72 73 69 76 65 29 29 3d 3d 30 20 29 3b  ecursive))==0 );
26c20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
26c30 66 0a 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e  f..  if( pSubq->
26c40 70 4c 69 6d 69 74 21 3d 30 20 29 7b 0a 20 20 20  pLimit!=0 ){.   
26c50 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65   return 0; /* re
26c60 73 74 72 69 63 74 69 6f 6e 20 28 33 29 20 2a 2f  striction (3) */
26c70 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 57  .  }.  while( pW
26c80 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44  here->op==TK_AND
26c90 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 20 2b 3d   ){.    nChng +=
26ca0 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65   pushDownWhereTe
26cb0 72 6d 73 28 70 50 61 72 73 65 2c 20 70 53 75 62  rms(pParse, pSub
26cc0 71 2c 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68  q, pWhere->pRigh
26cd0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
26ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cf0 20 20 20 69 43 75 72 73 6f 72 2c 20 69 73 4c 65     iCursor, isLe
26d00 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 57 68  ftJoin);.    pWh
26d10 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e 70 4c  ere = pWhere->pL
26d20 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  eft;.  }.  if( i
26d30 73 4c 65 66 74 4a 6f 69 6e 0a 20 20 20 26 26 20  sLeftJoin.   && 
26d40 28 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  (ExprHasProperty
26d50 28 70 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a  (pWhere,EP_FromJ
26d60 6f 69 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  oin)==0.        
26d70 20 7c 7c 20 70 57 68 65 72 65 2d 3e 69 52 69 67   || pWhere->iRig
26d80 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 69 43 75  htJoinTable!=iCu
26d90 72 73 6f 72 29 0a 20 20 29 7b 0a 20 20 20 20 72  rsor).  ){.    r
26da0 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74  eturn 0; /* rest
26db0 72 69 63 74 69 6f 6e 20 28 34 29 20 2a 2f 0a 20  riction (4) */. 
26dc0 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48 61 73   }.  if( ExprHas
26dd0 50 72 6f 70 65 72 74 79 28 70 57 68 65 72 65 2c  Property(pWhere,
26de0 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 26 26 20  EP_FromJoin) && 
26df0 70 57 68 65 72 65 2d 3e 69 52 69 67 68 74 4a 6f  pWhere->iRightJo
26e00 69 6e 54 61 62 6c 65 21 3d 69 43 75 72 73 6f 72  inTable!=iCursor
26e10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
26e20 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e  ; /* restriction
26e30 20 28 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66   (5) */.  }.  if
26e40 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54  ( sqlite3ExprIsT
26e50 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70 57 68  ableConstant(pWh
26e60 65 72 65 2c 20 69 43 75 72 73 6f 72 29 20 29 7b  ere, iCursor) ){
26e70 0a 20 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20  .    nChng++;.  
26e80 20 20 77 68 69 6c 65 28 20 70 53 75 62 71 20 29    while( pSubq )
26e90 7b 0a 20 20 20 20 20 20 53 75 62 73 74 43 6f 6e  {.      SubstCon
26ea0 74 65 78 74 20 78 3b 0a 20 20 20 20 20 20 70 4e  text x;.      pN
26eb0 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
26ec0 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
26ed0 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20  pWhere, 0);.    
26ee0 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28    unsetJoinExpr(
26ef0 70 4e 65 77 2c 20 2d 31 29 3b 0a 20 20 20 20 20  pNew, -1);.     
26f00 20 78 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   x.pParse = pPar
26f10 73 65 3b 0a 20 20 20 20 20 20 78 2e 69 54 61 62  se;.      x.iTab
26f20 6c 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20  le = iCursor;.  
26f30 20 20 20 20 78 2e 69 4e 65 77 54 61 62 6c 65 20      x.iNewTable 
26f40 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  = iCursor;.     
26f50 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20   x.isLeftJoin = 
26f60 30 3b 0a 20 20 20 20 20 20 78 2e 70 45 4c 69 73  0;.      x.pELis
26f70 74 20 3d 20 70 53 75 62 71 2d 3e 70 45 4c 69 73  t = pSubq->pELis
26f80 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  t;.      pNew = 
26f90 73 75 62 73 74 45 78 70 72 28 26 78 2c 20 70 4e  substExpr(&x, pN
26fa0 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ew);.      if( p
26fb0 53 75 62 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Subq->selFlags &
26fc0 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b   SF_Aggregate ){
26fd0 0a 20 20 20 20 20 20 20 20 70 53 75 62 71 2d 3e  .        pSubq->
26fe0 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
26ff0 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
27000 3e 64 62 2c 20 70 53 75 62 71 2d 3e 70 48 61 76  >db, pSubq->pHav
27010 69 6e 67 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  ing, pNew);.    
27020 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27030 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65 20 3d   pSubq->pWhere =
27040 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
27050 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 75 62  pParse->db, pSub
27060 71 2d 3e 70 57 68 65 72 65 2c 20 70 4e 65 77 29  q->pWhere, pNew)
27070 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27080 70 53 75 62 71 20 3d 20 70 53 75 62 71 2d 3e 70  pSubq = pSubq->p
27090 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Prior;.    }.  }
270a0 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 6e 67 3b  .  return nChng;
270b0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
270c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
270d0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
270e0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
270f0 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a  MIT_VIEW) */../*
27100 0a 2a 2a 20 54 68 65 20 70 46 75 6e 63 20 69 73  .** The pFunc is
27110 20 74 68 65 20 6f 6e 6c 79 20 61 67 67 72 65 67   the only aggreg
27120 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20  ate function in 
27130 74 68 65 20 71 75 65 72 79 2e 20 20 43 68 65 63  the query.  Chec
27140 6b 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66 20 74  k to see.** if t
27150 68 65 20 71 75 65 72 79 20 69 73 20 61 20 63 61  he query is a ca
27160 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68 65 20  ndidate for the 
27170 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a 61  min/max optimiza
27180 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  tion. .**.** If 
27190 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20 63  the query is a c
271a0 61 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68 65  andidate for the
271b0 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a   min/max optimiz
271c0 61 74 69 6f 6e 2c 20 74 68 65 6e 20 73 65 74 0a  ation, then set.
271d0 2a 2a 20 2a 70 70 4d 69 6e 4d 61 78 20 74 6f 20  ** *ppMinMax to 
271e0 62 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  be an ORDER BY c
271f0 6c 61 75 73 65 20 74 6f 20 62 65 20 75 73 65 64  lause to be used
27200 20 66 6f 72 20 74 68 65 20 6f 70 74 69 6d 69 7a   for the optimiz
27210 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65 74  ation.** and ret
27220 75 72 6e 20 65 69 74 68 65 72 20 57 48 45 52 45  urn either WHERE
27230 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20  _ORDERBY_MIN or 
27240 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
27250 58 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 0a 2a  X depending on.*
27260 2a 20 77 68 65 74 68 65 72 20 70 46 75 6e 63 20  * whether pFunc 
27270 69 73 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61  is a min() or ma
27280 78 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  x() function..**
27290 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79  .** If the query
272a0 20 69 73 20 6e 6f 74 20 61 20 63 61 6e 64 69 64   is not a candid
272b0 61 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f  ate for the min/
272c0 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  max optimization
272d0 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 57 48 45 52  , return.** WHER
272e0 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
272f0 20 28 77 68 69 63 68 20 6d 75 73 74 20 62 65 20   (which must be 
27300 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  zero)..**.** Thi
27310 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
27320 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61  e called after a
27330 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
27340 6e 73 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  ns have been.** 
27350 6c 6f 63 61 74 65 64 20 62 75 74 20 62 65 66 6f  located but befo
27360 72 65 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e  re their argumen
27370 74 73 20 68 61 76 65 20 62 65 65 6e 20 73 75 62  ts have been sub
27380 6a 65 63 74 65 64 20 74 6f 20 61 67 67 72 65 67  jected to aggreg
27390 61 74 65 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2e  ate.** analysis.
273a0 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69  .*/.static u8 mi
273b0 6e 4d 61 78 51 75 65 72 79 28 73 71 6c 69 74 65  nMaxQuery(sqlite
273c0 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 46 75  3 *db, Expr *pFu
273d0 6e 63 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a 70  nc, ExprList **p
273e0 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20  pMinMax){.  int 
273f0 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44  eRet = WHERE_ORD
27400 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20  ERBY_NORMAL;    
27410 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
27420 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
27430 2a 70 45 4c 69 73 74 20 3d 20 70 46 75 6e 63 2d  *pEList = pFunc-
27440 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20  >x.pList;    /* 
27450 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 67 67  Arguments to agg
27460 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 63   function */.  c
27470 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
27480 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27490 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
274a0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
274b0 6f 6e 20 70 46 75 6e 63 20 2a 2f 0a 20 20 45 78  on pFunc */.  Ex
274c0 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
274d0 3b 0a 20 20 75 38 20 73 6f 72 74 4f 72 64 65 72  ;.  u8 sortOrder
274e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70  ;..  assert( *pp
274f0 4d 69 6e 4d 61 78 3d 3d 30 20 29 3b 0a 20 20 61  MinMax==0 );.  a
27500 73 73 65 72 74 28 20 70 46 75 6e 63 2d 3e 6f 70  ssert( pFunc->op
27510 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  ==TK_AGG_FUNCTIO
27520 4e 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  N );.  if( pELis
27530 74 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74 2d 3e  t==0 || pEList->
27540 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72  nExpr!=1 ) retur
27550 6e 20 65 52 65 74 3b 0a 20 20 7a 46 75 6e 63 20  n eRet;.  zFunc 
27560 3d 20 70 46 75 6e 63 2d 3e 75 2e 7a 54 6f 6b 65  = pFunc->u.zToke
27570 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  n;.  if( sqlite3
27580 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22  StrICmp(zFunc, "
27590 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  min")==0 ){.    
275a0 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44  eRet = WHERE_ORD
275b0 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 73 6f  ERBY_MIN;.    so
275c0 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49 54 45  rtOrder = SQLITE
275d0 5f 53 4f 5f 41 53 43 3b 0a 20 20 7d 65 6c 73 65  _SO_ASC;.  }else
275e0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
275f0 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22  Cmp(zFunc, "max"
27600 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65 52 65 74  )==0 ){.    eRet
27610 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   = WHERE_ORDERBY
27620 5f 4d 41 58 3b 0a 20 20 20 20 73 6f 72 74 4f 72  _MAX;.    sortOr
27630 64 65 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f  der = SQLITE_SO_
27640 44 45 53 43 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  DESC;.  }else{. 
27650 20 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a     return eRet;.
27660 20 20 7d 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20    }.  *ppMinMax 
27670 3d 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  = pOrderBy = sql
27680 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
27690 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a  db, pEList, 0);.
276a0 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
276b0 42 79 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  By!=0 || db->mal
276c0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
276d0 66 28 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f  f( pOrderBy ) pO
276e0 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 73 6f 72  rderBy->a[0].sor
276f0 74 4f 72 64 65 72 20 3d 20 73 6f 72 74 4f 72 64  tOrder = sortOrd
27700 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 65 52 65  er;.  return eRe
27710 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
27720 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
27730 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
27740 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
27750 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75   an aggregate qu
27760 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ery..** The seco
27770 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  nd argument is t
27780 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 61 67  he associated ag
27790 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a  gregate-info obj
277a0 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  ect. This .** fu
277b0 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20  nction tests if 
277c0 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66  the SELECT is of
277d0 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
277e0 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
277f0 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a  *) FROM <tbl>.**
27800 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20  .** where table 
27810 69 73 20 61 20 64 61 74 61 62 61 73 65 20 74 61  is a database ta
27820 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73  ble, not a sub-s
27830 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49  elect or view. I
27840 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64  f the query.** d
27850 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73 20 70  oes match this p
27860 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70  attern, then a p
27870 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61  ointer to the Ta
27880 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65  ble object repre
27890 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e  senting.** <tbl>
278a0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
278b0 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65  herwise, 0 is re
278c0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
278d0 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c  c Table *isSimpl
278e0 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70  eCount(Select *p
278f0 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
27900 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  nfo){.  Table *p
27910 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78  Tab;.  Expr *pEx
27920 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  pr;..  assert( !
27930 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a  p->pGroupBy );..
27940 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
27950 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  || p->pEList->nE
27960 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d  xpr!=1 .   || p-
27970 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c  >pSrc->nSrc!=1 |
27980 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  | p->pSrc->a[0].
27990 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20  pSelect.  ){.   
279a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
279b0 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pTab = p->pSrc-
279c0 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45  >a[0].pTab;.  pE
279d0 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
279e0 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61  >a[0].pExpr;.  a
279f0 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20 21  ssert( pTab && !
27a00 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26  pTab->pSelect &&
27a10 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28   pExpr );..  if(
27a20 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
27a30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
27a40 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
27a50 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20  _AGG_FUNCTION ) 
27a60 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
27a70 4e 45 56 45 52 28 70 41 67 67 49 6e 66 6f 2d 3e  NEVER(pAggInfo->
27a80 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72 65 74 75  nFunc==0) ) retu
27a90 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67  rn 0;.  if( (pAg
27aa0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e  gInfo->aFunc[0].
27ab0 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73  pFunc->funcFlags
27ac0 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55  &SQLITE_FUNC_COU
27ad0 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  NT)==0 ) return 
27ae0 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
27af0 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69 6e 63  flags&EP_Distinc
27b00 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  t ) return 0;.. 
27b10 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
27b20 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f  ./*.** If the so
27b30 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d 20 70  urce-list item p
27b40 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
27b50 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65 6e 74  ment was augment
27b60 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e  ed with an.** IN
27b70 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
27b80 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63   then try to loc
27b90 61 74 65 20 74 68 65 20 73 70 65 63 69 66 69 65  ate the specifie
27ba0 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 72  d index. If ther
27bb0 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20 61 20  e.** was such a 
27bc0 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6e  clause and the n
27bd0 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f  amed index canno
27be0 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75  t be found, retu
27bf0 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52  rn .** SQLITE_ER
27c00 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20 61 6e  ROR and leave an
27c10 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65   error in pParse
27c20 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70  . Otherwise, pop
27c30 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d  ulate .** pFrom-
27c40 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65 74 75  >pIndex and retu
27c50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  rn SQLITE_OK..*/
27c60 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65  .int sqlite3Inde
27c70 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73  xedByLookup(Pars
27c80 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63  e *pParse, struc
27c90 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
27ca0 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46  pFrom){.  if( pF
27cb0 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70 46 72  rom->pTab && pFr
27cc0 6f 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64  om->fg.isIndexed
27cd0 42 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  By ){.    Table 
27ce0 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
27cf0 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Tab;.    char *z
27d00 49 6e 64 65 78 65 64 42 79 20 3d 20 70 46 72 6f  IndexedBy = pFro
27d10 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
27d20 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
27d30 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  x;.    for(pIdx=
27d40 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20  pTab->pIndex; . 
27d50 20 20 20 20 20 20 20 70 49 64 78 20 26 26 20 73         pIdx && s
27d60 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49  qlite3StrICmp(pI
27d70 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65  dx->zName, zInde
27d80 78 65 64 42 79 29 3b 20 0a 20 20 20 20 20 20 20  xedBy); .       
27d90 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
27da0 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  t.    );.    if(
27db0 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20   !pIdx ){.      
27dc0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
27dd0 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
27de0 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e   index: %s", zIn
27df0 64 65 78 65 64 42 79 2c 20 30 29 3b 0a 20 20 20  dexedBy, 0);.   
27e00 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
27e10 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20  Schema = 1;.    
27e20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27e30 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
27e40 20 70 46 72 6f 6d 2d 3e 70 49 42 49 6e 64 65 78   pFrom->pIBIndex
27e50 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72   = pIdx;.  }.  r
27e60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27e70 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74 20  .}./*.** Detect 
27e80 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
27e90 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
27ea0 75 73 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  use an ORDER BY 
27eb0 63 6c 61 75 73 65 20 77 69 74 68 20 0a 2a 2a 20  clause with .** 
27ec0 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63  an alternative c
27ed0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
27ee0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  e..**.**    SELE
27ef0 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45  CT ... FROM t1 E
27f00 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e  XCEPT SELECT ...
27f10 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42   FROM t2 ORDER B
27f20 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e  Y .. COLLATE ...
27f30 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65  .**.** These are
27f40 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20   rewritten as a 
27f50 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  subquery:.**.** 
27f60 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
27f70 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f   (SELECT ... FRO
27f80 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45  M t1 EXCEPT SELE
27f90 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29 0a  CT ... FROM t2).
27fa0 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20  **     ORDER BY 
27fb0 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a  ... COLLATE ....
27fc0 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73  **.** This trans
27fd0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63  formation is nec
27fe0 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20 74  essary because t
27ff0 68 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  he multiSelectOr
28000 64 65 72 42 79 28 29 20 72 6f 75 74 69 6e 65 0a  derBy() routine.
28010 2a 2a 20 61 62 6f 76 65 20 74 68 61 74 20 67 65  ** above that ge
28020 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
28030 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20   for a compound 
28040 53 45 4c 45 43 54 20 77 69 74 68 20 61 6e 20 4f  SELECT with an O
28050 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a  RDER BY clause.*
28060 2a 20 75 73 65 73 20 61 20 6d 65 72 67 65 20 61  * uses a merge a
28070 6c 67 6f 72 69 74 68 6d 20 74 68 61 74 20 72 65  lgorithm that re
28080 71 75 69 72 65 73 20 74 68 65 20 73 61 6d 65 20  quires the same 
28090 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
280a0 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65 73  ce on the.** res
280b0 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20 6f  ult columns as o
280c0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
280d0 6c 61 75 73 65 2e 20 20 53 65 65 20 74 69 63 6b  lause.  See tick
280e0 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77  et.** http://www
280f0 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f  .sqlite.org/src/
28100 69 6e 66 6f 2f 36 37 30 39 35 37 34 64 32 61 0a  info/6709574d2a.
28110 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73  **.** This trans
28120 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c  formation is onl
28130 79 20 6e 65 65 64 65 64 20 66 6f 72 20 45 58 43  y needed for EXC
28140 45 50 54 2c 20 49 4e 54 45 52 53 45 43 54 2c 20  EPT, INTERSECT, 
28150 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68  and UNION..** Th
28160 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
28170 61 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65 20  ator works fine 
28180 77 69 74 68 20 6d 75 6c 74 69 53 65 6c 65 63 74  with multiSelect
28190 4f 72 64 65 72 42 79 28 29 20 65 76 65 6e 20 77  OrderBy() even w
281a0 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72 65  hen.** there are
281b0 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20 69   COLLATE terms i
281c0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a  n the ORDER BY..
281d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
281e0 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c  nvertCompoundSel
281f0 65 63 74 54 6f 53 75 62 71 75 65 72 79 28 57 61  ectToSubquery(Wa
28200 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
28210 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74  elect *p){.  int
28220 20 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e   i;.  Select *pN
28230 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58  ew;.  Select *pX
28240 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
28250 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
28260 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53 72  st_item *a;.  Sr
28270 63 4c 69 73 74 20 2a 70 4e 65 77 53 72 63 3b 0a  cList *pNewSrc;.
28280 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
28290 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a  .  Token dummy;.
282a0 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
282b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
282c0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28  _Continue;.  if(
282d0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
282e0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
282f0 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58 3d  tinue;.  for(pX=
28300 70 3b 20 70 58 20 26 26 20 28 70 58 2d 3e 6f 70  p; pX && (pX->op
28310 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e  ==TK_ALL || pX->
28320 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b 20  op==TK_SELECT); 
28330 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d  pX=pX->pPrior){}
28340 0a 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 72  .  if( pX==0 ) r
28350 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
28360 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f 72  ue;.  a = p->pOr
28370 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72 28  derBy->a;.  for(
28380 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  i=p->pOrderBy->n
28390 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Expr-1; i>=0; i-
283a0 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 5b 69 5d  -){.    if( a[i]
283b0 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  .pExpr->flags & 
283c0 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72 65  EP_Collate ) bre
283d0 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c  ak;.  }.  if( i<
283e0 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
283f0 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49  ontinue;..  /* I
28400 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
28410 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e  point, that mean
28420 73 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61  s the transforma
28430 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64  tion is required
28440 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d  . */..  pParse =
28450 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
28460 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
28470 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  >db;.  pNew = sq
28480 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
28490 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  o(db, sizeof(*pN
284a0 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ew) );.  if( pNe
284b0 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  w==0 ) return WR
284c0 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73 65  C_Abort;.  memse
284d0 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69 7a  t(&dummy, 0, siz
284e0 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20 70  eof(dummy));.  p
284f0 4e 65 77 53 72 63 20 3d 20 73 71 6c 69 74 65 33  NewSrc = sqlite3
28500 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f  SrcListAppendFro
28510 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 30 2c 30  mTerm(pParse,0,0
28520 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c 30  ,0,&dummy,pNew,0
28530 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 53  ,0);.  if( pNewS
28540 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  rc==0 ) return W
28550 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e 65  RC_Abort;.  *pNe
28560 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53 72  w = *p;.  p->pSr
28570 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20 70  c = pNewSrc;.  p
28580 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pEList = sqlit
28590 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
285a0 28 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69  (pParse, 0, sqli
285b0 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 41  te3Expr(db, TK_A
285c0 53 54 45 52 49 53 4b 2c 20 30 29 29 3b 0a 20 20  STERISK, 0));.  
285d0 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43  p->op = TK_SELEC
285e0 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  T;.  p->pWhere =
285f0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f   0;.  pNew->pGro
28600 75 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77  upBy = 0;.  pNew
28610 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20  ->pHaving = 0;. 
28620 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
28630 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72  = 0;.  p->pPrior
28640 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78 74   = 0;.  p->pNext
28650 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 57 69 74 68   = 0;.  p->pWith
28660 20 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c   = 0;.  p->selFl
28670 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f  ags &= ~SF_Compo
28680 75 6e 64 3b 0a 20 20 61 73 73 65 72 74 28 20 28  und;.  assert( (
28690 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
286a0 5f 43 6f 6e 76 65 72 74 65 64 29 3d 3d 30 20 29  _Converted)==0 )
286b0 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ;.  p->selFlags 
286c0 7c 3d 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 3b  |= SF_Converted;
286d0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
286e0 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a 20 20  >pPrior!=0 );.  
286f0 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e  pNew->pPrior->pN
28700 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e  ext = pNew;.  pN
28710 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a  ew->pLimit = 0;.
28720 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
28730 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
28740 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
28750 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
28760 74 65 72 6d 20 70 46 72 6f 6d 20 68 61 73 20 74  term pFrom has t
28770 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63  able-valued func
28780 74 69 6f 6e 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  tion.** argument
28790 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73 2c 20  s.  If it does, 
287a0 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
287b0 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
287c0 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e   and return.** n
287d0 6f 6e 2d 7a 65 72 6f 2c 20 73 69 6e 63 65 20 70  on-zero, since p
287e0 46 72 6f 6d 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  From is not allo
287f0 77 65 64 20 74 6f 20 62 65 20 61 20 74 61 62 6c  wed to be a tabl
28800 65 2d 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f  e-valued functio
28810 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
28820 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f   cannotBeFunctio
28830 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
28840 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
28850 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  item *pFrom){.  
28860 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73  if( pFrom->fg.is
28870 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 73  TabFunc ){.    s
28880 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
28890 50 61 72 73 65 2c 20 22 27 25 73 27 20 69 73 20  Parse, "'%s' is 
288a0 6e 6f 74 20 61 20 66 75 6e 63 74 69 6f 6e 22 2c  not a function",
288b0 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pFrom->zName);.
288c0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
288d0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
288e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
288f0 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41  OMIT_CTE./*.** A
28900 72 67 75 6d 65 6e 74 20 70 57 69 74 68 20 28 77  rgument pWith (w
28910 68 69 63 68 20 6d 61 79 20 62 65 20 4e 55 4c 4c  hich may be NULL
28920 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c 69  ) points to a li
28930 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e 65 73  nked list of nes
28940 74 65 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f 6e  ted .** WITH con
28950 74 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e 65  texts, from inne
28960 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e 20  r to outermost. 
28970 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 64 65  If the table ide
28980 6e 74 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 46  ntified by .** F
28990 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65  ROM clause eleme
289a0 6e 74 20 70 49 74 65 6d 20 69 73 20 72 65 61 6c  nt pItem is real
289b0 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c  ly a common-tabl
289c0 65 2d 65 78 70 72 65 73 73 69 6f 6e 20 28 43 54  e-expression (CT
289d0 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  E) .** then retu
289e0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
289f0 74 68 65 20 43 54 45 20 64 65 66 69 6e 69 74 69  the CTE definiti
28a00 6f 6e 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c  on for that tabl
28a10 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  e. Otherwise.** 
28a20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
28a30 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  ** If a non-NULL
28a40 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
28a50 65 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74 65  ed, set *ppConte
28a60 78 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  xt to point to t
28a70 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65 63  he With.** objec
28a80 74 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72  t that the retur
28a90 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e 67 73 20  ned CTE belongs 
28aa0 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  to..*/.static st
28ab0 72 75 63 74 20 43 74 65 20 2a 73 65 61 72 63 68  ruct Cte *search
28ac0 57 69 74 68 28 0a 20 20 57 69 74 68 20 2a 70 57  With(.  With *pW
28ad0 69 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ith,            
28ae0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
28af0 6e 74 20 69 6e 6e 65 72 6d 6f 73 74 20 57 49 54  nt innermost WIT
28b00 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  H clause */.  st
28b10 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
28b20 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f 2a  m *pItem,     /*
28b30 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65   FROM clause ele
28b40 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65 20  ment to resolve 
28b50 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70 43 6f  */.  With **ppCo
28b60 6e 74 65 78 74 20 20 20 20 20 20 20 20 20 20 20  ntext           
28b70 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49 54       /* OUT: WIT
28b80 48 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e 20  H clause return 
28b90 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74 6f  value belongs to
28ba0 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
28bb0 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66  har *zName;.  if
28bc0 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  ( pItem->zDataba
28bd0 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65 20  se==0 && (zName 
28be0 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21  = pItem->zName)!
28bf0 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a  =0 ){.    With *
28c00 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 57 69  p;.    for(p=pWi
28c10 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75 74  th; p; p=p->pOut
28c20 65 72 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  er){.      int i
28c30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
28c40 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29   i<p->nCte; i++)
28c50 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
28c60 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61  lite3StrICmp(zNa
28c70 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  me, p->a[i].zNam
28c80 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
28c90 20 20 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d 20     *ppContext = 
28ca0 70 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  p;.          ret
28cb0 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  urn &p->a[i];.  
28cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
28cd0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
28ce0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  rn 0;.}../* The 
28cf0 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6d  code generator m
28d00 61 69 6e 74 61 69 6e 73 20 61 20 73 74 61 63 6b  aintains a stack
28d10 20 6f 66 20 61 63 74 69 76 65 20 57 49 54 48 20   of active WITH 
28d20 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74 68 20  clauses.** with 
28d30 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 57  the inner-most W
28d40 49 54 48 20 63 6c 61 75 73 65 20 62 65 69 6e 67  ITH clause being
28d50 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
28d60 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  he stack..**.** 
28d70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75 73  This routine pus
28d80 68 65 73 20 74 68 65 20 57 49 54 48 20 63 6c 61  hes the WITH cla
28d90 75 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68  use passed as th
28da0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
28db0 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74 6f  t.** onto the to
28dc0 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20  p of the stack. 
28dd0 49 66 20 61 72 67 75 6d 65 6e 74 20 62 46 72 65  If argument bFre
28de0 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
28df0 74 68 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c 61  this.** WITH cla
28e00 75 73 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  use will never b
28e10 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68  e popped from th
28e20 65 20 73 74 61 63 6b 2e 20 49 6e 20 74 68 69 73  e stack. In this
28e30 20 63 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f 75   case it.** shou
28e40 6c 64 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e  ld be freed alon
28e50 67 20 77 69 74 68 20 74 68 65 20 50 61 72 73 65  g with the Parse
28e60 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68 65   object. In othe
28e70 72 20 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a 2a  r cases, when.**
28e80 20 62 46 72 65 65 3d 3d 30 2c 20 74 68 65 20 57   bFree==0, the W
28e90 69 74 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  ith object will 
28ea0 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77  be freed along w
28eb0 69 74 68 20 74 68 65 20 53 45 4c 45 43 54 20 0a  ith the SELECT .
28ec0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74  ** statement wit
28ed0 68 20 77 68 69 63 68 20 69 74 20 69 73 20 61 73  h which it is as
28ee0 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69  sociated..*/.voi
28ef0 64 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73  d sqlite3WithPus
28f00 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  h(Parse *pParse,
28f10 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 75 38   With *pWith, u8
28f20 20 62 46 72 65 65 29 7b 0a 20 20 61 73 73 65 72   bFree){.  asser
28f30 74 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20 28  t( bFree==0 || (
28f40 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 30  pParse->pWith==0
28f50 20 26 26 20 70 50 61 72 73 65 2d 3e 70 57 69 74   && pParse->pWit
28f60 68 54 6f 46 72 65 65 3d 3d 30 29 20 29 3b 0a 20  hToFree==0) );. 
28f70 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20   if( pWith ){.  
28f80 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
28f90 2d 3e 70 57 69 74 68 21 3d 70 57 69 74 68 20 29  ->pWith!=pWith )
28fa0 3b 0a 20 20 20 20 70 57 69 74 68 2d 3e 70 4f 75  ;.    pWith->pOu
28fb0 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 70 57  ter = pParse->pW
28fc0 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ith;.    pParse-
28fd0 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a  >pWith = pWith;.
28fe0 20 20 20 20 69 66 28 20 62 46 72 65 65 20 29 20      if( bFree ) 
28ff0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46  pParse->pWithToF
29000 72 65 65 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d  ree = pWith;.  }
29010 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
29020 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69  unction checks i
29030 66 20 61 72 67 75 6d 65 6e 74 20 70 46 72 6f 6d  f argument pFrom
29040 20 72 65 66 65 72 73 20 74 6f 20 61 20 43 54 45   refers to a CTE
29050 20 64 65 63 6c 61 72 65 64 20 62 79 20 0a 2a 2a   declared by .**
29060 20 61 20 57 49 54 48 20 63 6c 61 75 73 65 20 6f   a WITH clause o
29070 6e 20 74 68 65 20 73 74 61 63 6b 20 63 75 72 72  n the stack curr
29080 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65 64  ently maintained
29090 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e 20   by the parser. 
290a0 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72 65  And,.** if curre
290b0 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20  ntly processing 
290c0 61 20 43 54 45 20 65 78 70 72 65 73 73 69 6f 6e  a CTE expression
290d0 2c 20 69 66 20 69 74 20 69 73 20 61 20 72 65 63  , if it is a rec
290e0 75 72 73 69 76 65 0a 2a 2a 20 72 65 66 65 72 65  ursive.** refere
290f0 6e 63 65 20 74 6f 20 74 68 65 20 63 75 72 72 65  nce to the curre
29100 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  nt CTE..**.** If
29110 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e 74   pFrom falls int
29120 6f 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  o either of the 
29130 74 77 6f 20 63 61 74 65 67 6f 72 69 65 73 20 61  two categories a
29140 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54 61  bove, pFrom->pTa
29150 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66  b.** and other f
29160 69 65 6c 64 73 20 61 72 65 20 70 6f 70 75 6c 61  ields are popula
29170 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
29180 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75   The caller shou
29190 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46 72  ld check.** (pFr
291a0 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f 20  om->pTab!=0) to 
291b0 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
291c0 72 20 6f 72 20 6e 6f 74 20 61 20 73 75 63 63 65  r or not a succe
291d0 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20 77  ssful match.** w
291e0 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20  as found..**.** 
291f0 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
29200 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c   match is found,
29210 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
29220 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
29230 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49 66  or.** occurs. If
29240 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f   an error does o
29250 63 63 75 72 2c 20 61 6e 20 65 72 72 6f 72 20 6d  ccur, an error m
29260 65 73 73 61 67 65 20 69 73 20 73 74 6f 72 65 64  essage is stored
29270 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73 65   in the.** parse
29280 72 20 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f 72  r and some error
29290 20 63 6f 64 65 20 6f 74 68 65 72 20 74 68 61 6e   code other than
292a0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
292b0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
292c0 6e 74 20 77 69 74 68 45 78 70 61 6e 64 28 0a 20  nt withExpand(. 
292d0 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72   Walker *pWalker
292e0 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  , .  struct SrcL
292f0 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 0a  ist_item *pFrom.
29300 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
29310 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
29320 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20  arse;.  sqlite3 
29330 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
29340 3b 0a 20 20 73 74 72 75 63 74 20 43 74 65 20 2a  ;.  struct Cte *
29350 70 43 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  pCte;           
29360 20 20 20 20 2f 2a 20 4d 61 74 63 68 65 64 20 43      /* Matched C
29370 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20 6e  TE (or NULL if n
29380 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57 69  o match) */.  Wi
29390 74 68 20 2a 70 57 69 74 68 3b 20 20 20 20 20 20  th *pWith;      
293a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
293b0 20 57 49 54 48 20 63 6c 61 75 73 65 20 74 68 61   WITH clause tha
293c0 74 20 70 43 74 65 20 62 65 6c 6f 6e 67 73 20 74  t pCte belongs t
293d0 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  o */..  assert( 
293e0 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
293f0 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73 65 61 72  ;..  pCte = sear
29400 63 68 57 69 74 68 28 70 50 61 72 73 65 2d 3e 70  chWith(pParse->p
29410 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70 57  With, pFrom, &pW
29420 69 74 68 29 3b 0a 20 20 69 66 28 20 70 43 74 65  ith);.  if( pCte
29430 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
29440 54 61 62 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  Tab;.    ExprLis
29450 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53  t *pEList;.    S
29460 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20  elect *pSel;.   
29470 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b 20   Select *pLeft; 
29480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29490 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45  * Left-most SELE
294a0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
294b0 20 20 20 20 69 6e 74 20 62 4d 61 79 52 65 63 75      int bMayRecu
294c0 72 73 69 76 65 3b 20 20 20 20 20 20 20 20 20 20  rsive;          
294d0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 6f 6d    /* True if com
294e0 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79 20  pound joined by 
294f0 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20  UNION [ALL] */. 
29500 20 20 20 57 69 74 68 20 2a 70 53 61 76 65 64 57     With *pSavedW
29510 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ith;            
29520 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75   /* Initial valu
29530 65 20 6f 66 20 70 50 61 72 73 65 2d 3e 70 57 69  e of pParse->pWi
29540 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66  th */..    /* If
29550 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69   pCte->zCteErr i
29560 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68  s non-NULL at th
29570 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74  is point, then t
29580 68 69 73 20 69 73 20 61 6e 20 69 6c 6c 65 67 61  his is an illega
29590 6c 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69  l.    ** recursi
295a0 76 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ve reference to 
295b0 43 54 45 20 70 43 74 65 2e 20 4c 65 61 76 65 20  CTE pCte. Leave 
295c0 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
295d0 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  se and return.  
295e0 20 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20 70    ** early. If p
295f0 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69 73 20  Cte->zCteErr is 
29600 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20  NULL, then this 
29610 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69  is not a recursi
29620 76 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 20 20  ve reference..  
29630 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
29640 65 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a  e, proceed.  */.
29650 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e 7a 43      if( pCte->zC
29660 74 65 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73  teErr ){.      s
29670 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
29680 50 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a 43 74  Parse, pCte->zCt
29690 65 45 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d  eErr, pCte->zNam
296a0 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
296b0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
296c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 61 6e     }.    if( can
296d0 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50  notBeFunction(pP
296e0 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 20 72  arse, pFrom) ) r
296f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
29700 4f 52 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  OR;..    assert(
29710 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
29720 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  );.    pFrom->pT
29730 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69  ab = pTab = sqli
29740 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
29750 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
29760 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ));.    if( pTab
29770 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
29780 5f 41 62 6f 72 74 3b 0a 20 20 20 20 70 54 61 62  _Abort;.    pTab
29790 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20  ->nTabRef = 1;. 
297a0 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d     pTab->zName =
297b0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
297c0 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  (db, pCte->zName
297d0 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b  );.    pTab->iPK
297e0 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 70 54 61  ey = -1;.    pTa
297f0 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20  b->nRowLogEst = 
29800 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30  200; assert( 200
29810 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
29820 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20  1048576) );.    
29830 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
29840 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 20 7c  = TF_Ephemeral |
29850 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77   TF_NoVisibleRow
29860 69 64 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70  id;.    pFrom->p
29870 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
29880 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 43  SelectDup(db, pC
29890 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b  te->pSelect, 0);
298a0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
298b0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
298c0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
298d0 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74  BKPT;.    assert
298e0 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  ( pFrom->pSelect
298f0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63   );..    /* Chec
29900 6b 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72  k if this is a r
29910 65 63 75 72 73 69 76 65 20 43 54 45 2e 20 2a 2f  ecursive CTE. */
29920 0a 20 20 20 20 70 53 65 6c 20 3d 20 70 46 72 6f  .    pSel = pFro
29930 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
29940 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 3d 20  bMayRecursive = 
29950 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41  ( pSel->op==TK_A
29960 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d  LL || pSel->op==
29970 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20  TK_UNION );.    
29980 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76  if( bMayRecursiv
29990 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  e ){.      int i
299a0 3b 0a 20 20 20 20 20 20 53 72 63 4c 69 73 74 20  ;.      SrcList 
299b0 2a 70 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSrc = pFrom->p
299c0 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20  Select->pSrc;.  
299d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
299e0 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  Src->nSrc; i++){
299f0 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
29a00 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
29a10 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69  tem = &pSrc->a[i
29a20 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
29a30 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d  Item->zDatabase=
29a40 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0 .         && 
29a50 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20  pItem->zName!=0 
29a60 0a 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d  .         && 0==
29a70 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
29a80 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74  Item->zName, pCt
29a90 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20  e->zName).      
29aa0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
29ab0 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70   pItem->pTab = p
29ac0 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
29ad0 49 74 65 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72  Item->fg.isRecur
29ae0 73 69 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  sive = 1;.      
29af0 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65      pTab->nTabRe
29b00 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  f++;.          p
29b10 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  Sel->selFlags |=
29b20 20 53 46 5f 52 65 63 75 72 73 69 76 65 3b 0a 20   SF_Recursive;. 
29b30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
29b40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f  .    }..    /* O
29b50 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72 73 69 76  nly one recursiv
29b60 65 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 70  e reference is p
29b70 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20  ermitted. */ .  
29b80 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 54 61 62    if( pTab->nTab
29b90 52 65 66 3e 32 20 29 7b 0a 20 20 20 20 20 20 73  Ref>2 ){.      s
29ba0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 0a  qlite3ErrorMsg(.
29bb0 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
29bc0 2c 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 66 65  , "multiple refe
29bd0 72 65 6e 63 65 73 20 74 6f 20 72 65 63 75 72 73  rences to recurs
29be0 69 76 65 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  ive table: %s", 
29bf0 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  pCte->zName.    
29c00 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72    );.      retur
29c10 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
29c20 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
29c30 28 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3d  ( pTab->nTabRef=
29c40 3d 31 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  =1 || .         
29c50 20 20 20 28 28 70 53 65 6c 2d 3e 73 65 6c 46 6c     ((pSel->selFl
29c60 61 67 73 26 53 46 5f 52 65 63 75 72 73 69 76 65  ags&SF_Recursive
29c70 29 20 26 26 20 70 54 61 62 2d 3e 6e 54 61 62 52  ) && pTab->nTabR
29c80 65 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20 20 70  ef==2 ));..    p
29c90 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22  Cte->zCteErr = "
29ca0 63 69 72 63 75 6c 61 72 20 72 65 66 65 72 65 6e  circular referen
29cb0 63 65 3a 20 25 73 22 3b 0a 20 20 20 20 70 53 61  ce: %s";.    pSa
29cc0 76 65 64 57 69 74 68 20 3d 20 70 50 61 72 73 65  vedWith = pParse
29cd0 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61  ->pWith;.    pPa
29ce0 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69  rse->pWith = pWi
29cf0 74 68 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79  th;.    if( bMay
29d00 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
29d10 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f     Select *pPrio
29d20 72 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  r = pSel->pPrior
29d30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
29d40 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 3d 3d 30  pPrior->pWith==0
29d50 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72   );.      pPrior
29d60 2d 3e 70 57 69 74 68 20 3d 20 70 53 65 6c 2d 3e  ->pWith = pSel->
29d70 70 57 69 74 68 3b 0a 20 20 20 20 20 20 73 71 6c  pWith;.      sql
29d80 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
29d90 57 61 6c 6b 65 72 2c 20 70 50 72 69 6f 72 29 3b  Walker, pPrior);
29da0 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70  .      pPrior->p
29db0 57 69 74 68 20 3d 20 30 3b 0a 20 20 20 20 7d 65  With = 0;.    }e
29dc0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
29dd0 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
29de0 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20  lker, pSel);.   
29df0 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70   }.    pParse->p
29e00 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 0a 20  With = pWith;.. 
29e10 20 20 20 66 6f 72 28 70 4c 65 66 74 3d 70 53 65     for(pLeft=pSe
29e20 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72  l; pLeft->pPrior
29e30 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70  ; pLeft=pLeft->p
29e40 50 72 69 6f 72 29 3b 0a 20 20 20 20 70 45 4c 69  Prior);.    pELi
29e50 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45 4c 69  st = pLeft->pELi
29e60 73 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 65  st;.    if( pCte
29e70 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20 20 20  ->pCols ){.     
29e80 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70   if( pEList && p
29e90 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 43  EList->nExpr!=pC
29ea0 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72  te->pCols->nExpr
29eb0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
29ec0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
29ed0 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61  se, "table %s ha
29ee0 73 20 25 64 20 76 61 6c 75 65 73 20 66 6f 72 20  s %d values for 
29ef0 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20  %d columns",.   
29f00 20 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a           pCte->z
29f10 4e 61 6d 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Name, pEList->nE
29f20 78 70 72 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73  xpr, pCte->pCols
29f30 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20  ->nExpr.        
29f40 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
29f50 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65  e->pWith = pSave
29f60 64 57 69 74 68 3b 0a 20 20 20 20 20 20 20 20 72  dWith;.        r
29f70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
29f80 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
29f90 20 20 70 45 4c 69 73 74 20 3d 20 70 43 74 65 2d    pEList = pCte-
29fa0 3e 70 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20  >pCols;.    }.. 
29fb0 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
29fc0 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  sFromExprList(pP
29fd0 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 26 70  arse, pEList, &p
29fe0 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  Tab->nCol, &pTab
29ff0 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28  ->aCol);.    if(
2a000 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29   bMayRecursive )
2a010 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c  {.      if( pSel
2a020 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2a030 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
2a040 20 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45       pCte->zCteE
2a050 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20 72  rr = "multiple r
2a060 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
2a070 63 65 73 3a 20 25 73 22 3b 0a 20 20 20 20 20 20  ces: %s";.      
2a080 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
2a090 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22  Cte->zCteErr = "
2a0a0 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
2a0b0 6e 63 65 20 69 6e 20 61 20 73 75 62 71 75 65 72  nce in a subquer
2a0c0 79 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a  y: %s";.      }.
2a0d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
2a0e0 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
2a0f0 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   pSel);.    }.  
2a100 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20    pCte->zCteErr 
2a110 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  = 0;.    pParse-
2a120 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57  >pWith = pSavedW
2a130 69 74 68 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ith;.  }..  retu
2a140 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2a150 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
2a160 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
2a170 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c  /*.** If the SEL
2a180 45 43 54 20 70 61 73 73 65 64 20 61 73 20 74 68  ECT passed as th
2a190 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2a1a0 74 20 68 61 73 20 61 6e 20 61 73 73 6f 63 69 61  t has an associa
2a1b0 74 65 64 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61  ted WITH .** cla
2a1c0 75 73 65 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d  use, pop it from
2a1d0 20 74 68 65 20 73 74 61 63 6b 20 73 74 6f 72 65   the stack store
2a1e0 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
2a1f0 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a   Parse object..*
2a200 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2a210 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20 74 68  on is used as th
2a220 65 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  e xSelectCallbac
2a230 6b 32 28 29 20 63 61 6c 6c 62 61 63 6b 20 62 79  k2() callback by
2a240 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63  .** sqlite3Selec
2a250 74 45 78 70 61 6e 64 28 29 20 77 68 65 6e 20 77  tExpand() when w
2a260 61 6c 6b 69 6e 67 20 61 20 53 45 4c 45 43 54 20  alking a SELECT 
2a270 74 72 65 65 20 74 6f 20 72 65 73 6f 6c 76 65 20  tree to resolve 
2a280 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61  table.** names a
2a290 6e 64 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c  nd other FROM cl
2a2a0 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a  ause elements. .
2a2b0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
2a2c0 65 6c 65 63 74 50 6f 70 57 69 74 68 28 57 61 6c  electPopWith(Wal
2a2d0 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
2a2e0 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73  lect *p){.  Pars
2a2f0 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
2a300 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  ker->pParse;.  i
2a310 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f  f( OK_IF_ALWAYS_
2a320 54 52 55 45 28 70 50 61 72 73 65 2d 3e 70 57 69  TRUE(pParse->pWi
2a330 74 68 29 20 26 26 20 70 2d 3e 70 50 72 69 6f 72  th) && p->pPrior
2a340 3d 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20  ==0 ){.    With 
2a350 2a 70 57 69 74 68 20 3d 20 66 69 6e 64 52 69 67  *pWith = findRig
2a360 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68  htmost(p)->pWith
2a370 3b 0a 20 20 20 20 69 66 28 20 70 57 69 74 68 21  ;.    if( pWith!
2a380 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
2a390 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74  rt( pParse->pWit
2a3a0 68 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20  h==pWith );.    
2a3b0 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
2a3c0 3d 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 3b  = pWith->pOuter;
2a3d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c  .    }.  }.}.#el
2a3e0 73 65 0a 23 64 65 66 69 6e 65 20 73 65 6c 65 63  se.#define selec
2a3f0 74 50 6f 70 57 69 74 68 20 30 0a 23 65 6e 64 69  tPopWith 0.#endi
2a400 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 53 72 63  f../*.** The Src
2a410 4c 69 73 74 5f 69 74 65 6d 20 73 74 72 75 63 74  List_item struct
2a420 75 72 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ure passed as th
2a430 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2a440 74 20 72 65 70 72 65 73 65 6e 74 73 20 61 0a 2a  t represents a.*
2a450 2a 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  * sub-query in t
2a460 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
2a470 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  f a SELECT state
2a480 6d 65 6e 74 2e 20 54 68 69 73 20 66 75 6e 63 74  ment. This funct
2a490 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73  ion.** allocates
2a4a0 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 73 20 74   and populates t
2a4b0 68 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 2e  he SrcList_item.
2a4c0 70 54 61 62 20 6f 62 6a 65 63 74 2e 20 49 66 20  pTab object. If 
2a4d0 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 53  successful,.** S
2a4e0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2a4f0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
2a500 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   if an OOM error
2a510 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
2a520 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
2a530 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2a540 45 78 70 61 6e 64 53 75 62 71 75 65 72 79 28 50  ExpandSubquery(P
2a550 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74  arse *pParse, st
2a560 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2a570 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 53 65 6c  m *pFrom){.  Sel
2a580 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f  ect *pSel = pFro
2a590 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 54 61  m->pSelect;.  Ta
2a5a0 62 6c 65 20 2a 70 54 61 62 3b 0a 0a 20 20 61 73  ble *pTab;..  as
2a5b0 73 65 72 74 28 20 70 53 65 6c 20 29 3b 0a 20 20  sert( pSel );.  
2a5c0 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
2a5d0 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ab = sqlite3DbMa
2a5e0 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
2a5f0 3e 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  >db, sizeof(Tabl
2a600 65 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  e));.  if( pTab=
2a610 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
2a620 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 54 61 62  TE_NOMEM;.  pTab
2a630 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20  ->nTabRef = 1;. 
2a640 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69   if( pFrom->zAli
2a650 61 73 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  as ){.    pTab->
2a660 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
2a670 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e  bStrDup(pParse->
2a680 64 62 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61  db, pFrom->zAlia
2a690 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  s);.  }else{.   
2a6a0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pTab->zName = s
2a6b0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50  qlite3MPrintf(pP
2a6c0 61 72 73 65 2d 3e 64 62 2c 20 22 73 75 62 71 75  arse->db, "subqu
2a6d0 65 72 79 5f 25 75 22 2c 20 70 53 65 6c 2d 3e 73  ery_%u", pSel->s
2a6e0 65 6c 49 64 29 3b 0a 20 20 7d 0a 20 20 77 68 69  elId);.  }.  whi
2a6f0 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  le( pSel->pPrior
2a700 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d   ){ pSel = pSel-
2a710 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 73 71 6c  >pPrior; }.  sql
2a720 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
2a730 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
2a740 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 26 70 54  pSel->pEList,&pT
2a750 61 62 2d 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e  ab->nCol,&pTab->
2a760 61 43 6f 6c 29 3b 0a 20 20 70 54 61 62 2d 3e 69  aCol);.  pTab->i
2a770 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61  PKey = -1;.  pTa
2a780 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20  b->nRowLogEst = 
2a790 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30  200; assert( 200
2a7a0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
2a7b0 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 70 54  1048576) );.  pT
2a7c0 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
2a7d0 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 0a 20  TF_Ephemeral;.. 
2a7e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2a7f0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
2a800 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61   routine is a Wa
2a810 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f  lker callback fo
2a820 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20  r "expanding" a 
2a830 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2a840 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22  ..** "Expanding"
2a850 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65   means to do the
2a860 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
2a870 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73  *    (1)  Make s
2a880 75 72 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  ure VDBE cursor 
2a890 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
2a8a0 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76  n assigned to ev
2a8b0 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65  ery.**         e
2a8c0 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52  lement of the FR
2a8d0 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
2a8e0 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e      (2)  Fill in
2a8f0 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61   the pTabList->a
2a900 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69  [].pTab fields i
2a910 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68  n the SrcList th
2a920 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64  at .**         d
2a930 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75  efines FROM clau
2a940 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20  se.  When views 
2a950 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
2a960 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20  OM clause,.**   
2a970 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c        fill pTabL
2a980 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74  ist->a[].pSelect
2a990 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
2a9a0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
2a9b0 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
2a9c0 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
2a9d0 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70  the view.  A cop
2a9e0 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65  y is made of the
2a9f0 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a   view's SELECT.*
2aa00 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d  *         statem
2aa10 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63  ent so that we c
2aa20 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79  an freely modify
2aa30 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20   or delete that 
2aa40 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
2aa50 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72       without wor
2aa60 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73  rying about mess
2aa70 69 6e 67 20 75 70 20 74 68 65 20 70 65 72 73 69  ing up the persi
2aa80 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61  stent representa
2aa90 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tion.**         
2aaa0 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a  of the view..**.
2aab0 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64 20 74  **    (3)  Add t
2aac0 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52  erms to the WHER
2aad0 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f  E clause to acco
2aae0 6d 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55  mmodate the NATU
2aaf0 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20  RAL keyword.**  
2ab00 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20         on joins 
2ab10 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55  and the ON and U
2ab20 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a  SING clause of j
2ab30 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  oins..**.**    (
2ab40 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73  4)  Scan the lis
2ab50 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  t of columns in 
2ab60 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28  the result set (
2ab70 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a  pEList) looking.
2ab80 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69  **         for i
2ab90 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
2aba0 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  "*" operator or 
2abb0 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72  the TABLE.* oper
2abc0 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ator..**        
2abd0 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e   If found, expan
2abe0 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65  d each "*" to be
2abf0 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
2ac00 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20   every table.** 
2ac10 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c          and TABL
2ac20 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20  E.* to be every 
2ac30 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e  column in TABLE.
2ac40 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
2ac50 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  t selectExpander
2ac60 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2ac70 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
2ac80 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
2ac90 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
2aca0 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a  .  int i, j, k;.
2acb0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
2acc0 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
2acd0 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  *pEList;.  struc
2ace0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2acf0 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pFrom;.  sqlite3
2ad00 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
2ad10 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 2a  b;.  Expr *pE, *
2ad20 70 52 69 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a  pRight, *pExpr;.
2ad30 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 20 3d    u16 selFlags =
2ad40 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 20 20   p->selFlags;.  
2ad50 75 33 32 20 65 6c 69 73 74 46 6c 61 67 73 20 3d  u32 elistFlags =
2ad60 20 30 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c 61   0;..  p->selFla
2ad70 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65  gs |= SF_Expande
2ad80 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  d;.  if( db->mal
2ad90 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20  locFailed  ){.  
2ada0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
2adb0 72 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rt;.  }.  assert
2adc0 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a  ( p->pSrc!=0 );.
2add0 20 20 69 66 28 20 28 73 65 6c 46 6c 61 67 73 20    if( (selFlags 
2ade0 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d  & SF_Expanded)!=
2adf0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
2ae00 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20  WRC_Prune;.  }. 
2ae10 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
2ae20 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  Src;.  pEList = 
2ae30 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c  p->pEList;.  sql
2ae40 69 74 65 33 57 69 74 68 50 75 73 68 28 70 50 61  ite3WithPush(pPa
2ae50 72 73 65 2c 20 70 2d 3e 70 57 69 74 68 2c 20 30  rse, p->pWith, 0
2ae60 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  );..  /* Make su
2ae70 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  re cursor number
2ae80 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69  s have been assi
2ae90 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72  gned to all entr
2aea0 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20  ies in.  ** the 
2aeb0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
2aec0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
2aed0 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ent..  */.  sqli
2aee0 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
2aef0 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
2af00 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a  pTabList);..  /*
2af10 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74   Look up every t
2af20 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68  able named in th
2af30 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
2af40 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66   the select.  If
2af50 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f  .  ** an entry o
2af60 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
2af70 65 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20  e is a subquery 
2af80 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61 62  instead of a tab
2af90 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a  le or view,.  **
2afa0 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 74   then create a t
2afb0 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73  ransient table s
2afc0 74 72 75 63 74 75 72 65 20 74 6f 20 64 65 73 63  tructure to desc
2afd0 72 69 62 65 20 74 68 65 20 73 75 62 71 75 65 72  ribe the subquer
2afe0 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  y..  */.  for(i=
2aff0 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
2b000 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
2b010 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
2b020 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  om++){.    Table
2b030 20 2a 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65   *pTab;.    asse
2b040 72 74 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73  rt( pFrom->fg.is
2b050 52 65 63 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20  Recursive==0 || 
2b060 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29  pFrom->pTab!=0 )
2b070 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  ;.    if( pFrom-
2b080 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  >fg.isRecursive 
2b090 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2b0a0 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
2b0b0 54 61 62 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65  Tab==0 );.#ifnde
2b0c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
2b0d0 45 0a 20 20 20 20 69 66 28 20 77 69 74 68 45 78  E.    if( withEx
2b0e0 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c 20 70 46  pand(pWalker, pF
2b0f0 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52  rom) ) return WR
2b100 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69 66 28  C_Abort;.    if(
2b110 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b   pFrom->pTab ) {
2b120 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20  } else.#endif.  
2b130 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61    if( pFrom->zNa
2b140 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66  me==0 ){.#ifndef
2b150 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
2b160 51 55 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65  QUERY.      Sele
2b170 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d  ct *pSel = pFrom
2b180 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
2b190 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
2b1a0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2b1b0 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
2b1c0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
2b1d0 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  pSel!=0 );.     
2b1e0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
2b1f0 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  pTab==0 );.     
2b200 20 69 66 28 20 73 71 6c 69 74 65 33 57 61 6c 6b   if( sqlite3Walk
2b210 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
2b220 70 53 65 6c 29 20 29 20 72 65 74 75 72 6e 20 57  pSel) ) return W
2b230 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
2b240 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 61 6e  if( sqlite3Expan
2b250 64 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65  dSubquery(pParse
2b260 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72  , pFrom) ) retur
2b270 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 23 65 6e  n WRC_Abort;.#en
2b280 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
2b290 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e       /* An ordin
2b2a0 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65  ary table or vie
2b2b0 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52  w name in the FR
2b2c0 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
2b2d0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
2b2e0 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
2b2f0 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
2b300 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
2b310 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70  ocateTableItem(p
2b320 50 61 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29  Parse, 0, pFrom)
2b330 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
2b340 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
2b350 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 69 66  _Abort;.      if
2b360 28 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e  ( pTab->nTabRef>
2b370 3d 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20 20  =0xffff ){.     
2b380 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2b390 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
2b3a0 6d 61 6e 79 20 72 65 66 65 72 65 6e 63 65 73 20  many references 
2b3b0 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36  to \"%s\": max 6
2b3c0 35 35 33 35 22 2c 0a 20 20 20 20 20 20 20 20 20  5535",.         
2b3d0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a    pTab->zName);.
2b3e0 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70          pFrom->p
2b3f0 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Tab = 0;.       
2b400 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
2b410 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
2b420 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b   pTab->nTabRef++
2b430 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 56  ;.      if( !IsV
2b440 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26 20  irtual(pTab) && 
2b450 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e  cannotBeFunction
2b460 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20  (pParse, pFrom) 
2b470 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
2b480 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
2b490 20 20 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65     }.#if !define
2b4a0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
2b4b0 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20  EW) || !defined 
2b4c0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
2b4d0 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20  TUALTABLE).     
2b4e0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
2b4f0 54 61 62 29 20 7c 7c 20 70 54 61 62 2d 3e 70 53  Tab) || pTab->pS
2b500 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
2b510 20 69 31 36 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   i16 nCol;.     
2b520 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69     if( sqlite3Vi
2b530 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
2b540 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29  (pParse, pTab) )
2b550 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
2b560 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
2b570 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  t( pFrom->pSelec
2b580 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
2b590 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pFrom->pSelect =
2b5a0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
2b5b0 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c  p(db, pTab->pSel
2b5c0 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ect, 0);.       
2b5d0 20 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43   nCol = pTab->nC
2b5e0 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62  ol;.        pTab
2b5f0 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20  ->nCol = -1;.   
2b600 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
2b610 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
2b620 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pFrom->pSelect);
2b630 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  .        pTab->n
2b640 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20  Col = nCol;.    
2b650 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
2b660 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20  ..    /* Locate 
2b670 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 64 20  the index named 
2b680 62 79 20 74 68 65 20 49 4e 44 45 58 45 44 20 42  by the INDEXED B
2b690 59 20 63 6c 61 75 73 65 2c 20 69 66 20 61 6e 79  Y clause, if any
2b6a0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  . */.    if( sql
2b6b0 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f  ite3IndexedByLoo
2b6c0 6b 75 70 28 70 50 61 72 73 65 2c 20 70 46 72 6f  kup(pParse, pFro
2b6d0 6d 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  m) ){.      retu
2b6e0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
2b6f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72    }.  }..  /* Pr
2b700 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65  ocess NATURAL ke
2b710 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61  ywords, and ON a
2b720 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
2b730 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a   of joins..  */.
2b740 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
2b750 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65  Failed || sqlite
2b760 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72  ProcessJoin(pPar
2b770 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65  se, p) ){.    re
2b780 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
2b790 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76    }..  /* For ev
2b7a0 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63  ery "*" that occ
2b7b0 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  urs in the colum
2b7c0 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74  n list, insert t
2b7d0 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a  he names of.  **
2b7e0 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
2b7f0 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64  all tables.  And
2b800 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45   for every TABLE
2b810 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  .* insert the na
2b820 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20  mes.  ** of all 
2b830 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45  columns in TABLE
2b840 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e  .  The parser in
2b850 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c  serted a special
2b860 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
2b870 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 53 54   with the TK_AST
2b880 45 52 49 53 4b 20 6f 70 65 72 61 74 6f 72 20 66  ERISK operator f
2b890 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74  or each "*" that
2b8a0 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   it found in the
2b8b0 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6c 69 73   column.  ** lis
2b8c0 74 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  t.  The followin
2b8d0 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20  g code just has 
2b8e0 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b  to locate the TK
2b8f0 5f 41 53 54 45 52 49 53 4b 0a 20 20 2a 2a 20 65  _ASTERISK.  ** e
2b900 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65  xpressions and e
2b910 78 70 61 6e 64 20 65 61 63 68 20 6f 6e 65 20 74  xpand each one t
2b920 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
2b930 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a 20 20 2a  l columns in.  *
2b940 2a 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20  * all tables..  
2b950 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
2b960 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63  t loop just chec
2b970 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ks to see if the
2b980 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f  re are any "*" o
2b990 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68  perators.  ** th
2b9a0 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e  at need expandin
2b9b0 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d  g..  */.  for(k=
2b9c0 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
2b9d0 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 70 45  pr; k++){.    pE
2b9e0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e   = pEList->a[k].
2b9f0 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
2ba00 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49  E->op==TK_ASTERI
2ba10 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  SK ) break;.    
2ba20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
2ba30 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52  TK_DOT || pE->pR
2ba40 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  ight!=0 );.    a
2ba50 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54  ssert( pE->op!=T
2ba60 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c  K_DOT || (pE->pL
2ba70 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c  eft!=0 && pE->pL
2ba80 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20  eft->op==TK_ID) 
2ba90 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  );.    if( pE->o
2baa0 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
2bab0 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f  >pRight->op==TK_
2bac0 41 53 54 45 52 49 53 4b 20 29 20 62 72 65 61 6b  ASTERISK ) break
2bad0 3b 0a 20 20 20 20 65 6c 69 73 74 46 6c 61 67 73  ;.    elistFlags
2bae0 20 7c 3d 20 70 45 2d 3e 66 6c 61 67 73 3b 0a 20   |= pE->flags;. 
2baf0 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73   }.  if( k<pELis
2bb00 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
2bb10 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20  /*.    ** If we 
2bb20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e  get here it mean
2bb30 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
2bb40 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
2bb50 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a   more "*".    **
2bb60 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
2bb70 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
2bb80 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75  ded.  Loop throu
2bb90 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
2bba0 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  on.    ** in the
2bbb0 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20   result set and 
2bbc0 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20  expand them one 
2bbd0 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  by one..    */. 
2bbe0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
2bbf0 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c  st_item *a = pEL
2bc00 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72  ist->a;.    Expr
2bc10 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  List *pNew = 0;.
2bc20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
2bc30 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
2bc40 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e  s;.    int longN
2bc50 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20  ames = (flags & 
2bc60 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
2bc70 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20  mes)!=0.        
2bc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
2bc90 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
2bca0 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d  _ShortColNames)=
2bcb0 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30  =0;..    for(k=0
2bcc0 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
2bcd0 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 70  r; k++){.      p
2bce0 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  E = a[k].pExpr;.
2bcf0 20 20 20 20 20 20 65 6c 69 73 74 46 6c 61 67 73        elistFlags
2bd00 20 7c 3d 20 70 45 2d 3e 66 6c 61 67 73 3b 0a 20   |= pE->flags;. 
2bd10 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45       pRight = pE
2bd20 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
2bd30 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
2bd40 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74  TK_DOT || pRight
2bd50 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
2bd60 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45   pE->op!=TK_ASTE
2bd70 52 49 53 4b 0a 20 20 20 20 20 20 20 26 26 20 28  RISK.       && (
2bd80 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
2bd90 7c 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b  | pRight->op!=TK
2bda0 5f 41 53 54 45 52 49 53 4b 29 0a 20 20 20 20 20  _ASTERISK).     
2bdb0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
2bdc0 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65  his particular e
2bdd0 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e  xpression does n
2bde0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  ot need to be ex
2bdf0 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20  panded..        
2be00 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  */.        pNew 
2be10 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
2be20 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
2be30 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72  pNew, a[k].pExpr
2be40 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2be50 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  New ){.         
2be60 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
2be70 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20  Expr-1].zName = 
2be80 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[k].zName;.    
2be90 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
2bea0 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70  ew->nExpr-1].zSp
2beb0 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b  an = a[k].zSpan;
2bec0 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  .          a[k].
2bed0 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
2bee0 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20       a[k].zSpan 
2bef0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
2bf00 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70         a[k].pExp
2bf10 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  r = 0;.      }el
2bf20 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
2bf30 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69  his expression i
2bf40 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41  s a "*" or a "TA
2bf50 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73  BLE.*" and needs
2bf60 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a   to be.        *
2bf70 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20  * expanded. */. 
2bf80 20 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65         int table
2bf90 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f  Seen = 0;      /
2bfa0 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20  * Set to 1 when 
2bfb0 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f  TABLE matches */
2bfc0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
2bfd0 54 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  TName = 0;      
2bfe0 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65   /* text of name
2bff0 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20   of TABLE */.   
2c000 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d       if( pE->op=
2c010 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20  =TK_DOT ){.     
2c020 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d       assert( pE-
2c030 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20  >pLeft!=0 );.   
2c040 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
2c050 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2c060 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e  pE->pLeft, EP_In
2c070 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
2c080 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45       zTName = pE
2c090 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65  ->pLeft->u.zToke
2c0a0 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
2c0b0 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46       for(i=0, pF
2c0c0 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
2c0d0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
2c0e0 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
2c0f0 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c  {.          Tabl
2c100 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
2c110 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  >pTab;.         
2c120 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20   Select *pSub = 
2c130 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
2c140 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
2c150 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d  zTabName = pFrom
2c160 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20  ->zAlias;.      
2c170 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2c180 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b  zSchemaName = 0;
2c190 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
2c1a0 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  Db;.          if
2c1b0 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b  ( zTabName==0 ){
2c1c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61  .            zTa
2c1d0 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e  bName = pTab->zN
2c1e0 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ame;.          }
2c1f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64  .          if( d
2c200 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2c210 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
2c220 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c     if( pSub==0 |
2c230 7c 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  | (pSub->selFlag
2c240 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f  s & SF_NestedFro
2c250 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)==0 ){.       
2c260 20 20 20 20 20 70 53 75 62 20 3d 20 30 3b 0a 20       pSub = 0;. 
2c270 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
2c280 54 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33  TName && sqlite3
2c290 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20  StrICmp(zTName, 
2c2a0 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  zTabName)!=0 ){.
2c2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
2c2c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2c2d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2c2e0 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
2c2f0 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
2c300 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
2c310 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63  .            zSc
2c320 68 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d  hemaName = iDb>=
2c330 30 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  0 ? db->aDb[iDb]
2c340 2e 7a 44 62 53 4e 61 6d 65 20 3a 20 22 2a 22 3b  .zDbSName : "*";
2c350 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2c360 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
2c370 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
2c380 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2c390 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54  char *zName = pT
2c3a0 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
2c3b0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  e;.            c
2c3c0 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20  har *zColname;  
2c3d0 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20  /* The computed 
2c3e0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  column name */. 
2c3f0 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
2c400 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d  *zToFree;   /* M
2c410 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74  alloced string t
2c420 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
2c430 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  freed */.       
2c440 20 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e       Token sColn
2c450 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ame;  /* Compute
2c460 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73  d column name as
2c470 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20   a token */..   
2c480 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2c490 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20   zName );.      
2c4a0 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
2c4b0 20 26 26 20 70 53 75 62 0a 20 20 20 20 20 20 20   && pSub.       
2c4c0 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
2c4d0 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65 28 70 53  MatchSpanName(pS
2c4e0 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  ub->pEList->a[j]
2c4f0 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d  .zSpan, 0, zTNam
2c500 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20  e, 0)==0.       
2c510 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2c520 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
2c530 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20              }.. 
2c540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
2c550 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72   a column is mar
2c560 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e 27 2c  ked as 'hidden',
2c570 20 6f 6d 69 74 20 69 74 20 66 72 6f 6d 20 74 68   omit it from th
2c580 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20  e expanded.     
2c590 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74         ** result
2c5a0 2d 73 65 74 20 6c 69 73 74 20 75 6e 6c 65 73 73  -set list unless
2c5b0 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73 20   the SELECT has 
2c5c0 74 68 65 20 53 46 5f 49 6e 63 6c 75 64 65 48 69  the SF_IncludeHi
2c5d0 64 64 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20  dden.           
2c5e0 20 2a 2a 20 62 69 74 20 73 65 74 2e 0a 20 20 20   ** bit set..   
2c5f0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2c600 20 20 20 20 20 20 20 20 69 66 28 20 28 70 2d 3e          if( (p->
2c610 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 49 6e  selFlags & SF_In
2c620 63 6c 75 64 65 48 69 64 64 65 6e 29 3d 3d 30 0a  cludeHidden)==0.
2c630 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
2c640 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26  IsHiddenColumn(&
2c650 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 0a  pTab->aCol[j]) .
2c660 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
2c670 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
2c680 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
2c690 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2c6a0 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a   tableSeen = 1;.
2c6b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2c6c0 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d   i>0 && zTName==
2c6d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2c6e0 20 20 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 66     if( (pFrom->f
2c6f0 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  g.jointype & JT_
2c700 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20 20 20 20  NATURAL)!=0.    
2c710 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 74              && t
2c720 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64  ableAndColumnInd
2c730 65 78 28 70 54 61 62 4c 69 73 74 2c 20 69 2c 20  ex(pTabList, i, 
2c740 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20  zName, 0, 0).   
2c750 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
2c760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c770 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f   In a NATURAL jo
2c780 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69  in, omit the joi
2c790 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74  n columns from t
2c7a0 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  he .            
2c7b0 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20      ** table to 
2c7c0 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65  the right of the
2c7d0 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20   join */.       
2c7e0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
2c7f0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
2c800 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
2c810 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69   if( sqlite3IdLi
2c820 73 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70  stIndex(pFrom->p
2c830 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30  Using, zName)>=0
2c840 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c850 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e      /* In a join
2c860 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c   with a USING cl
2c870 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d  ause, omit colum
2c880 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ns in the.      
2c890 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69            ** usi
2c8a0 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74  ng clause from t
2c8b0 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  he table on the 
2c8c0 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20  right. */.      
2c8d0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
2c8e0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
2c8f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2c900 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  }.            pR
2c910 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
2c920 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e  pr(db, TK_ID, zN
2c930 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
2c940 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61    zColname = zNa
2c950 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
2c960 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  zToFree = 0;.   
2c970 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e           if( lon
2c980 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69  gNames || pTabLi
2c990 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20  st->nSrc>1 ){.  
2c9a0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
2c9b0 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20   *pLeft;.       
2c9c0 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73         pLeft = s
2c9d0 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
2c9e0 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b  K_ID, zTabName);
2c9f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2ca00 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
2ca10 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44  xpr(pParse, TK_D
2ca20 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  OT, pLeft, pRigh
2ca30 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
2ca40 20 20 69 66 28 20 7a 53 63 68 65 6d 61 4e 61 6d    if( zSchemaNam
2ca50 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
2ca60 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c       pLeft = sql
2ca70 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
2ca80 49 44 2c 20 7a 53 63 68 65 6d 61 4e 61 6d 65 29  ID, zSchemaName)
2ca90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2caa0 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
2cab0 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
2cac0 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 45  K_DOT, pLeft, pE
2cad0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
2cae0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2caf0 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65      if( longName
2cb00 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
2cb10 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20       zColname = 
2cb20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
2cb30 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62  b, "%s.%s", zTab
2cb40 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  Name, zName);.  
2cb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54                zT
2cb60 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65  oFree = zColname
2cb70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2cb80 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  }.            }e
2cb90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2cba0 20 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68     pExpr = pRigh
2cbb0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  t;.            }
2cbc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65  .            pNe
2cbd0 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
2cbe0 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
2cbf0 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a  , pNew, pExpr);.
2cc00 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2cc10 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 73 43  te3TokenInit(&sC
2cc20 6f 6c 6e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65  olname, zColname
2cc30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
2cc40 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
2cc50 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
2cc60 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30  ew, &sColname, 0
2cc70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2cc80 66 28 20 70 4e 65 77 20 26 26 20 28 70 2d 3e 73  f( pNew && (p->s
2cc90 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73  elFlags & SF_Nes
2cca0 74 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b 0a 20  tedFrom)!=0 ){. 
2ccb0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
2ccc0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
2ccd0 6d 20 2a 70 58 20 3d 20 26 70 4e 65 77 2d 3e 61  m *pX = &pNew->a
2cce0 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b  [pNew->nExpr-1];
2ccf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2cd00 66 28 20 70 53 75 62 20 29 7b 0a 20 20 20 20 20  f( pSub ){.     
2cd10 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a             pX->z
2cd20 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62  Span = sqlite3Db
2cd30 53 74 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d  StrDup(db, pSub-
2cd40 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53  >pEList->a[j].zS
2cd50 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pan);.          
2cd60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2cd70 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a  pX->zSpan==0 );.
2cd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
2cd90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2cda0 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d       pX->zSpan =
2cdb0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
2cdc0 64 62 2c 20 22 25 73 2e 25 73 2e 25 73 22 2c 0a  db, "%s.%s.%s",.
2cdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cdf0 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68 65             zSche
2ce00 6d 61 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65  maName, zTabName
2ce10 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20  , zColname);.   
2ce20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
2ce30 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e  tcase( pX->zSpan
2ce40 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
2ce50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2ce60 20 20 20 20 20 70 58 2d 3e 62 53 70 61 6e 49 73       pX->bSpanIs
2ce70 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Tab = 1;.       
2ce80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2ce90 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2cea0 28 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20  (db, zToFree);. 
2ceb0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2cec0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2ced0 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20   !tableSeen ){. 
2cee0 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
2cef0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
2cf00 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2cf10 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
2cf20 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  uch table: %s", 
2cf30 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  zTName);.       
2cf40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2cf50 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2cf60 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
2cf70 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69  o tables specifi
2cf80 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ed");.          
2cf90 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2cfa0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
2cfb0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2cfc0 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b  ete(db, pEList);
2cfd0 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d  .    p->pEList =
2cfe0 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28   pNew;.  }.  if(
2cff0 20 70 2d 3e 70 45 4c 69 73 74 20 29 7b 0a 20 20   p->pEList ){.  
2d000 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d    if( p->pEList-
2d010 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69  >nExpr>db->aLimi
2d020 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
2d030 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 20 20  OLUMN] ){.      
2d040 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2d050 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
2d060 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73  y columns in res
2d070 75 6c 74 20 73 65 74 22 29 3b 0a 20 20 20 20 20  ult set");.     
2d080 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
2d090 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
2d0a0 20 28 65 6c 69 73 74 46 6c 61 67 73 20 26 20 28   (elistFlags & (
2d0b0 45 50 5f 48 61 73 46 75 6e 63 7c 45 50 5f 53 75  EP_HasFunc|EP_Su
2d0c0 62 71 75 65 72 79 29 29 21 3d 30 20 29 7b 0a 20  bquery))!=0 ){. 
2d0d0 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73       p->selFlags
2d0e0 20 7c 3d 20 53 46 5f 43 6f 6d 70 6c 65 78 52 65   |= SF_ComplexRe
2d0f0 73 75 6c 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  sult;.    }.  }.
2d100 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2d110 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
2d120 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f  No-op routine fo
2d130 72 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65  r the parse-tree
2d140 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57   walker..**.** W
2d150 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2d160 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78   is the Walker.x
2d170 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65  ExprCallback the
2d180 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
2d190 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64  es.** are walked
2d1a0 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74   without any act
2d1b0 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e  ions being taken
2d1c0 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20   at each node.  
2d1d0 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77  Presumably,.** w
2d1e0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2d1f0 20 69 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c   is used for Wal
2d200 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
2d210 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65  k then .** Walke
2d220 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  r.xSelectCallbac
2d230 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73  k is set to do s
2d240 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20  omething useful 
2d250 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75  for every .** su
2d260 62 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61  bquery in the pa
2d270 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e  rser tree..*/.in
2d280 74 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c  t sqlite3ExprWal
2d290 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f  kNoop(Walker *No
2d2a0 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74  tUsed, Expr *Not
2d2b0 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
2d2c0 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
2d2d0 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
2d2e0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2d2f0 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
2d300 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f  No-op routine fo
2d310 72 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65  r the parse-tree
2d320 20 77 61 6c 6b 65 72 20 66 6f 72 20 53 45 4c 45   walker for SELE
2d330 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
2d340 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68  * subquery in th
2d350 65 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a  e parser tree..*
2d360 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
2d370 65 63 74 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b  ectWalkNoop(Walk
2d380 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 53 65 6c  er *NotUsed, Sel
2d390 65 63 74 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a  ect *NotUsed2){.
2d3a0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2d3b0 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
2d3c0 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
2d3d0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
2d3e0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42  ..#if SQLITE_DEB
2d3f0 55 47 0a 2f 2a 0a 2a 2a 20 41 6c 77 61 79 73 20  UG./*.** Always 
2d400 61 73 73 65 72 74 2e 20 20 54 68 69 73 20 78 53  assert.  This xS
2d410 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 69  electCallback2 i
2d420 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 72  mplementation pr
2d430 6f 76 65 73 20 74 68 61 74 20 74 68 65 0a 2a 2a  oves that the.**
2d440 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b   xSelectCallback
2d450 32 20 69 73 20 6e 65 76 65 72 20 69 6e 76 6f 6b  2 is never invok
2d460 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
2d470 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 41 73 73  te3SelectWalkAss
2d480 65 72 74 32 28 57 61 6c 6b 65 72 20 2a 4e 6f 74  ert2(Walker *Not
2d490 55 73 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e 6f  Used, Select *No
2d4a0 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
2d4b0 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
2d4c0 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
2d4d0 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a  .  assert( 0 );.
2d4e0 7d 0a 23 65 6e 64 69 66 0a 2f 2a 0a 2a 2a 20 54  }.#endif./*.** T
2d4f0 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70  his routine "exp
2d500 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20 73  ands" a SELECT s
2d510 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c  tatement and all
2d520 20 6f 66 20 69 74 73 20 73 75 62 71 75 65 72 69   of its subqueri
2d530 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74  es..** For addit
2d540 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
2d550 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61  n on what it mea
2d560 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61  ns to "expand" a
2d570 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
2d580 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f  ment, see the co
2d590 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c  mment on the sel
2d5a0 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72  ectExpand worker
2d5b0 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e   callback above.
2d5c0 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67  .**.** Expanding
2d5d0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
2d5e0 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74  ent is the first
2d5f0 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73   step in process
2d600 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20  ing a.** SELECT 
2d610 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
2d620 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2d630 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65   must be expande
2d640 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65  d before.** name
2d650 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70   resolution is p
2d660 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20  erformed..**.** 
2d670 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  If anything goes
2d680 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72   wrong, an error
2d690 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74   message is writ
2d6a0 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e  ten into pParse.
2d6b0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
2d6c0 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74  function can det
2d6d0 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ect the problem 
2d6e0 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50  by looking at pP
2d6f0 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e  arse->nErr.** an
2d700 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d  d/or pParse->db-
2d710 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a  >mallocFailed..*
2d720 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
2d730 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
2d740 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  d(Parse *pParse,
2d750 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
2d760 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
2d770 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
2d780 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61   = sqlite3ExprWa
2d790 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72  lkNoop;.  w.pPar
2d7a0 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69  se = pParse;.  i
2d7b0 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f  f( OK_IF_ALWAYS_
2d7c0 54 52 55 45 28 70 50 61 72 73 65 2d 3e 68 61 73  TRUE(pParse->has
2d7d0 43 6f 6d 70 6f 75 6e 64 29 20 29 7b 0a 20 20 20  Compound) ){.   
2d7e0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
2d7f0 63 6b 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70  ck = convertComp
2d800 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71  oundSelectToSubq
2d810 75 65 72 79 3b 0a 20 20 20 20 77 2e 78 53 65 6c  uery;.    w.xSel
2d820 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30  ectCallback2 = 0
2d830 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
2d840 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
2d850 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53  ect);.  }.  w.xS
2d860 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
2d870 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a  selectExpander;.
2d880 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
2d890 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f 70  ack2 = selectPop
2d8a0 57 69 74 68 3b 0a 20 20 73 71 6c 69 74 65 33 57  With;.  sqlite3W
2d8b0 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
2d8c0 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e  elect);.}...#ifn
2d8d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2d8e0 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54  SUBQUERY./*.** T
2d8f0 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e  his is a Walker.
2d900 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
2d910 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65  callback for the
2d920 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79   sqlite3SelectTy
2d930 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65  peInfo().** inte
2d940 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  rface..**.** For
2d950 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73   each FROM-claus
2d960 65 20 73 75 62 71 75 65 72 79 2c 20 61 64 64 20  e subquery, add 
2d970 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64  Column.zType and
2d980 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a   Column.zColl.**
2d990 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
2d9a0 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
2d9b0 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65  ure that represe
2d9c0 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  nts the result s
2d9d0 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75  et.** of that su
2d9e0 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  bquery..**.** Th
2d9f0 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
2da00 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74  e that represent
2da10 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
2da20 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64   was constructed
2da30 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70  .** by selectExp
2da40 61 6e 64 65 72 28 29 20 62 75 74 20 74 68 65 20  ander() but the 
2da50 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
2da60 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  on information w
2da70 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74  as omitted.** at
2da80 20 74 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61   that point beca
2da90 75 73 65 20 69 64 65 6e 74 69 66 69 65 72 73 20  use identifiers 
2daa0 68 61 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  had not yet been
2dab0 20 72 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73   resolved.  This
2dac0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63  .** routine is c
2dad0 61 6c 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e  alled after iden
2dae0 74 69 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f  tifier resolutio
2daf0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
2db00 64 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75  d selectAddSubqu
2db10 65 72 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b  eryTypeInfo(Walk
2db20 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
2db30 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
2db40 20 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20   *pParse;.  int 
2db50 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  i;.  SrcList *pT
2db60 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74  abList;.  struct
2db70 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2db80 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  From;..  assert(
2db90 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
2dba0 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20  F_Resolved );.  
2dbb0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
2dbc0 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  & SF_HasTypeInfo
2dbd0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e   ) return;.  p->
2dbe0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48  selFlags |= SF_H
2dbf0 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 70 50  asTypeInfo;.  pP
2dc00 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
2dc10 70 50 61 72 73 65 3b 0a 20 20 70 54 61 62 4c 69  pParse;.  pTabLi
2dc20 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
2dc30 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
2dc40 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
2dc50 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
2dc60 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
2dc70 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
2dc80 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
2dc90 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
2dca0 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62  );.    if( (pTab
2dcb0 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
2dcc0 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b  Ephemeral)!=0 ){
2dcd0 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d  .      /* A sub-
2dce0 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
2dcf0 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
2dd00 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 53 65  LECT */.      Se
2dd10 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72  lect *pSel = pFr
2dd20 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
2dd30 20 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20     if( pSel ){. 
2dd40 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
2dd50 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  el->pPrior ) pSe
2dd60 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
2dd70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2dd80 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e  3SelectAddColumn
2dd90 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
2dda0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
2ddb0 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Sel);.      }.  
2ddc0 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
2ddd0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
2dde0 75 74 69 6e 65 20 61 64 64 73 20 64 61 74 61 74  utine adds datat
2ddf0 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e  ype and collatin
2de00 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72  g sequence infor
2de10 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65  mation to.** the
2de20 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
2de30 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  s of all FROM-cl
2de40 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73 20  ause subqueries 
2de50 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  in a.** SELECT s
2de60 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
2de70 55 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  Use this routine
2de80 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f   after name reso
2de90 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lution..*/.stati
2dea0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  c void sqlite3Se
2deb0 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28  lectAddTypeInfo(
2dec0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
2ded0 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
2dee0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2def0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
2df00 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53  Walker w;.  w.xS
2df10 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
2df20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
2df30 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65  kNoop;.  w.xSele
2df40 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65  ctCallback2 = se
2df50 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54  lectAddSubqueryT
2df60 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78  ypeInfo;.  w.xEx
2df70 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c  prCallback = sql
2df80 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70  ite3ExprWalkNoop
2df90 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
2dfa0 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
2dfb0 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70  WalkSelect(&w, p
2dfc0 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a  Select);.#endif.
2dfd0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
2dfe0 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61  outine sets up a
2dff0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2e000 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  t for processing
2e010 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  .  The.** follow
2e020 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73  ing is accomplis
2e030 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  hed:.**.**     *
2e040 20 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75    VDBE Cursor nu
2e050 6d 62 65 72 73 20 61 72 65 20 61 73 73 69 67 6e  mbers are assign
2e060 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63  ed to all FROM-c
2e070 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20  lause terms..** 
2e080 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c      *  Ephemeral
2e090 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61   Table objects a
2e0a0 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61  re created for a
2e0b0 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ll FROM-clause s
2e0c0 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20  ubqueries..**   
2e0d0 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e    *  ON and USIN
2e0e0 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 73 68  G clauses are sh
2e0f0 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45  ifted into WHERE
2e100 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20   statements.**  
2e110 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20     *  Wildcards 
2e120 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a  "*" and "TABLE.*
2e130 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73  " in result sets
2e140 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a   are expanded..*
2e150 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66  *     *  Identif
2e160 69 65 72 73 20 69 6e 20 65 78 70 72 65 73 73 69  iers in expressi
2e170 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20 74  on are matched t
2e180 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  o tables..**.** 
2e190 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74  This routine act
2e1a0 73 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e  s recursively on
2e1b0 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20   all subqueries 
2e1c0 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43  within the SELEC
2e1d0 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  T..*/.void sqlit
2e1e0 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20  e3SelectPrep(.  
2e1f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2e200 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
2e210 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
2e220 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
2e230 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2e240 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2e250 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
2e260 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
2e270 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d  pOuterNC  /* Nam
2e280 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f  e context for co
2e290 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20  ntainer */.){.  
2e2a0 61 73 73 65 72 74 28 20 70 21 3d 30 20 7c 7c 20  assert( p!=0 || 
2e2b0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
2e2c0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
2e2d0 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
2e2e0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
2e2f0 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65  urn;.  if( p->se
2e300 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54  lFlags & SF_HasT
2e310 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e  ypeInfo ) return
2e320 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
2e330 74 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c 20  tExpand(pParse, 
2e340 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  p);.  if( pParse
2e350 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65  ->nErr || pParse
2e360 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
2e370 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ed ) return;.  s
2e380 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
2e390 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  ectNames(pParse,
2e3a0 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20   p, pOuterNC);. 
2e3b0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
2e3c0 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  r || pParse->db-
2e3d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
2e3e0 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
2e3f0 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e  3SelectAddTypeIn
2e400 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d  fo(pParse, p);.}
2e410 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68  ../*.** Reset th
2e420 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
2e430 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  mulator..**.** T
2e440 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
2e450 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65  umulator is a se
2e460 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  t of memory cell
2e470 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69  s that hold.** i
2e480 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
2e490 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c  lts while calcul
2e4a0 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61  ating an aggrega
2e4b0 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  te.  This.** rou
2e4c0 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
2e4d0 6f 64 65 20 74 68 61 74 20 73 74 6f 72 65 73 20  ode that stores 
2e4e0 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20  NULLs in all of 
2e4f0 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  those memory.** 
2e500 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cells..*/.static
2e510 20 76 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d   void resetAccum
2e520 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
2e530 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
2e540 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
2e550 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
2e560 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
2e570 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
2e580 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 6e  unc *pFunc;.  in
2e590 74 20 6e 52 65 67 20 3d 20 70 41 67 67 49 6e 66  t nReg = pAggInf
2e5a0 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70 41 67 67 49  o->nFunc + pAggI
2e5b0 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  nfo->nColumn;.  
2e5c0 69 66 28 20 6e 52 65 67 3d 3d 30 20 29 20 72 65  if( nReg==0 ) re
2e5d0 74 75 72 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c  turn;.#ifdef SQL
2e5e0 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56  ITE_DEBUG.  /* V
2e5f0 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20 41  erify that all A
2e600 67 67 49 6e 66 6f 20 72 65 67 69 73 74 65 72 73  ggInfo registers
2e610 20 61 72 65 20 77 69 74 68 69 6e 20 74 68 65 20   are within the 
2e620 72 61 6e 67 65 20 73 70 65 63 69 66 69 65 64 20  range specified 
2e630 62 79 0a 20 20 2a 2a 20 41 67 67 49 6e 66 6f 2e  by.  ** AggInfo.
2e640 6d 6e 52 65 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d  mnReg..AggInfo.m
2e650 78 52 65 67 20 2a 2f 0a 20 20 61 73 73 65 72 74  xReg */.  assert
2e660 28 20 6e 52 65 67 3d 3d 70 41 67 67 49 6e 66 6f  ( nReg==pAggInfo
2e670 2d 3e 6d 78 52 65 67 2d 70 41 67 67 49 6e 66 6f  ->mxReg-pAggInfo
2e680 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a 20 20 66  ->mnReg+1 );.  f
2e690 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
2e6a0 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  fo->nColumn; i++
2e6b0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2e6c0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d  AggInfo->aCol[i]
2e6d0 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d  .iMem>=pAggInfo-
2e6e0 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20  >mnReg.         
2e6f0 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  && pAggInfo->aCo
2e700 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49  l[i].iMem<=pAggI
2e710 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20  nfo->mxReg );.  
2e720 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
2e730 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
2e740 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
2e750 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  ( pAggInfo->aFun
2e760 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49  c[i].iMem>=pAggI
2e770 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20  nfo->mnReg.     
2e780 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d      && pAggInfo-
2e790 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d  >aFunc[i].iMem<=
2e7a0 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20  pAggInfo->mxReg 
2e7b0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
2e7c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2e7d0 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  3(v, OP_Null, 0,
2e7e0 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67   pAggInfo->mnReg
2e7f0 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  , pAggInfo->mxRe
2e800 67 29 3b 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d  g);.  for(pFunc=
2e810 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c  pAggInfo->aFunc,
2e820 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f   i=0; i<pAggInfo
2e830 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
2e840 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  unc++){.    if( 
2e850 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
2e860 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70  >=0 ){.      Exp
2e870 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70  r *pE = pFunc->p
2e880 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
2e890 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2e8a0 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49 73 53  erty(pE, EP_xIsS
2e8b0 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
2e8c0 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d  if( pE->x.pList=
2e8d0 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73  =0 || pE->x.pLis
2e8e0 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  t->nExpr!=1 ){. 
2e8f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
2e900 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2e910 44 49 53 54 49 4e 43 54 20 61 67 67 72 65 67 61  DISTINCT aggrega
2e920 74 65 73 20 6d 75 73 74 20 68 61 76 65 20 65 78  tes must have ex
2e930 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20  actly one ".    
2e940 20 20 20 20 20 20 20 22 61 72 67 75 6d 65 6e 74         "argument
2e950 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e  ");.        pFun
2e960 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  c->iDistinct = -
2e970 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
2e980 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20          KeyInfo 
2e990 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69  *pKeyInfo = sqli
2e9a0 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  te3KeyInfoFromEx
2e9b0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2e9c0 45 2d 3e 78 2e 70 4c 69 73 74 2c 30 2c 30 29 3b  E->x.pList,0,0);
2e9d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2e9e0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2e9f0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
2ea00 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
2ea10 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
2ea20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea30 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
2ea40 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
2ea50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2ea60 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
2ea70 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61  e the OP_AggFina
2ea80 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20  lize opcode for 
2ea90 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20  every aggregate 
2eaa0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  function.** in t
2eab0 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63  he AggInfo struc
2eac0 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
2ead0 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67  void finalizeAgg
2eae0 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20  Functions(Parse 
2eaf0 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
2eb00 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
2eb10 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
2eb20 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
2eb30 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
2eb40 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f  o_func *pF;.  fo
2eb50 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
2eb60 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
2eb70 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
2eb80 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78  +, pF++){.    Ex
2eb90 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
2eba0 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  pF->pExpr->x.pLi
2ebb0 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
2ebc0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2ebd0 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78  (pF->pExpr, EP_x
2ebe0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
2ebf0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2ec00 70 32 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61  p2(v, OP_AggFina
2ec10 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69  l, pF->iMem, pLi
2ec20 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
2ec30 72 20 3a 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  r : 0);.    sqli
2ec40 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
2ec50 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34  v, pF->pFunc, P4
2ec60 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d  _FUNCDEF);.  }.}
2ec70 0a 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20  .../*.** Update 
2ec80 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
2ec90 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72  memory cells for
2eca0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61   an aggregate ba
2ecb0 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75  sed on.** the cu
2ecc0 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
2ecd0 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ition..**.** If 
2ece0 72 65 67 41 63 63 20 69 73 20 6e 6f 6e 2d 7a 65  regAcc is non-ze
2ecf0 72 6f 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  ro and there are
2ed00 20 6e 6f 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78   no min() or max
2ed10 28 29 20 61 67 67 72 65 67 61 74 65 73 0a 2a 2a  () aggregates.**
2ed20 20 69 6e 20 70 41 67 67 49 6e 66 6f 2c 20 74 68   in pAggInfo, th
2ed30 65 6e 20 6f 6e 6c 79 20 70 6f 70 75 6c 61 74 65  en only populate
2ed40 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 6e   the pAggInfo->n
2ed50 41 63 63 75 6d 75 6c 61 74 6f 72 20 61 63 63 75  Accumulator accu
2ed60 6d 75 6c 61 74 6f 72 0a 2a 2a 20 72 65 67 69 73  mulator.** regis
2ed70 74 65 72 73 20 69 20 72 65 67 69 73 74 65 72 20  ters i register 
2ed80 72 65 67 41 63 63 20 63 6f 6e 74 61 69 6e 73 20  regAcc contains 
2ed90 30 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  0. The caller wi
2eda0 6c 6c 20 74 61 6b 65 20 63 61 72 65 0a 2a 2a 20  ll take care.** 
2edb0 6f 66 20 73 65 74 74 69 6e 67 20 61 6e 64 20 63  of setting and c
2edc0 6c 65 61 72 69 6e 67 20 72 65 67 41 63 63 2e 0a  learing regAcc..
2edd0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
2ede0 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
2edf0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2ee00 69 6e 74 20 72 65 67 41 63 63 2c 20 41 67 67 49  int regAcc, AggI
2ee10 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
2ee20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
2ee30 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
2ee40 20 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74   i;.  int regHit
2ee50 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72   = 0;.  int addr
2ee60 48 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73  HitTest = 0;.  s
2ee70 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
2ee80 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74  nc *pF;.  struct
2ee90 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
2eea0 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64  ;..  pAggInfo->d
2eeb0 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20  irectMode = 1;. 
2eec0 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
2eed0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
2eee0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
2eef0 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
2ef00 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69   int nArg;.    i
2ef10 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b  nt addrNext = 0;
2ef20 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b  .    int regAgg;
2ef30 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
2ef40 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
2ef50 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61  ->x.pList;.    a
2ef60 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2ef70 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70  roperty(pF->pExp
2ef80 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
2ef90 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
2efa0 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  t ){.      nArg 
2efb0 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
2efc0 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73        regAgg = s
2efd0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
2efe0 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29  ge(pParse, nArg)
2eff0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2f000 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
2f010 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72  pParse, pList, r
2f020 65 67 41 67 67 2c 20 30 2c 20 53 51 4c 49 54 45  egAgg, 0, SQLITE
2f030 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20  _ECEL_DUP);.    
2f040 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72  }else{.      nAr
2f050 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67  g = 0;.      reg
2f060 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Agg = 0;.    }. 
2f070 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74     if( pF->iDist
2f080 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  inct>=0 ){.     
2f090 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69   addrNext = sqli
2f0a0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
2f0b0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
2f0c0 74 65 73 74 63 61 73 65 28 20 6e 41 72 67 3d 3d  testcase( nArg==
2f0d0 30 20 29 3b 20 20 2f 2a 20 45 72 72 6f 72 20 63  0 );  /* Error c
2f0e0 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  ondition */.    
2f0f0 20 20 74 65 73 74 63 61 73 65 28 20 6e 41 72 67    testcase( nArg
2f100 3e 31 20 29 3b 20 20 20 2f 2a 20 41 6c 73 6f 20  >1 );   /* Also 
2f110 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
2f120 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70    codeDistinct(p
2f130 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69 73 74  Parse, pF->iDist
2f140 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20  inct, addrNext, 
2f150 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20  1, regAgg);.    
2f160 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46  }.    if( pF->pF
2f170 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  unc->funcFlags &
2f180 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
2f190 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43  DCOLL ){.      C
2f1a0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
2f1b0 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  0;.      struct 
2f1c0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
2f1d0 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Item;.      int 
2f1e0 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  j;.      assert(
2f1f0 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a   pList!=0 );  /*
2f200 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d   pList!=0 if pF-
2f210 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45 44 43  >pFunc has NEEDC
2f220 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  OLL */.      for
2f230 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (j=0, pItem=pLis
2f240 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20  t->a; !pColl && 
2f250 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74  j<nArg; j++, pIt
2f260 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
2f270 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
2f280 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
2f290 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
2f2a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2f2b0 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
2f2c0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61       pColl = pPa
2f2d0 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
2f2e0 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
2f2f0 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d 30 20    if( regHit==0 
2f300 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63  && pAggInfo->nAc
2f310 63 75 6d 75 6c 61 74 6f 72 20 29 20 72 65 67 48  cumulator ) regH
2f320 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  it = ++pParse->n
2f330 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
2f340 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
2f350 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48  OP_CollSeq, regH
2f360 69 74 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20  it, 0, 0, (char 
2f370 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
2f380 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  SEQ);.    }.    
2f390 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2f3a0 33 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c  3(v, OP_AggStep,
2f3b0 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46 2d 3e   0, regAgg, pF->
2f3c0 69 4d 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74  iMem);.    sqlit
2f3d0 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
2f3e0 2c 20 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f  , pF->pFunc, P4_
2f3f0 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71  FUNCDEF);.    sq
2f400 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2f410 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a  5(v, (u8)nArg);.
2f420 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
2f430 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
2f440 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67  se, regAgg, nArg
2f450 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e  );.    if( addrN
2f460 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ext ){.      sql
2f470 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
2f480 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74  abel(v, addrNext
2f490 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
2f4a0 66 28 20 72 65 67 48 69 74 3d 3d 30 20 26 26 20  f( regHit==0 && 
2f4b0 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d  pAggInfo->nAccum
2f4c0 75 6c 61 74 6f 72 20 29 7b 0a 20 20 20 20 72 65  ulator ){.    re
2f4d0 67 48 69 74 20 3d 20 72 65 67 41 63 63 3b 0a 20  gHit = regAcc;. 
2f4e0 20 7d 0a 20 20 69 66 28 20 72 65 67 48 69 74 20   }.  if( regHit 
2f4f0 29 7b 0a 20 20 20 20 61 64 64 72 48 69 74 54 65  ){.    addrHitTe
2f500 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
2f510 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c  AddOp1(v, OP_If,
2f520 20 72 65 67 48 69 74 29 3b 20 56 64 62 65 43 6f   regHit); VdbeCo
2f530 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20  verage(v);.  }. 
2f540 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67   for(i=0, pC=pAg
2f550 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70  gInfo->aCol; i<p
2f560 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75  AggInfo->nAccumu
2f570 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b  lator; i++, pC++
2f580 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
2f590 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
2f5a0 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d  C->pExpr, pC->iM
2f5b0 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49  em);.  }.  pAggI
2f5c0 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
2f5d0 3d 20 30 3b 0a 20 20 69 66 28 20 61 64 64 72 48  = 0;.  if( addrH
2f5e0 69 74 54 65 73 74 20 29 7b 0a 20 20 20 20 73 71  itTest ){.    sq
2f5f0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2f600 65 28 76 2c 20 61 64 64 72 48 69 74 54 65 73 74  e(v, addrHitTest
2f610 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2f620 41 64 64 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f  Add a single OP_
2f630 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74  Explain instruct
2f640 69 6f 6e 20 74 6f 20 74 68 65 20 56 44 42 45 20  ion to the VDBE 
2f650 74 6f 20 65 78 70 6c 61 69 6e 20 61 20 73 69 6d  to explain a sim
2f660 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20  ple.** count(*) 
2f670 71 75 65 72 79 20 28 22 53 45 4c 45 43 54 20 63  query ("SELECT c
2f680 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54 61  ount(*) FROM pTa
2f690 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  b")..*/.#ifndef 
2f6a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
2f6b0 41 49 4e 0a 73 74 61 74 69 63 20 76 6f 69 64 20  AIN.static void 
2f6c0 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75  explainSimpleCou
2f6d0 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
2f6e0 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
2f6f0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
2f700 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
2f710 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
2f720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2f730 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69  able being queri
2f740 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
2f750 49 64 78 20 20 20 20 20 20 20 20 20 20 20 20 20  Idx             
2f760 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2f770 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a   used to optimiz
2f780 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20  e scan, or NULL 
2f790 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72  */.){.  if( pPar
2f7a0 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
2f7b0 7b 0a 20 20 20 20 69 6e 74 20 62 43 6f 76 65 72  {.    int bCover
2f7c0 20 3d 20 28 70 49 64 78 21 3d 30 20 26 26 20 28   = (pIdx!=0 && (
2f7d0 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c  HasRowid(pTab) |
2f7e0 7c 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49  | !IsPrimaryKeyI
2f7f0 6e 64 65 78 28 70 49 64 78 29 29 29 3b 0a 20 20  ndex(pIdx)));.  
2f800 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70    sqlite3VdbeExp
2f810 6c 61 69 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  lain(pParse, 0, 
2f820 22 53 43 41 4e 20 54 41 42 4c 45 20 25 73 25 73  "SCAN TABLE %s%s
2f830 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61  %s",.        pTa
2f840 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
2f850 20 20 62 43 6f 76 65 72 20 3f 20 22 20 55 53 49    bCover ? " USI
2f860 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  NG COVERING INDE
2f870 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20 20  X " : "",.      
2f880 20 20 62 43 6f 76 65 72 20 3f 20 70 49 64 78 2d    bCover ? pIdx-
2f890 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20 20  >zName : "".    
2f8a0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
2f8b0 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53   define explainS
2f8c0 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63  impleCount(a,b,c
2f8d0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
2f8e0 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
2f8f0 29 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20  ) callback used 
2f900 62 79 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65  by havingToWhere
2f910 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ()..**.** If the
2f920 20 6e 6f 64 65 20 70 61 73 73 65 64 20 74 6f 20   node passed to 
2f930 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 69 73 20  the callback is 
2f940 61 20 54 4b 5f 41 4e 44 20 6e 6f 64 65 2c 20 72  a TK_AND node, r
2f950 65 74 75 72 6e 20 0a 2a 2a 20 57 52 43 5f 43 6f  eturn .** WRC_Co
2f960 6e 74 69 6e 75 65 20 74 6f 20 74 65 6c 6c 20 73  ntinue to tell s
2f970 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29  qlite3WalkExpr()
2f980 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
2f990 75 67 68 20 63 68 69 6c 64 20 6e 6f 64 65 73 2e  ugh child nodes.
2f9a0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
2f9b0 2c 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75  , return WRC_Pru
2f9c0 6e 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ne. In this case
2f9d0 2c 20 61 6c 73 6f 20 63 68 65 63 6b 20 69 66 20  , also check if 
2f9e0 74 68 65 20 0a 2a 2a 20 73 75 62 2d 65 78 70 72  the .** sub-expr
2f9f0 65 73 73 69 6f 6e 20 6d 61 74 63 68 65 73 20 74  ession matches t
2fa00 68 65 20 63 72 69 74 65 72 69 61 20 66 6f 72 20  he criteria for 
2fa10 62 65 69 6e 67 20 6d 6f 76 65 64 20 74 6f 20 74  being moved to t
2fa20 68 65 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75  he WHERE.** clau
2fa30 73 65 2e 20 49 66 20 73 6f 2c 20 61 64 64 20 69  se. If so, add i
2fa40 74 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  t to the WHERE c
2fa50 6c 61 75 73 65 20 61 6e 64 20 72 65 70 6c 61 63  lause and replac
2fa60 65 20 74 68 65 20 73 75 62 2d 65 78 70 72 65 73  e the sub-expres
2fa70 73 69 6f 6e 0a 2a 2a 20 77 69 74 68 69 6e 20 74  sion.** within t
2fa80 68 65 20 48 41 56 49 4e 47 20 65 78 70 72 65 73  he HAVING expres
2fa90 73 69 6f 6e 20 77 69 74 68 20 61 20 63 6f 6e 73  sion with a cons
2faa0 74 61 6e 74 20 22 31 22 2e 0a 2a 2f 0a 73 74 61  tant "1"..*/.sta
2fab0 74 69 63 20 69 6e 74 20 68 61 76 69 6e 67 54 6f  tic int havingTo
2fac0 57 68 65 72 65 45 78 70 72 43 62 28 57 61 6c 6b  WhereExprCb(Walk
2fad0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
2fae0 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28  r *pExpr){.  if(
2faf0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
2fb00 4e 44 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ND ){.    Select
2fb10 20 2a 70 53 20 3d 20 70 57 61 6c 6b 65 72 2d 3e   *pS = pWalker->
2fb20 75 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69  u.pSelect;.    i
2fb30 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
2fb40 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42  ConstantOrGroupB
2fb50 79 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  y(pWalker->pPars
2fb60 65 2c 20 70 45 78 70 72 2c 20 70 53 2d 3e 70 47  e, pExpr, pS->pG
2fb70 72 6f 75 70 42 79 29 20 29 7b 0a 20 20 20 20 20  roupBy) ){.     
2fb80 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2fb90 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2d 3e  Walker->pParse->
2fba0 64 62 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  db;.      Expr *
2fbb0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
2fbc0 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49  prAlloc(db, TK_I
2fbd0 4e 54 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33  NTEGER, &sqlite3
2fbe0 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29  IntTokens[1], 0)
2fbf0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
2fc00 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
2fc10 20 2a 70 57 68 65 72 65 20 3d 20 70 53 2d 3e 70   *pWhere = pS->p
2fc20 57 68 65 72 65 3b 0a 20 20 20 20 20 20 20 20 53  Where;.        S
2fc30 57 41 50 28 45 78 70 72 2c 20 2a 70 4e 65 77 2c  WAP(Expr, *pNew,
2fc40 20 2a 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20   *pExpr);.      
2fc50 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
2fc60 45 78 70 72 41 6e 64 28 64 62 2c 20 70 57 68 65  ExprAnd(db, pWhe
2fc70 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  re, pNew);.     
2fc80 20 20 20 70 53 2d 3e 70 57 68 65 72 65 20 3d 20     pS->pWhere = 
2fc90 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 57  pNew;.        pW
2fca0 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31  alker->eCode = 1
2fcb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2fcc0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
2fcd0 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rune;.  }.  retu
2fce0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2fcf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66  .}../*.** Transf
2fd00 65 72 20 65 6c 69 67 69 62 6c 65 20 74 65 72 6d  er eligible term
2fd10 73 20 66 72 6f 6d 20 74 68 65 20 48 41 56 49 4e  s from the HAVIN
2fd20 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 71 75  G clause of a qu
2fd30 65 72 79 2c 20 77 68 69 63 68 20 69 73 0a 2a 2a  ery, which is.**
2fd40 20 70 72 6f 63 65 73 73 65 64 20 61 66 74 65 72   processed after
2fd50 20 67 72 6f 75 70 69 6e 67 2c 20 74 6f 20 74 68   grouping, to th
2fd60 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20  e WHERE clause, 
2fd70 77 68 69 63 68 20 69 73 20 70 72 6f 63 65 73 73  which is process
2fd80 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 67 72 6f  ed before.** gro
2fd90 75 70 69 6e 67 2e 20 46 6f 72 20 65 78 61 6d 70  uping. For examp
2fda0 6c 65 2c 20 74 68 65 20 71 75 65 72 79 3a 0a 2a  le, the query:.*
2fdb0 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20  *.**   SELECT * 
2fdc0 46 52 4f 4d 20 3c 74 61 62 6c 65 73 3e 20 57 48  FROM <tables> WH
2fdd0 45 52 45 20 61 3d 3f 20 47 52 4f 55 50 20 42 59  ERE a=? GROUP BY
2fde0 20 62 20 48 41 56 49 4e 47 20 62 3d 3f 20 41 4e   b HAVING b=? AN
2fdf0 44 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 63 61 6e 20  D c=?.**.** can 
2fe00 62 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 3a  be rewritten as:
2fe10 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
2fe20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c 65 73 3e 20  * FROM <tables> 
2fe30 57 48 45 52 45 20 61 3d 3f 20 41 4e 44 20 62 3d  WHERE a=? AND b=
2fe40 3f 20 47 52 4f 55 50 20 42 59 20 62 20 48 41 56  ? GROUP BY b HAV
2fe50 49 4e 47 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 41 20  ING c=?.**.** A 
2fe60 74 65 72 6d 20 6f 66 20 74 68 65 20 48 41 56 49  term of the HAVI
2fe70 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  NG expression is
2fe80 20 65 6c 69 67 69 62 6c 65 20 66 6f 72 20 74 72   eligible for tr
2fe90 61 6e 73 66 65 72 20 69 66 20 69 74 20 63 6f 6e  ansfer if it con
2fea0 73 69 73 74 73 0a 2a 2a 20 65 6e 74 69 72 65 6c  sists.** entirel
2feb0 79 20 6f 66 20 63 6f 6e 73 74 61 6e 74 73 20 61  y of constants a
2fec0 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  nd expressions t
2fed0 68 61 74 20 61 72 65 20 61 6c 73 6f 20 47 52 4f  hat are also GRO
2fee0 55 50 20 42 59 20 74 65 72 6d 73 20 74 68 61 74  UP BY terms that
2fef0 0a 2a 2a 20 75 73 65 20 74 68 65 20 22 42 49 4e  .** use the "BIN
2ff00 41 52 59 22 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  ARY" collation s
2ff10 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74  equence..*/.stat
2ff20 69 63 20 76 6f 69 64 20 68 61 76 69 6e 67 54 6f  ic void havingTo
2ff30 57 68 65 72 65 28 50 61 72 73 65 20 2a 70 50 61  Where(Parse *pPa
2ff40 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
2ff50 0a 20 20 57 61 6c 6b 65 72 20 73 57 61 6c 6b 65  .  Walker sWalke
2ff60 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 61  r;.  memset(&sWa
2ff70 6c 6b 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  lker, 0, sizeof(
2ff80 73 57 61 6c 6b 65 72 29 29 3b 0a 20 20 73 57 61  sWalker));.  sWa
2ff90 6c 6b 65 72 2e 70 50 61 72 73 65 20 3d 20 70 50  lker.pParse = pP
2ffa0 61 72 73 65 3b 0a 20 20 73 57 61 6c 6b 65 72 2e  arse;.  sWalker.
2ffb0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
2ffc0 68 61 76 69 6e 67 54 6f 57 68 65 72 65 45 78 70  havingToWhereExp
2ffd0 72 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 75  rCb;.  sWalker.u
2ffe0 2e 70 53 65 6c 65 63 74 20 3d 20 70 3b 0a 20 20  .pSelect = p;.  
2fff0 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
30000 26 73 57 61 6c 6b 65 72 2c 20 70 2d 3e 70 48 61  &sWalker, p->pHa
30010 76 69 6e 67 29 3b 0a 23 69 66 20 53 45 4c 45 43  ving);.#if SELEC
30020 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
30030 20 69 66 28 20 73 57 61 6c 6b 65 72 2e 65 43 6f   if( sWalker.eCo
30040 64 65 20 26 26 20 28 73 71 6c 69 74 65 33 53 65  de && (sqlite3Se
30050 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
30060 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 53 45 4c  0)!=0 ){.    SEL
30070 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70  ECTTRACE(0x100,p
30080 50 61 72 73 65 2c 70 2c 28 22 4d 6f 76 65 20 48  Parse,p,("Move H
30090 41 56 49 4e 47 20 74 65 72 6d 73 20 69 6e 74 6f  AVING terms into
300a0 20 57 48 45 52 45 3a 5c 6e 22 29 29 3b 0a 20 20   WHERE:\n"));.  
300b0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
300c0 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
300d0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
300e0 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
300f0 65 65 20 69 66 20 74 68 65 20 70 54 68 69 73 20  ee if the pThis 
30100 65 6e 74 72 79 20 6f 66 20 70 54 61 62 4c 69 73  entry of pTabLis
30110 74 20 69 73 20 61 20 73 65 6c 66 2d 6a 6f 69 6e  t is a self-join
30120 20 6f 66 20 61 20 70 72 69 6f 72 20 76 69 65 77   of a prior view
30130 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74  ..** If it is, t
30140 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 53  hen return the S
30150 72 63 4c 69 73 74 5f 69 74 65 6d 20 66 6f 72 20  rcList_item for 
30160 74 68 65 20 70 72 69 6f 72 20 76 69 65 77 2e 20  the prior view. 
30170 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 0a 2a   If it is not,.*
30180 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30 2e  * then return 0.
30190 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
301a0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
301b0 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28 0a  isSelfJoinView(.
301c0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
301d0 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ist,           /
301e0 2a 20 53 65 61 72 63 68 20 66 6f 72 20 73 65 6c  * Search for sel
301f0 66 2d 6a 6f 69 6e 73 20 69 6e 20 74 68 69 73 20  f-joins in this 
30200 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
30210 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
30220 69 74 65 6d 20 2a 70 54 68 69 73 20 20 20 2f 2a  item *pThis   /*
30230 20 53 65 61 72 63 68 20 66 6f 72 20 70 72 69 6f   Search for prio
30240 72 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  r reference to t
30250 68 69 73 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  his subquery */.
30260 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  ){.  struct SrcL
30270 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
30280 0a 20 20 66 6f 72 28 70 49 74 65 6d 20 3d 20 70  .  for(pItem = p
30290 54 61 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74 65  TabList->a; pIte
302a0 6d 3c 70 54 68 69 73 3b 20 70 49 74 65 6d 2b 2b  m<pThis; pItem++
302b0 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
302c0 53 31 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  S1;.    if( pIte
302d0 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20  m->pSelect==0 ) 
302e0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
302f0 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43  ( pItem->fg.viaC
30300 6f 72 6f 75 74 69 6e 65 20 29 20 63 6f 6e 74 69  oroutine ) conti
30310 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49 74  nue;.    if( pIt
30320 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 20 63  em->zName==0 ) c
30330 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
30340 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
30350 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  (pItem->zDatabas
30360 65 2c 20 70 54 68 69 73 2d 3e 7a 44 61 74 61 62  e, pThis->zDatab
30370 61 73 65 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  ase)!=0 ) contin
30380 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ue;.    if( sqli
30390 74 65 33 5f 73 74 72 69 63 6d 70 28 70 49 74 65  te3_stricmp(pIte
303a0 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54 68 69 73 2d  m->zName, pThis-
303b0 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 20 63 6f 6e  >zName)!=0 ) con
303c0 74 69 6e 75 65 3b 0a 20 20 20 20 70 53 31 20 3d  tinue;.    pS1 =
303d0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b   pItem->pSelect;
303e0 0a 20 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e  .    if( pThis->
303f0 70 53 65 6c 65 63 74 2d 3e 73 65 6c 49 64 21 3d  pSelect->selId!=
30400 70 53 31 2d 3e 73 65 6c 49 64 20 29 7b 0a 20 20  pS1->selId ){.  
30410 20 20 20 20 2f 2a 20 54 68 65 20 71 75 65 72 79      /* The query
30420 20 66 6c 61 74 74 65 6e 65 72 20 6c 65 66 74 20   flattener left 
30430 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20 43 54  two different CT
30440 45 20 74 61 62 6c 65 73 20 77 69 74 68 20 69 64  E tables with id
30450 65 6e 74 69 63 61 6c 0a 20 20 20 20 20 20 2a 2a  entical.      **
30460 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 73 61   names in the sa
30470 6d 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  me FROM clause. 
30480 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  */.      continu
30490 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
304a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
304b0 61 72 65 28 30 2c 20 70 54 68 69 73 2d 3e 70 53  are(0, pThis->pS
304c0 65 6c 65 63 74 2d 3e 70 57 68 65 72 65 2c 20 70  elect->pWhere, p
304d0 53 31 2d 3e 70 57 68 65 72 65 2c 20 2d 31 29 20  S1->pWhere, -1) 
304e0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
304f0 76 69 65 77 20 77 61 73 20 6d 6f 64 69 66 69 65  view was modifie
30500 64 20 62 79 20 73 6f 6d 65 20 6f 74 68 65 72 20  d by some other 
30510 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 73 75 63  optimization suc
30520 68 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 70 75  h as.      ** pu
30530 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73  shDownWhereTerms
30540 28 29 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74  () */.      cont
30550 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
30560 72 65 74 75 72 6e 20 70 49 74 65 6d 3b 0a 20 20  return pItem;.  
30570 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
30580 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
30590 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d  OUNTOFVIEW_OPTIM
305a0 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41 74  IZATION./*.** At
305b0 74 65 6d 70 74 20 74 6f 20 74 72 61 6e 73 66 6f  tempt to transfo
305c0 72 6d 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  rm a query of th
305d0 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20  e form.**.**    
305e0 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
305f0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 20 46  FROM (SELECT x F
30600 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 41 4c 4c  ROM t1 UNION ALL
30610 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74   SELECT y FROM t
30620 32 29 0a 2a 2a 0a 2a 2a 20 49 6e 74 6f 20 74 68  2).**.** Into th
30630 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  is:.**.**    SEL
30640 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 75 6e  ECT (SELECT coun
30650 74 28 2a 29 20 46 52 4f 4d 20 74 31 29 2b 28 53  t(*) FROM t1)+(S
30660 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
30670 52 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a 20 54 68  ROM t2).**.** Th
30680 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  e transformation
30690 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 61   only works if a
306a0 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
306b0 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
306c0 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20 73 75 62  .**   *  The sub
306d0 71 75 65 72 79 20 69 73 20 61 20 55 4e 49 4f 4e  query is a UNION
306e0 20 41 4c 4c 20 6f 66 20 74 77 6f 20 6f 72 20 6d   ALL of two or m
306f0 6f 72 65 20 74 65 72 6d 73 0a 2a 2a 20 20 20 2a  ore terms.**   *
30700 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
30710 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 4c  oes not have a L
30720 49 4d 49 54 20 63 6c 61 75 73 65 0a 2a 2a 20 20  IMIT clause.**  
30730 20 2a 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20   *  There is no 
30740 57 48 45 52 45 20 6f 72 20 47 52 4f 55 50 20 42  WHERE or GROUP B
30750 59 20 6f 72 20 48 41 56 49 4e 47 20 63 6c 61 75  Y or HAVING clau
30760 73 65 73 20 6f 6e 20 74 68 65 20 73 75 62 71 75  ses on the subqu
30770 65 72 69 65 73 0a 2a 2a 20 20 20 2a 20 20 54 68  eries.**   *  Th
30780 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
30790 20 61 20 73 69 6d 70 6c 65 20 63 6f 75 6e 74 28   a simple count(
307a0 2a 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  *).**.** Return 
307b0 54 52 55 45 20 69 66 20 74 68 65 20 6f 70 74 69  TRUE if the opti
307c0 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 6e 64 65  mization is unde
307d0 72 74 61 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69  rtaken..*/.stati
307e0 63 20 69 6e 74 20 63 6f 75 6e 74 4f 66 56 69 65  c int countOfVie
307f0 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28 50 61  wOptimization(Pa
30800 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
30810 65 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63  ect *p){.  Selec
30820 74 20 2a 70 53 75 62 2c 20 2a 70 50 72 69 6f 72  t *pSub, *pPrior
30830 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b  ;.  Expr *pExpr;
30840 0a 20 20 45 78 70 72 20 2a 70 43 6f 75 6e 74 3b  .  Expr *pCount;
30850 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
30860 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
30870 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
30880 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  e)==0 ) return 0
30890 3b 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61  ;   /* This is a
308a0 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20  n aggregate */. 
308b0 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e   if( p->pEList->
308c0 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72  nExpr!=1 ) retur
308d0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
308e0 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 72 65 73     /* Single res
308f0 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ult column */.  
30900 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  pExpr = p->pELis
30910 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
30920 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
30930 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
30940 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
30950 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 69 73 20     /* Result is 
30960 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a  an aggregate */.
30970 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
30980 72 69 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  ricmp(pExpr->u.z
30990 54 6f 6b 65 6e 2c 22 63 6f 75 6e 74 22 29 20 29  Token,"count") )
309a0 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 49   return 0;  /* I
309b0 73 20 63 6f 75 6e 74 28 29 20 2a 2f 0a 20 20 69  s count() */.  i
309c0 66 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  f( pExpr->x.pLis
309d0 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t!=0 ) return 0;
309e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
309f0 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 75 6e   /* Must be coun
30a00 74 28 2a 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d  t(*) */.  if( p-
30a10 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29  >pSrc->nSrc!=1 )
30a20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
30a30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
30a40 6e 65 20 74 61 62 6c 65 20 69 6e 20 46 52 4f 4d  ne table in FROM
30a50 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 2d    */.  pSub = p-
30a60 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
30a70 65 63 74 3b 0a 20 20 69 66 28 20 70 53 75 62 3d  ect;.  if( pSub=
30a80 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
30a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
30ab0 46 52 4f 4d 20 69 73 20 61 20 73 75 62 71 75 65  FROM is a subque
30ac0 72 79 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  ry */.  if( pSub
30ad0 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65  ->pPrior==0 ) re
30ae0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
30af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73            /* Mus
30b00 74 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t be a compound 
30b10 72 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20  ry */.  do{.    
30b20 69 66 28 20 70 53 75 62 2d 3e 6f 70 21 3d 54 4b  if( pSub->op!=TK
30b30 5f 41 4c 4c 20 26 26 20 70 53 75 62 2d 3e 70 50  _ALL && pSub->pP
30b40 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b  rior ) return 0;
30b50 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 55 4e 49    /* Must be UNI
30b60 4f 4e 20 41 4c 4c 20 2a 2f 0a 20 20 20 20 69 66  ON ALL */.    if
30b70 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29  ( pSub->pWhere )
30b80 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
30b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ba0 2f 2a 20 4e 6f 20 57 48 45 52 45 20 63 6c 61 75  /* No WHERE clau
30bb0 73 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  se */.    if( pS
30bc0 75 62 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74  ub->pLimit ) ret
30bd0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
30be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
30bf0 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a  o LIMIT clause *
30c00 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  /.    if( pSub->
30c10 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
30c20 67 72 65 67 61 74 65 20 29 20 72 65 74 75 72 6e  gregate ) return
30c30 20 30 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61   0;     /* Not a
30c40 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20  n aggregate */. 
30c50 20 20 20 70 53 75 62 20 3d 20 70 53 75 62 2d 3e     pSub = pSub->
30c60 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 20 20  pPrior;         
30c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c80 20 20 20 20 20 2f 2a 20 52 65 70 65 61 74 20 6f       /* Repeat o
30c90 76 65 72 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a  ver compound */.
30ca0 20 20 7d 77 68 69 6c 65 28 20 70 53 75 62 20 29    }while( pSub )
30cb0 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  ;..  /* If we re
30cc0 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20 74  ach this point t
30cd0 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 74 6f 20  hen it is OK to 
30ce0 70 65 72 66 6f 72 6d 20 74 68 65 20 74 72 61 6e  perform the tran
30cf0 73 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 20  sformation */.. 
30d00 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
30d10 3b 0a 20 20 70 43 6f 75 6e 74 20 3d 20 70 45 78  ;.  pCount = pEx
30d20 70 72 3b 0a 20 20 70 45 78 70 72 20 3d 20 30 3b  pr;.  pExpr = 0;
30d30 0a 20 20 70 53 75 62 20 3d 20 70 2d 3e 70 53 72  .  pSub = p->pSr
30d40 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b  c->a[0].pSelect;
30d50 0a 20 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d  .  p->pSrc->a[0]
30d60 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20  .pSelect = 0;.  
30d70 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
30d80 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53 72 63  lete(db, p->pSrc
30d90 29 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 73  );.  p->pSrc = s
30da0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
30db0 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
30dc0 69 7a 65 6f 66 28 2a 70 2d 3e 70 53 72 63 29 29  izeof(*p->pSrc))
30dd0 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 75 62 20  ;.  while( pSub 
30de0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 54 65  ){.    Expr *pTe
30df0 72 6d 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d  rm;.    pPrior =
30e00 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 0a 20   pSub->pPrior;. 
30e10 20 20 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20     pSub->pPrior 
30e20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70  = 0;.    pSub->p
30e30 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 70 53  Next = 0;.    pS
30e40 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  ub->selFlags |= 
30e50 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20  SF_Aggregate;.  
30e60 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73    pSub->selFlags
30e70 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64   &= ~SF_Compound
30e80 3b 0a 20 20 20 20 70 53 75 62 2d 3e 6e 53 65 6c  ;.    pSub->nSel
30e90 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20  ectRow = 0;.    
30ea0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
30eb0 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 2d 3e  elete(db, pSub->
30ec0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 54 65  pEList);.    pTe
30ed0 72 6d 20 3d 20 70 50 72 69 6f 72 20 3f 20 73 71  rm = pPrior ? sq
30ee0 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
30ef0 20 70 43 6f 75 6e 74 2c 20 30 29 20 3a 20 70 43   pCount, 0) : pC
30f00 6f 75 6e 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e  ount;.    pSub->
30f10 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pEList = sqlite3
30f20 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
30f30 50 61 72 73 65 2c 20 30 2c 20 70 54 65 72 6d 29  Parse, 0, pTerm)
30f40 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71  ;.    pTerm = sq
30f50 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
30f60 65 2c 20 54 4b 5f 53 45 4c 45 43 54 2c 20 30 2c  e, TK_SELECT, 0,
30f70 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
30f80 50 45 78 70 72 41 64 64 53 65 6c 65 63 74 28 70  PExprAddSelect(p
30f90 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 53  Parse, pTerm, pS
30fa0 75 62 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  ub);.    if( pEx
30fb0 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  pr==0 ){.      p
30fc0 45 78 70 72 20 3d 20 70 54 65 72 6d 3b 0a 20 20  Expr = pTerm;.  
30fd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
30fe0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
30ff0 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 50  xpr(pParse, TK_P
31000 4c 55 53 2c 20 70 54 65 72 6d 2c 20 70 45 78 70  LUS, pTerm, pExp
31010 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  r);.    }.    pS
31020 75 62 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 7d  ub = pPrior;.  }
31030 0a 20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  .  p->pEList->a[
31040 30 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72  0].pExpr = pExpr
31050 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ;.  p->selFlags 
31060 26 3d 20 7e 53 46 5f 41 67 67 72 65 67 61 74 65  &= ~SF_Aggregate
31070 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ;..#if SELECTTRA
31080 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
31090 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
310a0 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20  ace & 0x400 ){. 
310b0 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
310c0 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x400,pParse,p,("
310d0 41 66 74 65 72 20 63 6f 75 6e 74 2d 6f 66 2d 76  After count-of-v
310e0 69 65 77 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  iew optimization
310f0 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  :\n"));.    sqli
31100 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
31110 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
31120 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
31130 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
31140 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45  QLITE_COUNTOFVIE
31150 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  W_OPTIMIZATION *
31160 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  /../*.** Generat
31170 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53  e code for the S
31180 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
31190 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61  given in the p a
311a0 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a  rgument.  .**.**
311b0 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
311c0 20 72 65 74 75 72 6e 65 64 20 61 63 63 6f 72 64   returned accord
311d0 69 6e 67 20 74 6f 20 74 68 65 20 53 65 6c 65 63  ing to the Selec
311e0 74 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e  tDest structure.
311f0 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  .** See comments
31200 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20   in sqliteInt.h 
31210 66 6f 72 20 66 75 72 74 68 65 72 20 69 6e 66 6f  for further info
31220 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  rmation..**.** T
31230 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
31240 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
31250 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
31260 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20  y errors are.** 
31270 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65  encountered, the
31280 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
31290 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
312a0 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61  s left in.** pPa
312b0 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  rse->zErrMsg..**
312c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
312d0 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74   does NOT free t
312e0 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  he Select struct
312f0 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20  ure passed in.  
31300 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66  The.** calling f
31310 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  unction needs to
31320 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74   do that..*/.int
31330 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a   sqlite3Select(.
31340 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
31350 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
31360 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
31370 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
31380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
31390 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
313a0 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
313b0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
313c0 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57  *pDest      /* W
313d0 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74  hat to do with t
313e0 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  he query results
313f0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
31400 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
31410 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
31420 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   */.  WhereInfo 
31430 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20  *pWInfo;     /* 
31440 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69  Return from sqli
31450 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
31460 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
31470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
31480 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
31490 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ne under constru
314a0 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
314b0 73 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20  sAgg;           
314c0 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65    /* True for se
314d0 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20  lect lists like 
314e0 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20  "count(*)" */.  
314f0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
31500 20 3d 20 30 3b 20 20 2f 2a 20 4c 69 73 74 20 6f   = 0;  /* List o
31510 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74  f columns to ext
31520 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69  ract. */.  SrcLi
31530 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20  st *pTabList;   
31540 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
31550 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72  les to select fr
31560 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  om */.  Expr *pW
31570 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f  here;          /
31580 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
31590 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
315a0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
315b0 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20  pGroupBy;    /* 
315c0 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  The GROUP BY cla
315d0 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
315e0 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  L */.  Expr *pHa
315f0 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  ving;         /*
31600 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   The HAVING clau
31610 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
31620 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31   */.  int rc = 1
31630 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
31640 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
31650 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
31660 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74  on */.  Distinct
31670 43 74 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f  Ctx sDistinct; /
31680 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  * Info on how to
31690 20 63 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e   code the DISTIN
316a0 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20  CT keyword */.  
316b0 53 6f 72 74 43 74 78 20 73 53 6f 72 74 3b 20 20  SortCtx sSort;  
316c0 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6f         /* Info o
316d0 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68  n how to code th
316e0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
316f0 65 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73  e */.  AggInfo s
31700 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a  AggInfo;      /*
31710 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65   Information use
31720 64 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71  d by aggregate q
31730 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ueries */.  int 
31740 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  iEnd;           
31750 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
31760 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
31770 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74  query */.  sqlit
31780 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
31790 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
317a0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
317b0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e    ExprList *pMin
317c0 4d 61 78 4f 72 64 65 72 42 79 20 3d 20 30 3b 20  MaxOrderBy = 0; 
317d0 20 2f 2a 20 41 64 64 65 64 20 4f 52 44 45 52 20   /* Added ORDER 
317e0 42 59 20 66 6f 72 20 6d 69 6e 2f 6d 61 78 20 71  BY for min/max q
317f0 75 65 72 69 65 73 20 2a 2f 0a 20 20 75 38 20 6d  ueries */.  u8 m
31800 69 6e 4d 61 78 46 6c 61 67 3b 20 20 20 20 20 20  inMaxFlag;      
31810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
31820 61 67 20 66 6f 72 20 6d 69 6e 2f 6d 61 78 20 71  ag for min/max q
31830 75 65 72 69 65 73 20 2a 2f 0a 0a 20 20 64 62 20  ueries */..  db 
31840 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
31850 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
31860 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
31870 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  ( p==0 || db->ma
31880 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
31890 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20  arse->nErr ){.  
318a0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
318b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
318c0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
318d0 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
318e0 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20   0, 0) ) return 
318f0 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67  1;.  memset(&sAg
31900 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  gInfo, 0, sizeof
31910 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 23 69 66  (sAggInfo));.#if
31920 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
31930 42 4c 45 44 0a 20 20 53 45 4c 45 43 54 54 52 41  BLED.  SELECTTRA
31940 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 20 28  CE(1,pParse,p, (
31950 22 62 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e  "begin processin
31960 67 3a 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 61  g:\n", pParse->a
31970 64 64 72 45 78 70 6c 61 69 6e 29 29 3b 0a 20 20  ddrExplain));.  
31980 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
31990 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  tTrace & 0x100 )
319a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  {.    sqlite3Tre
319b0 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
319c0 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
319d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ..  assert( p->p
319e0 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44  OrderBy==0 || pD
319f0 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
31a00 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 61 73  DistFifo );.  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 46 69 66 6f 20 29  Dest!=SRT_Fifo )
31a40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
31a50 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44  OrderBy==0 || pD
31a60 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
31a70 44 69 73 74 51 75 65 75 65 20 29 3b 0a 20 20 61  DistQueue );.  a
31a80 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
31a90 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
31aa0 65 44 65 73 74 21 3d 53 52 54 5f 51 75 65 75 65  eDest!=SRT_Queue
31ab0 20 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61   );.  if( Ignora
31ac0 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74  bleOrderby(pDest
31ad0 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
31ae0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
31af0 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73  T_Exists || pDes
31b00 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e  t->eDest==SRT_Un
31b10 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ion || .        
31b20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d     pDest->eDest=
31b30 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70  =SRT_Except || p
31b40 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
31b50 5f 44 69 73 63 61 72 64 20 7c 7c 0a 20 20 20 20  _Discard ||.    
31b60 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44         pDest->eD
31b70 65 73 74 3d 3d 53 52 54 5f 51 75 65 75 65 20 20  est==SRT_Queue  
31b80 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  || pDest->eDest=
31b90 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c  =SRT_DistFifo ||
31ba0 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73  .           pDes
31bb0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  t->eDest==SRT_Di
31bc0 73 74 51 75 65 75 65 20 7c 7c 20 70 44 65 73 74  stQueue || pDest
31bd0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66  ->eDest==SRT_Fif
31be0 6f 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52  o);.    /* If OR
31bf0 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20  DER BY makes no 
31c00 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68  difference in th
31c10 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65  e output then ne
31c20 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a  ither does.    *
31c30 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74  * DISTINCT so it
31c40 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20   can be removed 
31c50 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  too. */.    sqli
31c60 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
31c70 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
31c80 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65  y);.    p->pOrde
31c90 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  rBy = 0;.    p->
31ca0 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
31cb0 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20  Distinct;.  }.  
31cc0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
31cd0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b  p(pParse, p, 0);
31ce0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
31cf0 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
31d00 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
31d10 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
31d20 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
31d30 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 23 69  >pEList!=0 );.#i
31d40 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
31d50 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
31d60 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
31d70 20 30 78 31 30 34 20 29 7b 0a 20 20 20 20 53 45   0x104 ){.    SE
31d80 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 34 2c  LECTTRACE(0x104,
31d90 70 50 61 72 73 65 2c 70 2c 20 28 22 61 66 74 65  pParse,p, ("afte
31da0 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  r name resolutio
31db0 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c  n:\n"));.    sql
31dc0 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
31dd0 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
31de0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
31df0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
31e00 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67  _Output ){.    g
31e10 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
31e20 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  es(pParse, p);. 
31e30 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
31e40 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
31e50 4e 43 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  NC.  if( sqlite3
31e60 57 69 6e 64 6f 77 52 65 77 72 69 74 65 28 70 50  WindowRewrite(pP
31e70 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20  arse, p) ){.    
31e80 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
31e90 0a 20 20 7d 0a 23 69 66 20 53 45 4c 45 43 54 54  .  }.#if SELECTT
31ea0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
31eb0 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
31ec0 54 72 61 63 65 20 26 20 30 78 31 30 38 20 29 7b  Trace & 0x108 ){
31ed0 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
31ee0 28 30 78 31 30 34 2c 70 50 61 72 73 65 2c 70 2c  (0x104,pParse,p,
31ef0 20 28 22 61 66 74 65 72 20 77 69 6e 64 6f 77 20   ("after window 
31f00 72 65 77 72 69 74 65 3a 5c 6e 22 29 29 3b 0a 20  rewrite:\n"));. 
31f10 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
31f20 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
31f30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65  );.  }.#endif.#e
31f40 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
31f50 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a  MIT_WINDOWFUNC *
31f60 2f 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  /.  pTabList = p
31f70 2d 3e 70 53 72 63 3b 0a 20 20 69 73 41 67 67 20  ->pSrc;.  isAgg 
31f80 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  = (p->selFlags &
31f90 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d   SF_Aggregate)!=
31fa0 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 6f  0;.  memset(&sSo
31fb0 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53  rt, 0, sizeof(sS
31fc0 6f 72 74 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70  ort));.  sSort.p
31fd0 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
31fe0 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 54 72 79  derBy;..  /* Try
31ff0 20 74 6f 20 76 61 72 69 6f 75 73 20 6f 70 74 69   to various opti
32000 6d 69 7a 61 74 69 6f 6e 73 20 28 66 6c 61 74 74  mizations (flatt
32010 65 6e 69 6e 67 20 73 75 62 71 75 65 72 69 65 73  ening subqueries
32020 2c 20 61 6e 64 20 73 74 72 65 6e 67 74 68 0a 20  , and strength. 
32030 20 2a 2a 20 72 65 64 75 63 74 69 6f 6e 20 6f 66   ** reduction of
32040 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 29   join operators)
32050 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
32060 75 73 65 20 75 70 20 69 6e 74 6f 20 74 68 65 20  use up into the 
32070 6d 61 69 6e 20 71 75 65 72 79 0a 20 20 2a 2f 0a  main query.  */.
32080 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
32090 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
320a0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
320b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
320c0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e  .  for(i=0; !p->
320d0 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62  pPrior && i<pTab
320e0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
320f0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
32100 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
32110 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
32120 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  i];.    Select *
32130 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53  pSub = pItem->pS
32140 65 6c 65 63 74 3b 0a 20 20 20 20 54 61 62 6c 65  elect;.    Table
32150 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e   *pTab = pItem->
32160 70 54 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  pTab;..    /* Co
32170 6e 76 65 72 74 20 4c 45 46 54 20 4a 4f 49 4e 20  nvert LEFT JOIN 
32180 69 6e 74 6f 20 4a 4f 49 4e 20 69 66 20 74 68 65  into JOIN if the
32190 72 65 20 61 72 65 20 74 65 72 6d 73 20 6f 66 20  re are terms of 
321a0 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 0a  the right table.
321b0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 4c 45      ** of the LE
321c0 46 54 20 4a 4f 49 4e 20 75 73 65 64 20 69 6e 20  FT JOIN used in 
321d0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
321e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
321f0 20 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e   (pItem->fg.join
32200 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21  type & JT_LEFT)!
32210 3d 30 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74  =0.     && sqlit
32220 65 33 45 78 70 72 49 6d 70 6c 69 65 73 4e 6f 6e  e3ExprImpliesNon
32230 4e 75 6c 6c 52 6f 77 28 70 2d 3e 70 57 68 65 72  NullRow(p->pWher
32240 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e, pItem->iCurso
32250 72 29 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d  r).     && Optim
32260 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64  izationEnabled(d
32270 62 2c 20 53 51 4c 49 54 45 5f 53 69 6d 70 6c 69  b, SQLITE_Simpli
32280 66 79 4a 6f 69 6e 29 0a 20 20 20 20 29 7b 0a 20  fyJoin).    ){. 
32290 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
322a0 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x100,pParse,p,
322b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
322c0 20 28 22 4c 45 46 54 2d 4a 4f 49 4e 20 73 69 6d   ("LEFT-JOIN sim
322d0 70 6c 69 66 69 65 73 20 74 6f 20 4a 4f 49 4e 20  plifies to JOIN 
322e0 6f 6e 20 74 65 72 6d 20 25 64 5c 6e 22 2c 69 29  on term %d\n",i)
322f0 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
32300 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 3d 20 7e  fg.jointype &= ~
32310 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45  (JT_LEFT|JT_OUTE
32320 52 29 3b 0a 20 20 20 20 20 20 75 6e 73 65 74 4a  R);.      unsetJ
32330 6f 69 6e 45 78 70 72 28 70 2d 3e 70 57 68 65 72  oinExpr(p->pWher
32340 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e, pItem->iCurso
32350 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  r);.    }..    /
32360 2a 20 4e 6f 20 66 75 74 68 65 72 20 61 63 74 69  * No futher acti
32370 6f 6e 20 69 66 20 74 68 69 73 20 74 65 72 6d 20  on if this term 
32380 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
32390 73 65 20 69 73 20 6e 6f 20 61 20 73 75 62 71 75  se is no a subqu
323a0 65 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ery */.    if( p
323b0 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Sub==0 ) continu
323c0 65 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 74 63 68  e;..    /* Catch
323d0 20 6d 69 73 6d 61 74 63 68 20 69 6e 20 74 68 65   mismatch in the
323e0 20 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e   declared column
323f0 73 20 6f 66 20 61 20 76 69 65 77 20 61 6e 64 20  s of a view and 
32400 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
32410 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20    ** columns in 
32420 74 68 65 20 53 45 4c 45 43 54 20 6f 6e 20 74 68  the SELECT on th
32430 65 20 52 48 53 20 2a 2f 0a 20 20 20 20 69 66 28  e RHS */.    if(
32440 20 70 54 61 62 2d 3e 6e 43 6f 6c 21 3d 70 53 75   pTab->nCol!=pSu
32450 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  b->pEList->nExpr
32460 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
32470 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
32480 2c 20 22 65 78 70 65 63 74 65 64 20 25 64 20 63  , "expected %d c
32490 6f 6c 75 6d 6e 73 20 66 6f 72 20 27 25 73 27 20  olumns for '%s' 
324a0 62 75 74 20 67 6f 74 20 25 64 22 2c 0a 20 20 20  but got %d",.   
324b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
324c0 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70     pTab->nCol, p
324d0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 53 75 62  Tab->zName, pSub
324e0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
324f0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  ;.      goto sel
32500 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a  ect_end;.    }..
32510 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 74 72      /* Do not tr
32520 79 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 6e 20  y to flatten an 
32530 61 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65  aggregate subque
32540 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ry..    **.    *
32550 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 61 6e 20  * Flattening an 
32560 61 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65  aggregate subque
32570 72 79 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69  ry is only possi
32580 62 6c 65 20 69 66 20 74 68 65 20 6f 75 74 65 72  ble if the outer
32590 20 71 75 65 72 79 0a 20 20 20 20 2a 2a 20 69 73   query.    ** is
325a0 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 20 20 42 75   not a join.  Bu
325b0 74 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71  t if the outer q
325c0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
325d0 69 6e 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62  in, then the sub
325e0 71 75 65 72 79 0a 20 20 20 20 2a 2a 20 77 69 6c  query.    ** wil
325f0 6c 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64  l be implemented
32600 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65   as a co-routine
32610 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
32620 20 61 64 76 61 6e 74 61 67 65 20 74 6f 0a 20 20   advantage to.  
32630 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20    ** flattening 
32640 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20  in that case..  
32650 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 53    */.    if( (pS
32660 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
32670 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 20  F_Aggregate)!=0 
32680 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
32690 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 47  assert( pSub->pG
326a0 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 0a 20 20  roupBy==0 );..  
326b0 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 65    /* If the oute
326c0 72 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73  r query contains
326d0 20 61 20 22 63 6f 6d 70 6c 65 78 22 20 72 65 73   a "complex" res
326e0 75 6c 74 20 73 65 74 20 28 74 68 61 74 20 69 73  ult set (that is
326f0 2c 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20  ,.    ** if the 
32700 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
32710 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 75 73  e outer query us
32720 65 73 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20  es functions or 
32730 73 75 62 71 75 65 72 69 65 73 29 0a 20 20 20 20  subqueries).    
32740 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 73 75  ** and if the su
32750 62 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20  bquery contains 
32760 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
32770 73 65 20 61 6e 64 20 69 66 0a 20 20 20 20 2a 2a  se and if.    **
32780 20 69 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c   it will be impl
32790 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d  emented as a co-
327a0 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20 64 6f  routine, then do
327b0 20 6e 6f 74 20 66 6c 61 74 74 65 6e 2e 20 20 54   not flatten.  T
327c0 68 69 73 0a 20 20 20 20 2a 2a 20 72 65 73 74 72  his.    ** restr
327d0 69 63 74 69 6f 6e 20 61 6c 6c 6f 77 73 20 53 51  iction allows SQ
327e0 4c 20 63 6f 6e 73 74 72 75 63 74 73 20 6c 69 6b  L constructs lik
327f0 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20  e this:.    **. 
32800 20 20 20 2a 2a 20 20 53 45 4c 45 43 54 20 65 78     **  SELECT ex
32810 70 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e  pensive_function
32820 28 78 29 0a 20 20 20 20 2a 2a 20 20 20 20 46 52  (x).    **    FR
32830 4f 4d 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f  OM (SELECT x FRO
32840 4d 20 74 61 62 20 4f 52 44 45 52 20 42 59 20 79  M tab ORDER BY y
32850 20 4c 49 4d 49 54 20 31 30 29 3b 0a 20 20 20 20   LIMIT 10);.    
32860 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 65 78  **.    ** The ex
32870 70 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e  pensive_function
32880 28 29 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 75  () is only compu
32890 74 65 64 20 6f 6e 20 74 68 65 20 31 30 20 72 6f  ted on the 10 ro
328a0 77 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61  ws that.    ** a
328b0 72 65 20 6f 75 74 70 75 74 2c 20 72 61 74 68 65  re output, rathe
328c0 72 20 74 68 61 6e 20 65 76 65 72 79 20 72 6f 77  r than every row
328d0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20   of the table.. 
328e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
328f0 20 72 65 71 75 69 72 65 6d 65 6e 74 20 74 68 61   requirement tha
32900 74 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  t the outer quer
32910 79 20 68 61 76 65 20 61 20 63 6f 6d 70 6c 65 78  y have a complex
32920 20 72 65 73 75 6c 74 20 73 65 74 0a 20 20 20 20   result set.    
32930 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 66 6c  ** means that fl
32940 61 74 74 65 6e 69 6e 67 20 64 6f 65 73 20 6f 63  attening does oc
32950 63 75 72 20 6f 6e 20 73 69 6d 70 6c 65 72 20 53  cur on simpler S
32960 51 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77  QL constraints w
32970 69 74 68 6f 75 74 0a 20 20 20 20 2a 2a 20 74 68  ithout.    ** th
32980 65 20 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63  e expensive_func
32990 74 69 6f 6e 28 29 20 6c 69 6b 65 3a 0a 20 20 20  tion() like:.   
329a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 53 45 4c 45   **.    **  SELE
329b0 43 54 20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT x FROM (SELEC
329c0 54 20 78 20 46 52 4f 4d 20 74 61 62 20 4f 52 44  T x FROM tab ORD
329d0 45 52 20 42 59 20 79 20 4c 49 4d 49 54 20 31 30  ER BY y LIMIT 10
329e0 29 3b 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  );.    */.    if
329f0 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
32a00 21 3d 30 0a 20 20 20 20 20 26 26 20 69 3d 3d 30  !=0.     && i==0
32a10 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 73 65 6c  .     && (p->sel
32a20 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6c  Flags & SF_Compl
32a30 65 78 52 65 73 75 6c 74 29 21 3d 30 0a 20 20 20  exResult)!=0.   
32a40 20 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e    && (pTabList->
32a50 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20  nSrc==1.        
32a60 20 7c 7c 20 28 70 54 61 62 4c 69 73 74 2d 3e 61   || (pTabList->a
32a70 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 26  [1].fg.jointype&
32a80 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53  (JT_LEFT|JT_CROS
32a90 53 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20  S))!=0).    ){. 
32aa0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
32ab0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 66 6c     }..    if( fl
32ac0 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50  attenSubquery(pP
32ad0 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67  arse, p, i, isAg
32ae0 67 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  g) ){.      /* T
32af0 68 69 73 20 73 75 62 71 75 65 72 79 20 63 61 6e  his subquery can
32b00 20 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74   be absorbed int
32b10 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f  o its parent. */
32b20 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20  .      i = -1;. 
32b30 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73     }.    pTabLis
32b40 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
32b50 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
32b60 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
32b70 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28  ect_end;.    if(
32b80 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72   !IgnorableOrder
32b90 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  by(pDest) ){.   
32ba0 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42     sSort.pOrderB
32bb0 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
32bc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
32bd0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
32be0 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
32bf0 53 45 4c 45 43 54 0a 20 20 2f 2a 20 48 61 6e 64  SELECT.  /* Hand
32c00 6c 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  le compound SELE
32c10 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 75 73  CT statements us
32c20 69 6e 67 20 74 68 65 20 73 65 70 61 72 61 74 65  ing the separate
32c30 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 0a 20   multiSelect(). 
32c40 20 2a 2a 20 70 72 6f 63 65 64 75 72 65 2e 0a 20   ** procedure.. 
32c50 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
32c60 69 6f 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ior ){.    rc = 
32c70 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72  multiSelect(pPar
32c80 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 23  se, p, pDest);.#
32c90 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
32ca0 4e 41 42 4c 45 44 0a 20 20 20 20 53 45 4c 45 43  NABLED.    SELEC
32cb0 54 54 52 41 43 45 28 30 78 31 2c 70 50 61 72 73  TTRACE(0x1,pPars
32cc0 65 2c 70 2c 28 22 65 6e 64 20 63 6f 6d 70 6f 75  e,p,("end compou
32cd0 6e 64 2d 73 65 6c 65 63 74 20 70 72 6f 63 65 73  nd-select proces
32ce0 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 20 20 69  sing\n"));.    i
32cf0 66 28 20 28 73 71 6c 69 74 65 33 53 65 6c 65 63  f( (sqlite3Selec
32d00 74 54 72 61 63 65 20 26 20 30 78 32 30 30 30 29  tTrace & 0x2000)
32d10 21 3d 30 20 26 26 20 45 78 70 6c 61 69 6e 51 75  !=0 && ExplainQu
32d20 65 72 79 50 6c 61 6e 50 61 72 65 6e 74 28 70 50  eryPlanParent(pP
32d30 61 72 73 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  arse)==0 ){.    
32d40 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
32d50 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
32d60 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
32d70 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 3d     if( p->pNext=
32d80 3d 30 20 29 20 45 78 70 6c 61 69 6e 51 75 65 72  =0 ) ExplainQuer
32d90 79 50 6c 61 6e 50 6f 70 28 70 50 61 72 73 65 29  yPlanPop(pParse)
32da0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
32db0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
32dc0 2a 20 44 6f 20 74 68 65 20 57 48 45 52 45 2d 63  * Do the WHERE-c
32dd0 6c 61 75 73 65 20 63 6f 6e 73 74 61 6e 74 20 70  lause constant p
32de0 72 6f 70 61 67 61 74 69 6f 6e 20 6f 70 74 69 6d  ropagation optim
32df0 69 7a 61 74 69 6f 6e 20 69 66 20 74 68 69 73 20  ization if this 
32e00 69 73 0a 20 20 2a 2a 20 61 20 6a 6f 69 6e 2e 20  is.  ** a join. 
32e10 20 4e 6f 20 6e 65 65 64 20 74 6f 20 73 70 65 65   No need to spee
32e20 64 20 74 69 6d 65 20 6f 6e 20 74 68 69 73 20 6f  d time on this o
32e30 70 65 72 61 74 69 6f 6e 20 66 6f 72 20 6e 6f 6e  peration for non
32e40 2d 6a 6f 69 6e 20 71 75 65 72 69 65 73 0a 20 20  -join queries.  
32e50 2a 2a 20 61 73 20 74 68 65 20 65 71 75 69 76 61  ** as the equiva
32e60 6c 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f  lent optimizatio
32e70 6e 20 77 69 6c 6c 20 62 65 20 68 61 6e 64 6c 65  n will be handle
32e80 64 20 62 79 20 71 75 65 72 79 20 70 6c 61 6e 6e  d by query plann
32e90 65 72 20 69 6e 0a 20 20 2a 2a 20 73 71 6c 69 74  er in.  ** sqlit
32ea0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a  e3WhereBegin()..
32eb0 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c    */.  if( pTabL
32ec0 69 73 74 2d 3e 6e 53 72 63 3e 31 0a 20 20 20 26  ist->nSrc>1.   &
32ed0 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
32ee0 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
32ef0 5f 50 72 6f 70 61 67 61 74 65 43 6f 6e 73 74 29  _PropagateConst)
32f00 0a 20 20 20 26 26 20 70 72 6f 70 61 67 61 74 65  .   && propagate
32f10 43 6f 6e 73 74 61 6e 74 73 28 70 50 61 72 73 65  Constants(pParse
32f20 2c 20 70 29 0a 20 20 29 7b 0a 23 69 66 20 53 45  , p).  ){.#if SE
32f30 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
32f40 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  D.    if( sqlite
32f50 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
32f60 78 31 30 30 20 29 7b 0a 20 20 20 20 20 20 53 45  x100 ){.      SE
32f70 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c  LECTTRACE(0x100,
32f80 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72  pParse,p,("After
32f90 20 63 6f 6e 73 74 61 6e 74 20 70 72 6f 70 61 67   constant propag
32fa0 61 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20  ation:\n"));.   
32fb0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
32fc0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
32fd0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
32fe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 53 45 4c    }else{.    SEL
32ff0 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70  ECTTRACE(0x100,p
33000 50 61 72 73 65 2c 70 2c 28 22 43 6f 6e 73 74 61  Parse,p,("Consta
33010 6e 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6e  nt propagation n
33020 6f 74 20 68 65 6c 70 66 75 6c 5c 6e 22 29 29 3b  ot helpful\n"));
33030 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
33040 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f  ITE_COUNTOFVIEW_
33050 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69  OPTIMIZATION.  i
33060 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  f( OptimizationE
33070 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
33080 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72  E_QueryFlattener
33090 7c 53 51 4c 49 54 45 5f 43 6f 75 6e 74 4f 66 56  |SQLITE_CountOfV
330a0 69 65 77 29 0a 20 20 20 26 26 20 63 6f 75 6e 74  iew).   && count
330b0 4f 66 56 69 65 77 4f 70 74 69 6d 69 7a 61 74 69  OfViewOptimizati
330c0 6f 6e 28 70 50 61 72 73 65 2c 20 70 29 0a 20 20  on(pParse, p).  
330d0 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  ){.    if( db->m
330e0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
330f0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
33100 20 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70     pEList = p->p
33110 45 4c 69 73 74 3b 0a 20 20 20 20 70 54 61 62 4c  EList;.    pTabL
33120 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
33130 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
33140 46 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e  For each term in
33150 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
33160 2c 20 64 6f 20 74 77 6f 20 74 68 69 6e 67 73 3a  , do two things:
33170 0a 20 20 2a 2a 20 28 31 29 20 41 75 74 68 6f 72  .  ** (1) Author
33180 69 7a 65 64 20 75 6e 72 65 66 65 72 65 6e 63 65  ized unreference
33190 64 20 74 61 62 6c 65 73 0a 20 20 2a 2a 20 28 32  d tables.  ** (2
331a0 29 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  ) Generate code 
331b0 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72  for all sub-quer
331c0 69 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ies.  */.  for(i
331d0 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  =0; i<pTabList->
331e0 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
331f0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
33200 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54  tem *pItem = &pT
33210 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20  abList->a[i];.  
33220 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
33230 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  t;.    Select *p
33240 53 75 62 3b 0a 23 69 66 20 21 64 65 66 69 6e 65  Sub;.#if !define
33250 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
33260 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
33270 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
33280 56 49 45 57 29 0a 20 20 20 20 63 6f 6e 73 74 20  VIEW).    const 
33290 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68  char *zSavedAuth
332a0 43 6f 6e 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a  Context;.#endif.
332b0 0a 20 20 20 20 2f 2a 20 49 73 73 75 65 20 53 51  .    /* Issue SQ
332c0 4c 49 54 45 5f 52 45 41 44 20 61 75 74 68 6f 72  LITE_READ author
332d0 69 7a 61 74 69 6f 6e 73 20 77 69 74 68 20 61 20  izations with a 
332e0 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  fake column name
332f0 20 66 6f 72 20 61 6e 79 0a 20 20 20 20 2a 2a 20   for any.    ** 
33300 74 61 62 6c 65 73 20 74 68 61 74 20 61 72 65 20  tables that are 
33310 72 65 66 65 72 65 6e 63 65 64 20 62 75 74 20 66  referenced but f
33320 72 6f 6d 20 77 68 69 63 68 20 6e 6f 20 76 61 6c  rom which no val
33330 75 65 73 20 61 72 65 20 65 78 74 72 61 63 74 65  ues are extracte
33340 64 2e 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  d..    ** Exampl
33350 65 73 20 6f 66 20 77 68 65 72 65 20 74 68 65 73  es of where thes
33360 65 20 6b 69 6e 64 73 20 6f 66 20 6e 75 6c 6c 20  e kinds of null 
33370 53 51 4c 49 54 45 5f 52 45 41 44 20 61 75 74 68  SQLITE_READ auth
33380 6f 72 69 7a 61 74 69 6f 6e 73 0a 20 20 20 20 2a  orizations.    *
33390 2a 20 77 6f 75 6c 64 20 6f 63 63 75 72 3a 0a 20  * would occur:. 
333a0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
333b0 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
333c0 20 46 52 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 53   FROM t1;   -- S
333d0 51 4c 49 54 45 5f 52 45 41 44 20 74 31 2e 22 22  QLITE_READ t1.""
333e0 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  .    **     SELE
333f0 43 54 20 74 31 2e 2a 20 46 52 4f 4d 20 74 31 2c  CT t1.* FROM t1,
33400 20 74 32 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45   t2;   -- SQLITE
33410 5f 52 45 41 44 20 74 32 2e 22 22 0a 20 20 20 20  _READ t2."".    
33420 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 61  **.    ** The fa
33430 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69  ke column name i
33440 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  s an empty strin
33450 67 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62  g.  It is possib
33460 6c 65 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74  le for a table t
33470 6f 0a 20 20 20 20 2a 2a 20 68 61 76 65 20 61 20  o.    ** have a 
33480 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 62 79 20  column named by 
33490 74 68 65 20 65 6d 70 74 79 20 73 74 72 69 6e 67  the empty string
334a0 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  , in which case 
334b0 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
334c0 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 74 69 6e  to.    ** distin
334d0 67 75 69 73 68 20 62 65 74 77 65 65 6e 20 61 6e  guish between an
334e0 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 74 61   unreferenced ta
334f0 62 6c 65 20 61 6e 64 20 61 6e 20 61 63 74 75 61  ble and an actua
33500 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  l reference to t
33510 68 65 0a 20 20 20 20 2a 2a 20 22 22 20 63 6f 6c  he.    ** "" col
33520 75 6d 6e 2e 20 54 68 65 20 6f 72 69 67 69 6e 61  umn. The origina
33530 6c 20 64 65 73 69 67 6e 20 77 61 73 20 66 6f 72  l design was for
33540 20 74 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e   the fake column
33550 20 6e 61 6d 65 20 74 6f 20 62 65 20 61 20 4e 55   name to be a NU
33560 4c 4c 2c 0a 20 20 20 20 2a 2a 20 77 68 69 63 68  LL,.    ** which
33570 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 6d 62 69   would be unambi
33580 67 75 6f 75 73 2e 20 20 42 75 74 20 6c 65 67 61  guous.  But lega
33590 63 79 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  cy authorization
335a0 20 63 61 6c 6c 62 61 63 6b 73 20 6d 69 67 68 74   callbacks might
335b0 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 20 74  .    ** assume t
335c0 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69  he column name i
335d0 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 73  s non-NULL and s
335e0 65 67 66 61 75 6c 74 2e 20 20 54 68 65 20 75 73  egfault.  The us
335f0 65 20 6f 66 20 61 6e 20 65 6d 70 74 79 0a 20 20  e of an empty.  
33600 20 20 2a 2a 20 73 74 72 69 6e 67 20 66 6f 72 20    ** string for 
33610 74 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20  the fake column 
33620 6e 61 6d 65 20 73 65 65 6d 73 20 73 61 66 65 72  name seems safer
33630 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
33640 20 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3d   pItem->colUsed=
33650 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
33660 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
33670 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 41 44  rse, SQLITE_READ
33680 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20  , pItem->zName, 
33690 22 22 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  "", pItem->zData
336a0 62 61 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69  base);.    }..#i
336b0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
336c0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
336d0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
336e0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20  ITE_OMIT_VIEW). 
336f0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
33700 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d  ode for all sub-
33710 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46  queries in the F
33720 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 2a  ROM clause.    *
33730 2f 0a 20 20 20 20 70 53 75 62 20 3d 20 70 49 74  /.    pSub = pIt
33740 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  em->pSelect;.   
33750 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63   if( pSub==0 ) c
33760 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
33770 20 54 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20   The code for a 
33780 73 75 62 71 75 65 72 79 20 73 68 6f 75 6c 64 20  subquery should 
33790 6f 6e 6c 79 20 62 65 20 67 65 6e 65 72 61 74 65  only be generate
337a0 64 20 6f 6e 63 65 2c 20 74 68 6f 75 67 68 20 69  d once, though i
337b0 74 20 69 73 0a 20 20 20 20 2a 2a 20 74 65 63 68  t is.    ** tech
337c0 6e 69 63 61 6c 6c 79 20 68 61 72 6d 6c 65 73 73  nically harmless
337d0 20 66 6f 72 20 69 74 20 74 6f 20 62 65 20 67 65   for it to be ge
337e0 6e 65 72 61 74 65 64 20 6d 75 6c 74 69 70 6c 65  nerated multiple
337f0 20 74 69 6d 65 73 2e 20 54 68 65 0a 20 20 20 20   times. The.    
33800 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  ** following ass
33810 65 72 74 28 29 20 77 69 6c 6c 20 64 65 74 65 63  ert() will detec
33820 74 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 63  t if something c
33830 68 61 6e 67 65 73 20 74 6f 20 63 61 75 73 65 0a  hanges to cause.
33840 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20      ** the same 
33850 73 75 62 71 75 65 72 79 20 74 6f 20 62 65 20 63  subquery to be c
33860 6f 64 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69  oded multiple ti
33870 6d 65 73 2c 20 61 73 20 61 20 73 69 67 6e 61 6c  mes, as a signal
33880 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   to the.    ** d
33890 65 76 65 6c 6f 70 65 72 73 20 74 6f 20 74 72 79  evelopers to try
338a0 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 65   to optimize the
338b0 20 73 69 74 75 61 74 69 6f 6e 2e 20 2a 2f 0a 20   situation. */. 
338c0 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
338d0 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30  ->addrFillSub==0
338e0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72   );..    /* Incr
338f0 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69  ement Parse.nHei
33900 67 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68  ght by the heigh
33910 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74  t of the largest
33920 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
33930 2a 2a 20 74 72 65 65 20 72 65 66 65 72 72 65 64  ** tree referred
33940 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65   to by this, the
33950 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20   parent select. 
33960 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74  The child select
33970 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74  .    ** may cont
33980 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ain expression t
33990 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a  rees of at most.
339a0 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d      ** (SQLITE_M
339b0 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61  AX_EXPR_DEPTH-Pa
339c0 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69  rse.nHeight) hei
339d0 67 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62  ght. This is a b
339e0 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63  it.    ** more c
339f0 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e  onservative than
33a00 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20   necessary, but 
33a10 6d 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e  much easier than
33a20 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a   enforcing.    *
33a30 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74  * an exact limit
33a40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
33a50 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20  rse->nHeight += 
33a60 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
33a70 72 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20  rHeight(p);..   
33a80 20 2f 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20   /* Make copies 
33a90 6f 66 20 63 6f 6e 73 74 61 6e 74 20 57 48 45 52  of constant WHER
33aa0 45 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 20 69  E-clause terms i
33ab0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
33ac0 79 20 64 6f 77 6e 0a 20 20 20 20 2a 2a 20 69 6e  y down.    ** in
33ad0 73 69 64 65 20 74 68 65 20 73 75 62 71 75 65 72  side the subquer
33ae0 79 2e 20 20 54 68 69 73 20 63 61 6e 20 68 65 6c  y.  This can hel
33af0 70 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74  p the subquery t
33b00 6f 20 72 75 6e 20 6d 6f 72 65 20 65 66 66 69 63  o run more effic
33b10 69 65 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20  iently..    */. 
33b20 20 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74     if( Optimizat
33b30 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
33b40 51 4c 49 54 45 5f 50 75 73 68 44 6f 77 6e 29 0a  QLITE_PushDown).
33b50 20 20 20 20 20 26 26 20 70 75 73 68 44 6f 77 6e       && pushDown
33b60 57 68 65 72 65 54 65 72 6d 73 28 70 50 61 72 73  WhereTerms(pPars
33b70 65 2c 20 70 53 75 62 2c 20 70 2d 3e 70 57 68 65  e, pSub, p->pWhe
33b80 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  re, pItem->iCurs
33b90 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  or,.            
33ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
33bb0 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  pItem->fg.jointy
33bc0 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
33bd0 30 29 0a 20 20 20 20 29 7b 0a 23 69 66 20 53 45  0).    ){.#if SE
33be0 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
33bf0 44 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  D.      if( sqli
33c00 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
33c10 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 20 20   0x100 ){.      
33c20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
33c30 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20  100,pParse,p,.  
33c40 20 20 20 20 20 20 20 20 20 20 28 22 41 66 74 65            ("Afte
33c50 72 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 70  r WHERE-clause p
33c60 75 73 68 2d 64 6f 77 6e 20 69 6e 74 6f 20 73 75  ush-down into su
33c70 62 71 75 65 72 79 20 25 64 3a 5c 6e 22 2c 20 70  bquery %d:\n", p
33c80 53 75 62 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20  Sub->selId));.  
33c90 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
33ca0 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
33cb0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
33cc0 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
33cd0 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43        SELECTTRAC
33ce0 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70  E(0x100,pParse,p
33cf0 2c 28 22 50 75 73 68 2d 64 6f 77 6e 20 6e 6f 74  ,("Push-down not
33d00 20 70 6f 73 73 69 62 6c 65 5c 6e 22 29 29 3b 0a   possible\n"));.
33d10 20 20 20 20 7d 0a 0a 20 20 20 20 7a 53 61 76 65      }..    zSave
33d20 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  dAuthContext = p
33d30 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
33d40 65 78 74 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ext;.    pParse-
33d50 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
33d60 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20  pItem->zName;.. 
33d70 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
33d80 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ode to implement
33d90 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20 20   the subquery.  
33da0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
33db0 73 75 62 71 75 65 72 79 20 69 73 20 69 6d 70 6c  subquery is impl
33dc0 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d  emented as a co-
33dd0 72 6f 75 74 69 6e 65 20 69 66 20 74 68 65 20 73  routine if the s
33de0 75 62 71 75 65 72 79 20 69 73 0a 20 20 20 20 2a  ubquery is.    *
33df0 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  * guaranteed to 
33e00 62 65 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  be the outer loo
33e10 70 20 28 73 6f 20 74 68 61 74 20 69 74 20 64 6f  p (so that it do
33e20 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
33e30 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 75 74 65  e.    ** compute
33e40 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65  d more than once
33e50 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
33e60 54 4f 44 4f 3a 20 41 72 65 20 74 68 65 72 65 20  TODO: Are there 
33e70 6f 74 68 65 72 20 72 65 61 73 6f 6e 73 20 62 65  other reasons be
33e80 73 69 64 65 20 28 31 29 20 74 6f 20 75 73 65 20  side (1) to use 
33e90 61 20 63 6f 2d 72 6f 75 74 69 6e 65 0a 20 20 20  a co-routine.   
33ea0 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   ** implementati
33eb0 6f 6e 3f 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on?.    */.    i
33ec0 66 28 20 69 3d 3d 30 0a 20 20 20 20 20 26 26 20  f( i==0.     && 
33ed0 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d  (pTabList->nSrc=
33ee0 3d 31 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  =1.            |
33ef0 7c 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31  | (pTabList->a[1
33f00 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a  ].fg.jointype&(J
33f10 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29  T_LEFT|JT_CROSS)
33f20 29 21 3d 30 29 20 20 2f 2a 20 28 31 29 20 2a 2f  )!=0)  /* (1) */
33f30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
33f40 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d   Implement a co-
33f50 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
33f60 6c 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c  l return a singl
33f70 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  e row of the res
33f80 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74  ult.      ** set
33f90 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74   on each invocat
33fa0 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
33fb0 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 20      int addrTop 
33fc0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
33fd0 72 65 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a 20  rentAddr(v)+1;. 
33fe0 20 20 20 20 0a 20 20 20 20 20 20 70 49 74 65 6d      .      pItem
33ff0 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  ->regReturn = ++
34000 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
34010 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
34020 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp3(v, OP_Init
34030 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d  Coroutine, pItem
34040 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 30 2c 20  ->regReturn, 0, 
34050 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20  addrTop);.      
34060 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
34070 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61  "%s", pItem->pTa
34080 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
34090 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c    pItem->addrFil
340a0 6c 53 75 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a  lSub = addrTop;.
340b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
340c0 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
340d0 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t, SRT_Coroutine
340e0 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
340f0 72 6e 29 3b 0a 20 20 20 20 20 20 45 78 70 6c 61  rn);.      Expla
34100 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
34110 72 73 65 2c 20 31 2c 20 22 43 4f 2d 52 4f 55 54  rse, 1, "CO-ROUT
34120 49 4e 45 20 25 75 22 2c 20 70 53 75 62 2d 3e 73  INE %u", pSub->s
34130 65 6c 49 64 29 29 3b 0a 20 20 20 20 20 20 73 71  elId));.      sq
34140 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
34150 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
34160 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  ;.      pItem->p
34170 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
34180 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52  = pSub->nSelectR
34190 6f 77 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  ow;.      pItem-
341a0 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
341b0 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65   = 1;.      pIte
341c0 6d 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 64  m->regResult = d
341d0 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 20 20 20  est.iSdst;.     
341e0 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43   sqlite3VdbeEndC
341f0 6f 72 6f 75 74 69 6e 65 28 76 2c 20 70 49 74 65  oroutine(v, pIte
34200 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  m->regReturn);. 
34210 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
34220 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
34230 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 73 71  Top-1);.      sq
34240 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65  lite3ClearTempRe
34250 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a  gCache(pParse);.
34260 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34270 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
34280 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  ubroutine that w
34290 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68 65  ill fill an ephe
342a0 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74 68  meral table with
342b0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  .      ** the co
342c0 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73 75  ntent of this su
342d0 62 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e  bquery.  pItem->
342e0 61 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c  addrFillSub will
342f0 20 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20   point.      ** 
34300 74 6f 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  to the address o
34310 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  f the generated 
34320 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 70 49 74  subroutine.  pIt
34330 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20 20  em->regReturn.  
34340 20 20 20 20 2a 2a 20 69 73 20 61 20 72 65 67 69      ** is a regi
34350 73 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 74  ster allocated t
34360 6f 20 68 6f 6c 64 20 74 68 65 20 73 75 62 72 6f  o hold the subro
34370 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61 64 64  utine return add
34380 72 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ress.      */.  
34390 20 20 20 20 69 6e 74 20 74 6f 70 41 64 64 72 3b      int topAddr;
343a0 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 41  .      int onceA
343b0 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ddr = 0;.      i
343c0 6e 74 20 72 65 74 41 64 64 72 3b 0a 20 20 20 20  nt retAddr;.    
343d0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
343e0 5f 69 74 65 6d 20 2a 70 50 72 69 6f 72 3b 0a 0a  _item *pPrior;..
343f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
34400 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
34410 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74  ==0 );.      pIt
34420 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
34430 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
34440 20 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20        topAddr = 
34450 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34460 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
34470 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65   0, pItem->regRe
34480 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74  turn);.      pIt
34490 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
344a0 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20  = topAddr+1;.   
344b0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
344c0 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30  .isCorrelated==0
344d0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
344e0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
344f0 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64  s not correlated
34500 20 61 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e   and if we are n
34510 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20  ot inside of.   
34520 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65       ** a trigge
34530 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20  r, then we only 
34540 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
34550 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
34560 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 20 20   subquery.      
34570 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20    ** once. */.  
34580 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d        onceAddr =
34590 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
345a0 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20  p0(v, OP_Once); 
345b0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
345c0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
345d0 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69  ment((v, "materi
345e0 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70  alize \"%s\"", p
345f0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
34600 65 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  e));.      }else
34610 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f  {.        VdbeNo
34620 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d  opComment((v, "m
34630 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c  aterialize \"%s\
34640 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  "", pItem->pTab-
34650 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
34660 7d 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d  }.      pPrior =
34670 20 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28   isSelfJoinView(
34680 70 54 61 62 4c 69 73 74 2c 20 70 49 74 65 6d 29  pTabList, pItem)
34690 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69  ;.      if( pPri
346a0 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  or ){.        sq
346b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
346c0 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70  v, OP_OpenDup, p
346d0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70  Item->iCursor, p
346e0 50 72 69 6f 72 2d 3e 69 43 75 72 73 6f 72 29 3b  Prior->iCursor);
346f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
34700 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74   pPrior->pSelect
34710 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  !=0 );.        p
34720 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  Sub->nSelectRow 
34730 3d 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63  = pPrior->pSelec
34740 74 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  t->nSelectRow;. 
34750 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
34760 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
34770 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
34780 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70   SRT_EphemTab, p
34790 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
347a0 20 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51          ExplainQ
347b0 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
347c0 2c 20 31 2c 20 22 4d 41 54 45 52 49 41 4c 49 5a  , 1, "MATERIALIZ
347d0 45 20 25 75 22 2c 20 70 53 75 62 2d 3e 73 65 6c  E %u", pSub->sel
347e0 49 64 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Id));.        sq
347f0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
34800 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
34810 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
34820 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f  pItem->pTab->nRo
34830 77 4c 6f 67 45 73 74 20 3d 20 70 53 75 62 2d 3e  wLogEst = pSub->
34840 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
34850 20 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29    if( onceAddr )
34860 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
34870 48 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72  Here(v, onceAddr
34880 29 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64 72  );.      retAddr
34890 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
348a0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
348b0 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  n, pItem->regRet
348c0 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65  urn);.      Vdbe
348d0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
348e0 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61   %s", pItem->pTa
348f0 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
34900 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
34910 6e 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72  ngeP1(v, topAddr
34920 2c 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20  , retAddr);.    
34930 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65    sqlite3ClearTe
34940 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73  mpRegCache(pPars
34950 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
34960 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
34970 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
34980 5f 65 6e 64 3b 0a 20 20 20 20 70 50 61 72 73 65  _end;.    pParse
34990 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c  ->nHeight -= sql
349a0 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65  ite3SelectExprHe
349b0 69 67 68 74 28 70 29 3b 0a 20 20 20 20 70 50 61  ight(p);.    pPa
349c0 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
349d0 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f  t = zSavedAuthCo
349e0 6e 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a 20 20  ntext;.#endif.  
349f0 7d 0a 0a 20 20 2f 2a 20 56 61 72 69 6f 75 73 20  }..  /* Various 
34a00 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
34a10 53 45 4c 45 43 54 20 63 6f 70 69 65 64 20 69 6e  SELECT copied in
34a20 74 6f 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  to local variabl
34a30 65 73 20 66 6f 72 0a 20 20 2a 2a 20 63 6f 6e 76  es for.  ** conv
34a40 65 6e 69 65 6e 63 65 20 2a 2f 0a 20 20 70 45 4c  enience */.  pEL
34a50 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
34a60 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  .  pWhere = p->p
34a70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42  Where;.  pGroupB
34a80 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
34a90 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e  .  pHaving = p->
34aa0 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69 73 74  pHaving;.  sDist
34ab0 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20 28 70  inct.isTnct = (p
34ac0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
34ad0 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23  Distinct)!=0;..#
34ae0 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
34af0 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
34b00 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
34b10 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 53  & 0x400 ){.    S
34b20 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30 30  ELECTTRACE(0x400
34b30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65  ,pParse,p,("Afte
34b40 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  r all FROM-claus
34b50 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22 29 29  e analysis:\n"))
34b60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
34b70 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
34b80 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
34b90 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75  ..  /* If the qu
34ba0 65 72 79 20 69 73 20 44 49 53 54 49 4e 43 54 20  ery is DISTINCT 
34bb0 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  with an ORDER BY
34bc0 20 62 75 74 20 69 73 20 6e 6f 74 20 61 6e 20 61   but is not an a
34bd0 67 67 72 65 67 61 74 65 2c 20 61 6e 64 20 0a 20  ggregate, and . 
34be0 20 2a 2a 20 69 66 20 74 68 65 20 73 65 6c 65 63   ** if the selec
34bf0 74 2d 6c 69 73 74 20 69 73 20 74 68 65 20 73 61  t-list is the sa
34c00 6d 65 20 61 73 20 74 68 65 20 4f 52 44 45 52 20  me as the ORDER 
34c10 42 59 20 6c 69 73 74 2c 20 74 68 65 6e 20 74 68  BY list, then th
34c20 69 73 20 71 75 65 72 79 0a 20 20 2a 2a 20 63 61  is query.  ** ca
34c30 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e 20 61  n be rewritten a
34c40 73 20 61 20 47 52 4f 55 50 20 42 59 2e 20 49 6e  s a GROUP BY. In
34c50 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
34c60 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
34c70 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43    SELECT DISTINC
34c80 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f  T xyz FROM ... O
34c90 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a  RDER BY xyz.  **
34ca0 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f  .  ** is transfo
34cb0 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20  rmed to:.  **.  
34cc0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 79  **     SELECT xy
34cd0 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50  z FROM ... GROUP
34ce0 20 42 59 20 78 79 7a 20 4f 52 44 45 52 20 42 59   BY xyz ORDER BY
34cf0 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   xyz.  **.  ** T
34d00 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69  he second form i
34d10 73 20 70 72 65 66 65 72 72 65 64 20 61 73 20 61  s preferred as a
34d20 20 73 69 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f   single index (o
34d30 72 20 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61  r temp-table) ma
34d40 79 20 62 65 20 0a 20 20 2a 2a 20 75 73 65 64 20  y be .  ** used 
34d50 66 6f 72 20 62 6f 74 68 20 74 68 65 20 4f 52 44  for both the ORD
34d60 45 52 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  ER BY and DISTIN
34d70 43 54 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 41  CT processing. A
34d80 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20  s originally .  
34d90 2a 2a 20 77 72 69 74 74 65 6e 20 74 68 65 20 71  ** written the q
34da0 75 65 72 79 20 6d 75 73 74 20 75 73 65 20 61 20  uery must use a 
34db0 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 61  temp-table for a
34dc0 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74  t least one of t
34dd0 68 65 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42  he ORDER .  ** B
34de0 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 2c 20  Y and DISTINCT, 
34df0 61 6e 64 20 61 6e 20 69 6e 64 65 78 20 6f 72 20  and an index or 
34e00 73 65 70 61 72 61 74 65 20 74 65 6d 70 2d 74 61  separate temp-ta
34e10 62 6c 65 20 66 6f 72 20 74 68 65 20 6f 74 68 65  ble for the othe
34e20 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  r..  */.  if( (p
34e30 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
34e40 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
34e50 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73  regate))==SF_Dis
34e60 74 69 6e 63 74 20 0a 20 20 20 26 26 20 73 71 6c  tinct .   && sql
34e70 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
34e80 61 72 65 28 73 53 6f 72 74 2e 70 4f 72 64 65 72  are(sSort.pOrder
34e90 42 79 2c 20 70 45 4c 69 73 74 2c 20 2d 31 29 3d  By, pEList, -1)=
34ea0 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73  =0.  ){.    p->s
34eb0 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44  elFlags &= ~SF_D
34ec0 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 47 72  istinct;.    pGr
34ed0 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
34ee0 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
34ef0 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 45 4c  rListDup(db, pEL
34f00 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20  ist, 0);.    /* 
34f10 4e 6f 74 69 63 65 20 74 68 61 74 20 65 76 65 6e  Notice that even
34f20 20 74 68 6f 75 67 68 74 20 53 46 5f 44 69 73 74   thought SF_Dist
34f30 69 6e 63 74 20 68 61 73 20 62 65 65 6e 20 63 6c  inct has been cl
34f40 65 61 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73 65  eared from p->se
34f50 6c 46 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20 74  lFlags,.    ** t
34f60 68 65 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54  he sDistinct.isT
34f70 6e 63 74 20 69 73 20 73 74 69 6c 6c 20 73 65 74  nct is still set
34f80 2e 20 20 48 65 6e 63 65 2c 20 69 73 54 6e 63 74  .  Hence, isTnct
34f90 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 0a   represents the.
34fa0 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20      ** original 
34fb0 73 65 74 74 69 6e 67 20 6f 66 20 74 68 65 20 53  setting of the S
34fc0 46 5f 44 69 73 74 69 6e 63 74 20 66 6c 61 67 2c  F_Distinct flag,
34fd0 20 6e 6f 74 20 74 68 65 20 63 75 72 72 65 6e 74   not the current
34fe0 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20 20   setting */.    
34ff0 61 73 73 65 72 74 28 20 73 44 69 73 74 69 6e 63  assert( sDistinc
35000 74 2e 69 73 54 6e 63 74 20 29 3b 0a 0a 23 69 66  t.isTnct );..#if
35010 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
35020 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c  BLED.    if( sql
35030 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
35040 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 20  & 0x400 ){.     
35050 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34   SELECTTRACE(0x4
35060 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 54 72  00,pParse,p,("Tr
35070 61 6e 73 66 6f 72 6d 20 44 49 53 54 49 4e 43 54  ansform DISTINCT
35080 20 69 6e 74 6f 20 47 52 4f 55 50 20 42 59 3a 5c   into GROUP BY:\
35090 6e 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  n"));.      sqli
350a0 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
350b0 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20  t(0, p, 0);.    
350c0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  }.#endif.  }..  
350d0 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
350e0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
350f0 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  e, then create a
35100 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  n ephemeral inde
35110 78 20 74 6f 0a 20 20 2a 2a 20 64 6f 20 74 68 65  x to.  ** do the
35120 20 73 6f 72 74 69 6e 67 2e 20 20 42 75 74 20 74   sorting.  But t
35130 68 69 73 20 73 6f 72 74 69 6e 67 20 65 70 68 65  his sorting ephe
35140 6d 65 72 61 6c 20 69 6e 64 65 78 20 6d 69 67 68  meral index migh
35150 74 20 65 6e 64 20 75 70 0a 20 20 2a 2a 20 62 65  t end up.  ** be
35160 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74 68  ing unused if th
35170 65 20 64 61 74 61 20 63 61 6e 20 62 65 20 65 78  e data can be ex
35180 74 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73  tracted in pre-s
35190 6f 72 74 65 64 20 6f 72 64 65 72 2e 0a 20 20 2a  orted order..  *
351a0 2a 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65  * If that is the
351b0 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20   case, then the 
351c0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
351d0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c   instruction wil
351e0 6c 20 62 65 0a 20 20 2a 2a 20 63 68 61 6e 67 65  l be.  ** change
351f0 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20  d to an OP_Noop 
35200 6f 6e 63 65 20 77 65 20 66 69 67 75 72 65 20 6f  once we figure o
35210 75 74 20 74 68 61 74 20 74 68 65 20 73 6f 72 74  ut that the sort
35220 69 6e 67 20 69 6e 64 65 78 20 69 73 0a 20 20 2a  ing index is.  *
35230 2a 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54  * not needed.  T
35240 68 65 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  he sSort.addrSor
35250 74 49 6e 64 65 78 20 76 61 72 69 61 62 6c 65 20  tIndex variable 
35260 69 73 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c  is used to facil
35270 69 74 61 74 65 0a 20 20 2a 2a 20 74 68 61 74 20  itate.  ** that 
35280 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  change..  */.  i
35290 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  f( sSort.pOrderB
352a0 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  y ){.    KeyInfo
352b0 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
352c0 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
352d0 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  e3KeyInfoFromExp
352e0 72 4c 69 73 74 28 0a 20 20 20 20 20 20 20 20 70  rList(.        p
352f0 50 61 72 73 65 2c 20 73 53 6f 72 74 2e 70 4f 72  Parse, sSort.pOr
35300 64 65 72 42 79 2c 20 30 2c 20 70 45 4c 69 73 74  derBy, 0, pEList
35310 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 73 53  ->nExpr);.    sS
35320 6f 72 74 2e 69 45 43 75 72 73 6f 72 20 3d 20 70  ort.iECursor = p
35330 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
35340 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72     sSort.addrSor
35350 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73  tIndex =.      s
35360 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
35370 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
35380 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  eral,.          
35390 73 53 6f 72 74 2e 69 45 43 75 72 73 6f 72 2c 20  sSort.iECursor, 
353a0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e  sSort.pOrderBy->
353b0 6e 45 78 70 72 2b 31 2b 70 45 4c 69 73 74 2d 3e  nExpr+1+pEList->
353c0 6e 45 78 70 72 2c 20 30 2c 0a 20 20 20 20 20 20  nExpr, 0,.      
353d0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
353e0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 0a  nfo, P4_KEYINFO.
353f0 20 20 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65        );.  }else
35400 7b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72  {.    sSort.addr
35410 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a  SortIndex = -1;.
35420 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
35430 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69   output is desti
35440 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72  ned for a tempor
35450 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20  ary table, open 
35460 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  that table..  */
35470 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44  .  if( pDest->eD
35480 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
35490 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
354a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
354b0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
354c0 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
354d0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
354e0 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
354f0 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a  e limiter..  */.
35500 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33    iEnd = sqlite3
35510 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
35520 61 72 73 65 29 3b 0a 20 20 69 66 28 20 28 70 2d  arse);.  if( (p-
35530 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 46  >selFlags & SF_F
35540 69 78 65 64 4c 69 6d 69 74 29 3d 3d 30 20 29 7b  ixedLimit)==0 ){
35550 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52  .    p->nSelectR
35560 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20  ow = 320;  /* 4 
35570 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a  billion rows */.
35580 20 20 7d 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d    }.  computeLim
35590 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
355a0 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20  se, p, iEnd);.  
355b0 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30  if( p->iLimit==0
355c0 20 26 26 20 73 53 6f 72 74 2e 61 64 64 72 53 6f   && sSort.addrSo
355d0 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20  rtIndex>=0 ){.  
355e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
355f0 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 73 53 6f  ngeOpcode(v, sSo
35600 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
35610 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 29  , OP_SorterOpen)
35620 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f 72 74  ;.    sSort.sort
35630 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46 4c 41  Flags |= SORTFLA
35640 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d  G_UseSorter;.  }
35650 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e 20 65  ..  /* Open an e
35660 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74  phemeral index t
35670 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69  o use for the di
35680 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f  stinct set..  */
35690 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
356a0 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
356b0 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63   ){.    sDistinc
356c0 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50 61 72  t.tabTnct = pPar
356d0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
356e0 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72 54 6e  sDistinct.addrTn
356f0 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ct = sqlite3Vdbe
35700 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
35710 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
35720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35730 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62     sDistinct.tab
35740 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20  Tnct, 0, 0,.    
35750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35760 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65     (char*)sqlite
35770 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  3KeyInfoFromExpr
35780 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e  List(pParse, p->
35790 70 45 4c 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20  pEList,0,0),.   
357a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
357b0 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b      P4_KEYINFO);
357c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
357d0 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45  ChangeP5(v, BTRE
357e0 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20  E_UNORDERED);.  
357f0 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63    sDistinct.eTnc
35800 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49  tType = WHERE_DI
35810 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
35820 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
35830 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
35840 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  pe = WHERE_DISTI
35850 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20  NCT_NOOP;.  }.. 
35860 20 69 66 28 20 21 69 73 41 67 67 20 26 26 20 70   if( !isAgg && p
35870 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20  GroupBy==0 ){.  
35880 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61 74    /* No aggregat
35890 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  e functions and 
358a0 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
358b0 73 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 77 63  se */.    u16 wc
358c0 74 72 6c 46 6c 61 67 73 20 3d 20 28 73 44 69 73  trlFlags = (sDis
358d0 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20 57  tinct.isTnct ? W
358e0 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
358f0 43 54 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20  CT : 0).        
35900 20 20 20 20 20 20 20 20 20 20 20 7c 20 28 70 2d             | (p-
35910 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 46  >selFlags & SF_F
35920 69 78 65 64 4c 69 6d 69 74 29 3b 0a 23 69 66 6e  ixedLimit);.#ifn
35930 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
35940 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 57  WINDOWFUNC.    W
35950 69 6e 64 6f 77 20 2a 70 57 69 6e 20 3d 20 70 2d  indow *pWin = p-
35960 3e 70 57 69 6e 3b 20 20 20 20 20 20 2f 2a 20 4d  >pWin;      /* M
35970 61 73 74 65 72 20 77 69 6e 64 6f 77 20 6f 62 6a  aster window obj
35980 65 63 74 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f  ect (or NULL) */
35990 0a 20 20 20 20 69 66 28 20 70 57 69 6e 20 29 7b  .    if( pWin ){
359a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 69  .      sqlite3Wi
359b0 6e 64 6f 77 43 6f 64 65 49 6e 69 74 28 70 50 61  ndowCodeInit(pPa
359c0 72 73 65 2c 20 70 57 69 6e 29 3b 0a 20 20 20 20  rse, pWin);.    
359d0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73  }.#endif.    ass
359e0 65 72 74 28 20 57 48 45 52 45 5f 55 53 45 5f 4c  ert( WHERE_USE_L
359f0 49 4d 49 54 3d 3d 53 46 5f 46 69 78 65 64 4c 69  IMIT==SF_FixedLi
35a00 6d 69 74 20 29 3b 0a 0a 0a 20 20 20 20 2f 2a 20  mit );...    /* 
35a10 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61  Begin the databa
35a20 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20  se scan. */.    
35a30 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50  SELECTTRACE(1,pP
35a40 61 72 73 65 2c 70 2c 28 22 57 68 65 72 65 42 65  arse,p,("WhereBe
35a50 67 69 6e 5c 6e 22 29 29 3b 0a 20 20 20 20 70 57  gin\n"));.    pW
35a60 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
35a70 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
35a80 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
35a90 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  e, sSort.pOrderB
35aa0 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
35ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ac0 20 20 70 2d 3e 70 45 4c 69 73 74 2c 20 77 63 74    p->pEList, wct
35ad0 72 6c 46 6c 61 67 73 2c 20 70 2d 3e 6e 53 65 6c  rlFlags, p->nSel
35ae0 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 69 66 28  ectRow);.    if(
35af0 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
35b00 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
35b10 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
35b20 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74  reOutputRowCount
35b30 28 70 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53  (pWInfo) < p->nS
35b40 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20  electRow ){.    
35b50 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
35b60 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75  = sqlite3WhereOu
35b70 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49  tputRowCount(pWI
35b80 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nfo);.    }.    
35b90 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73  if( sDistinct.is
35ba0 54 6e 63 74 20 26 26 20 73 71 6c 69 74 65 33 57  Tnct && sqlite3W
35bb0 68 65 72 65 49 73 44 69 73 74 69 6e 63 74 28 70  hereIsDistinct(p
35bc0 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20  WInfo) ){.      
35bd0 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
35be0 79 70 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65  ype = sqlite3Whe
35bf0 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49  reIsDistinct(pWI
35c00 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nfo);.    }.    
35c10 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  if( sSort.pOrder
35c20 42 79 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72  By ){.      sSor
35c30 74 2e 6e 4f 42 53 61 74 20 3d 20 73 71 6c 69 74  t.nOBSat = sqlit
35c40 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
35c50 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
35c60 73 53 6f 72 74 2e 6c 61 62 65 6c 4f 42 4c 6f 70  sSort.labelOBLop
35c70 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  t = sqlite3Where
35c80 4f 72 64 65 72 42 79 4c 69 6d 69 74 4f 70 74 4c  OrderByLimitOptL
35c90 61 62 65 6c 28 70 57 49 6e 66 6f 29 3b 0a 20 20  abel(pWInfo);.  
35ca0 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f      if( sSort.nO
35cb0 42 53 61 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64  BSat==sSort.pOrd
35cc0 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  erBy->nExpr ){. 
35cd0 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72         sSort.pOr
35ce0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
35cf0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
35d00 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65   If sorting inde
35d10 78 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74  x that was creat
35d20 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50  ed by a prior OP
35d30 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a  _OpenEphemeral .
35d40 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
35d50 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20  on ended up not 
35d60 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68  being needed, th
35d70 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50  en change the OP
35d80 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20  _OpenEphemeral. 
35d90 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50     ** into an OP
35da0 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  _Noop..    */.  
35db0 20 20 69 66 28 20 73 53 6f 72 74 2e 61 64 64 72    if( sSort.addr
35dc0 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20  SortIndex>=0 && 
35dd0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d  sSort.pOrderBy==
35de0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
35df0 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
35e00 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72  op(v, sSort.addr
35e10 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20  SortIndex);.    
35e20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
35e30 2d 3e 70 45 4c 69 73 74 3d 3d 70 45 4c 69 73 74  ->pEList==pEList
35e40 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
35e50 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
35e60 4e 43 0a 20 20 20 20 69 66 28 20 70 57 69 6e 20  NC.    if( pWin 
35e70 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  ){.      int add
35e80 72 47 6f 73 75 62 20 3d 20 73 71 6c 69 74 65 33  rGosub = sqlite3
35e90 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
35ea0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74  arse);.      int
35eb0 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
35ec0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
35ed0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74  arse);.      int
35ee0 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
35ef0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
35f00 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e  Parse);.      in
35f10 74 20 72 65 67 47 6f 73 75 62 20 3d 20 2b 2b 70  t regGosub = ++p
35f20 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20  Parse->nMem;..  
35f30 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f      sqlite3Windo
35f40 77 43 6f 64 65 53 74 65 70 28 70 50 61 72 73 65  wCodeStep(pParse
35f50 2c 20 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67  , p, pWInfo, reg
35f60 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62  Gosub, addrGosub
35f70 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
35f80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
35f90 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61  P_Goto, 0, iBrea
35fa0 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
35fb0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
35fc0 6c 28 76 2c 20 61 64 64 72 47 6f 73 75 62 29 3b  l(v, addrGosub);
35fd0 0a 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  .      VdbeNoopC
35fe0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 6e 65  omment((v, "inne
35ff0 72 2d 6c 6f 6f 70 20 73 75 62 72 6f 75 74 69 6e  r-loop subroutin
36000 65 22 29 29 3b 0a 20 20 20 20 20 20 73 53 6f 72  e"));.      sSor
36010 74 2e 6c 61 62 65 6c 4f 42 4c 6f 70 74 20 3d 20  t.labelOBLopt = 
36020 30 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  0;.      selectI
36030 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
36040 20 70 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20   p, -1, &sSort, 
36050 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73  &sDistinct, pDes
36060 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
36070 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
36080 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
36090 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
360a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
360b0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
360c0 2c 20 72 65 67 47 6f 73 75 62 29 3b 0a 20 20 20  , regGosub);.   
360d0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
360e0 76 2c 20 22 65 6e 64 20 69 6e 6e 65 72 2d 6c 6f  v, "end inner-lo
360f0 6f 70 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  op subroutine"))
36100 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
36110 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
36120 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
36130 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
36140 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
36150 4f 57 46 55 4e 43 20 2a 2f 0a 20 20 20 20 7b 0a  OWFUNC */.    {.
36160 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65        /* Use the
36170 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20   standard inner 
36180 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 20 20 73  loop. */.      s
36190 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
361a0 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73  Parse, p, -1, &s
361b0 53 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74  Sort, &sDistinct
361c0 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , pDest,.       
361d0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43     sqlite3WhereC
361e0 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 70 57 49  ontinueLabel(pWI
361f0 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20  nfo),.          
36200 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
36210 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b  kLabel(pWInfo));
36220 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 74  ..      /* End t
36230 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
36240 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a   loop..      */.
36250 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
36260 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
36270 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
36280 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 77    /* This case w
36290 68 65 6e 20 74 68 65 72 65 20 65 78 69 73 74 20  hen there exist 
362a0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
362b0 6f 6e 73 20 6f 72 20 61 20 47 52 4f 55 50 20 42  ons or a GROUP B
362c0 59 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20  Y clause.    ** 
362d0 6f 72 20 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e  or both */.    N
362e0 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20  ameContext sNC; 
362f0 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65     /* Name conte
36300 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  xt for processin
36310 67 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f  g aggregate info
36320 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  rmation */.    i
36330 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20  nt iAMem;       
36340 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
36350 61 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72  address for stor
36360 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55  ing current GROU
36370 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20  P BY */.    int 
36380 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  iBMem;          
36390 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64  /* First Mem add
363a0 72 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75  ress for previou
363b0 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20  s GROUP BY */.  
363c0 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20    int iUseFlag; 
363d0 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64        /* Mem add
363e0 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61  ress holding fla
363f0 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  g indicating tha
36400 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20  t at least.     
36410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36420 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66     ** one row of
36430 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68   the input to th
36440 65 20 61 67 67 72 65 67 61 74 6f 72 20 68 61 73  e aggregator has
36450 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20   been.          
36460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
36470 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
36480 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67    int iAbortFlag
36490 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64  ;     /* Mem add
364a0 72 65 73 73 20 77 68 69 63 68 20 63 61 75 73 65  ress which cause
364b0 73 20 71 75 65 72 79 20 61 62 6f 72 74 20 69 66  s query abort if
364c0 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20   positive */.   
364d0 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74   int groupBySort
364e0 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d  ;    /* Rows com
364f0 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e  e from source in
36500 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20   GROUP BY order 
36510 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45  */.    int addrE
36520 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e  nd;        /* En
36530 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20  d of processing 
36540 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20  for this SELECT 
36550 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 50  */.    int sortP
36560 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73  Tab = 0;   /* Ps
36570 65 75 64 6f 74 61 62 6c 65 20 75 73 65 64 20 74  eudotable used t
36580 6f 20 64 65 63 6f 64 65 20 73 6f 72 74 69 6e 67  o decode sorting
36590 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20   results */.    
365a0 69 6e 74 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b  int sortOut = 0;
365b0 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 72 65      /* Output re
365c0 67 69 73 74 65 72 20 66 72 6f 6d 20 74 68 65 20  gister from the 
365d0 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  sorter */.    in
365e0 74 20 6f 72 64 65 72 42 79 47 72 70 20 3d 20 30  t orderByGrp = 0
365f0 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65  ; /* True if the
36600 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 4f 52   GROUP BY and OR
36610 44 45 52 20 42 59 20 61 72 65 20 74 68 65 20 73  DER BY are the s
36620 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  ame */..    /* R
36630 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c  emove any and al
36640 6c 20 61 6c 69 61 73 65 73 20 62 65 74 77 65 65  l aliases betwee
36650 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
36660 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
36670 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
36680 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
36690 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
366a0 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20    int k;        
366b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
366c0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
366d0 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
366e0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
366f0 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f  Item;  /* For lo
36700 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65  oping over expre
36710 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20  ssion in a list 
36720 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  */..      for(k=
36730 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
36740 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73  , pItem=p->pELis
36750 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20  t->a; k>0; k--, 
36760 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
36770 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c    pItem->u.x.iAl
36780 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ias = 0;.      }
36790 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72  .      for(k=pGr
367a0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49  oupBy->nExpr, pI
367b0 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b  tem=pGroupBy->a;
367c0 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d   k>0; k--, pItem
367d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  ++){.        pIt
367e0 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d  em->u.x.iAlias =
367f0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
36800 20 20 61 73 73 65 72 74 28 20 36 36 3d 3d 73 71    assert( 66==sq
36810 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29  lite3LogEst(100)
36820 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
36830 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 36 36 20 29  >nSelectRow>66 )
36840 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
36850 20 36 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   66;.    }else{.
36860 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d        assert( 0=
36870 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
36880 29 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53  ) );.      p->nS
36890 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20  electRow = 0;.  
368a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
368b0 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 20 47  here is both a G
368c0 52 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f  ROUP BY and an O
368d0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
368e0 6e 64 20 74 68 65 79 20 61 72 65 0a 20 20 20 20  nd they are.    
368f0 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68  ** identical, th
36900 65 6e 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73  en it may be pos
36910 73 69 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65  sible to disable
36920 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
36930 61 75 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20  ause .    ** on 
36940 74 68 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74  the grounds that
36950 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 77 69   the GROUP BY wi
36960 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74  ll cause element
36970 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20  s to come out . 
36980 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72     ** in the cor
36990 72 65 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61  rect order. It a
369a0 6c 73 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68  lso may not - th
369b0 65 20 47 52 4f 55 50 20 42 59 20 6d 69 67 68 74  e GROUP BY might
369c0 20 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 64 61   use a.    ** da
369d0 74 61 62 61 73 65 20 69 6e 64 65 78 20 74 68 61  tabase index tha
369e0 74 20 63 61 75 73 65 73 20 72 6f 77 73 20 74 6f  t causes rows to
369f0 20 62 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65   be grouped toge
36a00 74 68 65 72 20 61 73 20 72 65 71 75 69 72 65 64  ther as required
36a10 0a 20 20 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20  .    ** but not 
36a20 61 63 74 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e  actually sorted.
36a30 20 45 69 74 68 65 72 20 77 61 79 2c 20 72 65 63   Either way, rec
36a40 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
36a50 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44  t the.    ** ORD
36a60 45 52 20 42 59 20 61 6e 64 20 47 52 4f 55 50 20  ER BY and GROUP 
36a70 42 59 20 63 6c 61 75 73 65 73 20 61 72 65 20 74  BY clauses are t
36a80 68 65 20 73 61 6d 65 20 62 79 20 73 65 74 74 69  he same by setti
36a90 6e 67 20 74 68 65 20 6f 72 64 65 72 42 79 47 72  ng the orderByGr
36aa0 70 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  p.    ** variabl
36ab0 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  e.  */.    if( s
36ac0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
36ad0 6d 70 61 72 65 28 70 47 72 6f 75 70 42 79 2c 20  mpare(pGroupBy, 
36ae0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20  sSort.pOrderBy, 
36af0 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1)==0 ){.      
36b00 6f 72 64 65 72 42 79 47 72 70 20 3d 20 31 3b 0a  orderByGrp = 1;.
36b10 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43      }. .    /* C
36b20 72 65 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f  reate a label to
36b30 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65   jump to when we
36b40 20 77 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74   want to abort t
36b50 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  he query */.    
36b60 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65  addrEnd = sqlite
36b70 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
36b80 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 2f 2a 20  Parse);..    /* 
36b90 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d  Convert TK_COLUM
36ba0 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f  N nodes into TK_
36bb0 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d  AGG_COLUMN and m
36bc0 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20  ake entries in. 
36bd0 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66     ** sAggInfo f
36be0 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55  or all TK_AGG_FU
36bf0 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20  NCTION nodes in 
36c00 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  expressions of t
36c10 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  he.    ** SELECT
36c20 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
36c30 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  */.    memset(&s
36c40 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
36c50 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61  C));.    sNC.pPa
36c60 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
36c70 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
36c80 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73   pTabList;.    s
36c90 4e 43 2e 75 4e 43 2e 70 41 67 67 49 6e 66 6f 20  NC.uNC.pAggInfo 
36ca0 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20  = &sAggInfo;.   
36cb0 20 56 56 41 5f 4f 4e 4c 59 28 20 73 4e 43 2e 6e   VVA_ONLY( sNC.n
36cc0 63 46 6c 61 67 73 20 3d 20 4e 43 5f 55 41 67 67  cFlags = NC_UAgg
36cd0 49 6e 66 6f 3b 20 29 0a 20 20 20 20 73 41 67 67  Info; ).    sAgg
36ce0 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20 70 50 61  Info.mnReg = pPa
36cf0 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
36d00 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
36d10 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75  ngColumn = pGrou
36d20 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e  pBy ? pGroupBy->
36d30 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 73  nExpr : 0;.    s
36d40 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79  AggInfo.pGroupBy
36d50 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20   = pGroupBy;.   
36d60 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
36d70 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
36d80 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71   pEList);.    sq
36d90 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
36da0 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 53  AggList(&sNC, sS
36db0 6f 72 74 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20  ort.pOrderBy);. 
36dc0 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29     if( pHaving )
36dd0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 47 72 6f  {.      if( pGro
36de0 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  upBy ){.        
36df0 61 73 73 65 72 74 28 20 70 57 68 65 72 65 3d 3d  assert( pWhere==
36e00 70 2d 3e 70 57 68 65 72 65 20 29 3b 0a 20 20 20  p->pWhere );.   
36e10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48 61       assert( pHa
36e20 76 69 6e 67 3d 3d 70 2d 3e 70 48 61 76 69 6e 67  ving==p->pHaving
36e30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
36e40 72 74 28 20 70 47 72 6f 75 70 42 79 3d 3d 70 2d  rt( pGroupBy==p-
36e50 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 20 20 20  >pGroupBy );.   
36e60 20 20 20 20 20 68 61 76 69 6e 67 54 6f 57 68 65       havingToWhe
36e70 72 65 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  re(pParse, p);. 
36e80 20 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20         pWhere = 
36e90 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20  p->pWhere;.     
36ea0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
36eb0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
36ec0 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76  gates(&sNC, pHav
36ed0 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ing);.    }.    
36ee0 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75  sAggInfo.nAccumu
36ef0 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f  lator = sAggInfo
36f00 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 66  .nColumn;.    if
36f10 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
36f20 20 26 26 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d   && p->pHaving==
36f30 30 20 26 26 20 73 41 67 67 49 6e 66 6f 2e 6e 46  0 && sAggInfo.nF
36f40 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  unc==1 ){.      
36f50 6d 69 6e 4d 61 78 46 6c 61 67 20 3d 20 6d 69 6e  minMaxFlag = min
36f60 4d 61 78 51 75 65 72 79 28 64 62 2c 20 73 41 67  MaxQuery(db, sAg
36f70 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 70  gInfo.aFunc[0].p
36f80 45 78 70 72 2c 20 26 70 4d 69 6e 4d 61 78 4f 72  Expr, &pMinMaxOr
36f90 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 65 6c 73  derBy);.    }els
36fa0 65 7b 0a 20 20 20 20 20 20 6d 69 6e 4d 61 78 46  e{.      minMaxF
36fb0 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  lag = WHERE_ORDE
36fc0 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  RBY_NORMAL;.    
36fd0 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
36fe0 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b  <sAggInfo.nFunc;
36ff0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
37000 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
37010 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61  perty(sAggInfo.a
37020 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45  Func[i].pExpr, E
37030 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
37040 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67        sNC.ncFlag
37050 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e  s |= NC_InAggFun
37060 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
37070 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
37080 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66  st(&sNC, sAggInf
37090 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
370a0 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
370b0 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d    sNC.ncFlags &=
370c0 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a   ~NC_InAggFunc;.
370d0 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
370e0 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72 73  fo.mxReg = pPars
370f0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28  e->nMem;.    if(
37100 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
37110 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
37120 65 6e 64 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  end;.#if SELECTT
37130 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
37140 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
37150 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20  ctTrace & 0x400 
37160 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b  ){.      int ii;
37170 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41  .      SELECTTRA
37180 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c  CE(0x400,pParse,
37190 70 2c 28 22 41 66 74 65 72 20 61 67 67 72 65 67  p,("After aggreg
371a0 61 74 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22  ate analysis:\n"
371b0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
371c0 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
371d0 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, p, 0);.      
371e0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 41 67  for(ii=0; ii<sAg
371f0 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
37200 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
37210 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
37220 28 22 61 67 67 2d 63 6f 6c 75 6d 6e 5b 25 64 5d  ("agg-column[%d]
37230 20 69 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20 20   iMem=%d\n",.   
37240 20 20 20 20 20 20 20 20 20 69 69 2c 20 73 41 67           ii, sAg
37250 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 69 5d 2e 69  gInfo.aCol[ii].i
37260 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Mem);.        sq
37270 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
37280 72 28 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43  r(0, sAggInfo.aC
37290 6f 6c 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30 29  ol[ii].pExpr, 0)
372a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
372b0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 41 67  for(ii=0; ii<sAg
372c0 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 69 2b  gInfo.nFunc; ii+
372d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
372e0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
372f0 61 67 67 2d 66 75 6e 63 5b 25 64 5d 3a 20 69 4d  agg-func[%d]: iM
37300 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  em=%d\n",.      
37310 20 20 20 20 20 20 69 69 2c 20 73 41 67 67 49 6e        ii, sAggIn
37320 66 6f 2e 61 46 75 6e 63 5b 69 69 5d 2e 69 4d 65  fo.aFunc[ii].iMe
37330 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
37340 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28  te3TreeViewExpr(
37350 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  0, sAggInfo.aFun
37360 63 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30 29 3b  c[ii].pExpr, 0);
37370 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
37380 65 6e 64 69 66 0a 0a 0a 20 20 20 20 2f 2a 20 50  endif...    /* P
37390 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67  rocessing for ag
373a0 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47 52  gregates with GR
373b0 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20 64  OUP BY is very d
373c0 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20  ifferent and.   
373d0 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f   ** much more co
373e0 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65  mplex than aggre
373f0 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61 20  gates without a 
37400 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f  GROUP BY..    */
37410 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
37420 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e  y ){.      KeyIn
37430 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f  fo *pKeyInfo;  /
37440 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61  * Keying informa
37450 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f  tion for the gro
37460 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a  up by clause */.
37470 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b        int addr1;
37480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76            /* A-v
37490 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20  s-B comparision 
374a0 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e  jump */.      in
374b0 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b  t addrOutputRow;
374c0 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75    /* Start of su
374d0 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
374e0 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20 72  tputs a result r
374f0 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ow */.      int 
37500 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20  regOutputRow;   
37510 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73  /* Return addres
37520 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f  s register for o
37530 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
37540 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
37550 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a  drSetAbort;   /*
37560 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20 66   Set the abort f
37570 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a  lag and return *
37580 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
37590 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54  TopOfLoop;  /* T
375a0 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  op of the input 
375b0 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e  loop */.      in
375c0 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78  t addrSortingIdx
375d0 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e  ; /* The OP_Open
375e0 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68  Ephemeral for th
375f0 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
37600 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
37610 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  rReset;      /* 
37620 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72  Subroutine for r
37630 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63 63  esetting the acc
37640 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20  umulator */.    
37650 20 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20    int regReset; 
37660 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
37670 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
37680 20 66 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f   for reset subro
37690 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20  utine */..      
376a0 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
376b0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
376c0 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61   we might need a
376d0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
376e0 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65  o.      ** imple
376f0 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61  ment it.  Alloca
37700 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20  te that sorting 
37710 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69  index now.  If i
37720 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20  t turns out.    
37730 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20    ** that we do 
37740 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74 65  not need it afte
37750 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f  r all, the OP_So
37760 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63  rterOpen instruc
37770 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69  tion.      ** wi
37780 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  ll be converted 
37790 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20  into a Noop.  . 
377a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41       */.      sA
377b0 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
377c0 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  x = pParse->nTab
377d0 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e  ++;.      pKeyIn
377e0 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
377f0 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
37800 70 50 61 72 73 65 2c 70 47 72 6f 75 70 42 79 2c  pParse,pGroupBy,
37810 30 2c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  0,sAggInfo.nColu
37820 6d 6e 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53  mn);.      addrS
37830 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69  ortingIdx = sqli
37840 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
37850 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20   OP_SorterOpen, 
37860 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49  .          sAggI
37870 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
37880 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e  sAggInfo.nSortin
37890 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20  gColumn, .      
378a0 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b      0, (char*)pK
378b0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
378c0 46 4f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  FO);..      /* I
378d0 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79  nitialize memory
378e0 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20   locations used 
378f0 62 79 20 47 52 4f 55 50 20 42 59 20 61 67 67 72  by GROUP BY aggr
37900 65 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67  egate processing
37910 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
37920 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61  iUseFlag = ++pPa
37930 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
37940 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b   iAbortFlag = ++
37950 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
37960 20 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f 77      regOutputRow
37970 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
37980 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74  m;.      addrOut
37990 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  putRow = sqlite3
379a0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
379b0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 65 67  arse);.      reg
379c0 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65  Reset = ++pParse
379d0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64  ->nMem;.      ad
379e0 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65  drReset = sqlite
379f0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
37a00 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 41  Parse);.      iA
37a10 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
37a20 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50  em + 1;.      pP
37a30 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47  arse->nMem += pG
37a40 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
37a50 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61       iBMem = pPa
37a60 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
37a70 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
37a80 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  m += pGroupBy->n
37a90 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
37aa0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
37ab0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
37ac0 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20  iAbortFlag);.   
37ad0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
37ae0 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20  v, "clear abort 
37af0 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
37b00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
37b10 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
37b20 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72  iAMem, iAMem+pGr
37b30 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b  oupBy->nExpr-1);
37b40 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e  ..      /* Begin
37b50 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c   a loop that wil
37b60 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f  l extract all so
37b70 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f  urce rows in GRO
37b80 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20  UP BY order..   
37b90 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
37ba0 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70   involve two sep
37bb0 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68  arate loops with
37bc0 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62   an OP_Sort in b
37bd0 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20  etween, or.     
37be0 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20   ** it might be 
37bf0 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68  a single loop th
37c00 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  at uses an index
37c10 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f   to extract info
37c20 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  rmation.      **
37c30 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72   in the right or
37c40 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74  der to begin wit
37c50 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
37c60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
37c70 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
37c80 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52   regReset, addrR
37c90 65 73 65 74 29 3b 0a 20 20 20 20 20 20 53 45 4c  eset);.      SEL
37ca0 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73  ECTTRACE(1,pPars
37cb0 65 2c 70 2c 28 22 57 68 65 72 65 42 65 67 69 6e  e,p,("WhereBegin
37cc0 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 70 57 49  \n"));.      pWI
37cd0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
37ce0 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
37cf0 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
37d00 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20  , pGroupBy, 0,. 
37d10 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 47           WHERE_G
37d20 52 4f 55 50 42 59 20 7c 20 28 6f 72 64 65 72 42  ROUPBY | (orderB
37d30 79 47 72 70 20 3f 20 57 48 45 52 45 5f 53 4f 52  yGrp ? WHERE_SOR
37d40 54 42 59 47 52 4f 55 50 20 3a 20 30 29 2c 20 30  TBYGROUP : 0), 0
37d50 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
37d60 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
37d70 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
37d80 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
37d90 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
37da0 28 70 57 49 6e 66 6f 29 3d 3d 70 47 72 6f 75 70  (pWInfo)==pGroup
37db0 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  By->nExpr ){.   
37dc0 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69       /* The opti
37dd0 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f  mizer is able to
37de0 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e   deliver rows in
37df0 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20   group by order 
37e00 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65  so.        ** we
37e10 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
37e20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70  sort.  The OP_Op
37e30 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  enEphemeral tabl
37e40 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  e will be.      
37e50 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c    ** cancelled l
37e60 61 74 65 72 20 62 65 63 61 75 73 65 20 77 65 20  ater because we 
37e70 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73  still need to us
37e80 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20  e the pKeyInfo. 
37e90 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
37ea0 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
37eb0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
37ec0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20          /* Rows 
37ed0 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69  are coming out i
37ee0 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f  n undetermined o
37ef0 72 64 65 72 2e 20 20 57 65 20 68 61 76 65 20 74  rder.  We have t
37f00 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a  o push.        *
37f10 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20  * each row into 
37f20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c  a sorting index,
37f30 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66   terminate the f
37f40 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20  irst loop,.     
37f50 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20     ** then loop 
37f60 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67  over the sorting
37f70 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20   index in order 
37f80 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70 75  to get the outpu
37f90 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  t.        ** in 
37fa0 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20  sorted order.   
37fb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
37fc0 69 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20  int regBase;.   
37fd0 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f       int regReco
37fe0 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  rd;.        int 
37ff0 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e  nCol;.        in
38000 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20  t nGroupBy;..   
38010 20 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70       explainTemp
38020 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 0a 20  Table(pParse, . 
38030 20 20 20 20 20 20 20 20 20 20 20 28 73 44 69 73             (sDis
38040 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20  tinct.isTnct && 
38050 28 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f  (p->selFlags&SF_
38060 44 69 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a  Distinct)==0) ?.
38070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38080 20 20 20 20 22 44 49 53 54 49 4e 43 54 22 20 3a      "DISTINCT" :
38090 20 22 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20   "GROUP BY");.. 
380a0 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f         groupBySo
380b0 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rt = 1;.        
380c0 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  nGroupBy = pGrou
380d0 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
380e0 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75      nCol = nGrou
380f0 70 42 79 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d  pBy;.        j =
38100 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20   nGroupBy;.     
38110 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
38120 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
38130 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
38140 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f  if( sAggInfo.aCo
38150 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75  l[i].iSorterColu
38160 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20  mn>=j ){.       
38170 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20       nCol++;.   
38180 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20           j++;.  
38190 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
381a0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42    }.        regB
381b0 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ase = sqlite3Get
381c0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
381d0 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
381e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
381f0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
38200 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61   pGroupBy, regBa
38210 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  se, 0, 0);.     
38220 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b     j = nGroupBy;
38230 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
38240 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  ; i<sAggInfo.nCo
38250 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
38260 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
38270 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d  Info_col *pCol =
38280 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b   &sAggInfo.aCol[
38290 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  i];.          if
382a0 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43  ( pCol->iSorterC
382b0 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20  olumn>=j ){.    
382c0 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
382d0 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20   j + regBase;.  
382e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
382f0 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
38300 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 0a 20 20 20  mnOfTable(v,.   
38310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38320 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
38330 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 54  ->pTab, pCol->iT
38340 61 62 6c 65 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c  able, pCol->iCol
38350 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  umn, r1);.      
38360 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
38370 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
38380 0a 20 20 20 20 20 20 20 20 72 65 67 52 65 63 6f  .        regReco
38390 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
383a0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
383b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
383c0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f