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

Artifact 81c6517a8d7b6aae805aaa4171187390f72988d1ceec343ad2f51be09513b289:


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: 75 38 20 73 6f 72 74 46 6c 61 67 73 3b 20 20 20  u8 sortFlags;   
0a60: 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72        /* Zero or
0a70: 20 6d 6f 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a   more SORTFLAG_*
0a80: 20 62 69 74 73 20 2a 2f 0a 20 20 75 38 20 62 4f   bits */.  u8 bO
0a90: 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b  rderedInnerLoop;
0aa0: 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 72   /* ORDER BY cor
0ab0: 72 65 63 74 6c 79 20 73 6f 72 74 73 20 74 68 65  rectly sorts the
0ac0: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 23   inner loop */.#
0ad0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
0ae0: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
0af0: 45 4e 43 45 53 0a 20 20 75 38 20 6e 44 65 66 65  ENCES.  u8 nDefe
0b00: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
0b10: 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64   Number of valid
0b20: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 44 65 66   entries in aDef
0b30: 65 72 5b 5d 20 2a 2f 0a 20 20 73 74 72 75 63 74  er[] */.  struct
0b40: 20 44 65 66 65 72 72 65 64 43 73 72 20 7b 0a 20   DeferredCsr {. 
0b50: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20     Table *pTab; 
0b60: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
0b70: 64 65 66 69 6e 69 74 69 6f 6e 20 2a 2f 0a 20 20  definition */.  
0b80: 20 20 69 6e 74 20 69 43 73 72 3b 20 20 20 20 20    int iCsr;     
0b90: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
0ba0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65  number for table
0bb0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79   */.    int nKey
0bc0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
0bd0: 75 6d 62 65 72 20 6f 66 20 50 4b 20 63 6f 6c 75  umber of PK colu
0be0: 6d 6e 73 20 66 6f 72 20 74 61 62 6c 65 20 70 54  mns for table pT
0bf0: 61 62 20 28 3e 3d 31 29 20 2a 2f 0a 20 20 7d 20  ab (>=1) */.  } 
0c00: 61 44 65 66 65 72 5b 34 5d 3b 0a 23 65 6e 64 69  aDefer[4];.#endi
0c10: 66 0a 20 20 73 74 72 75 63 74 20 52 6f 77 4c 6f  f.  struct RowLo
0c20: 61 64 49 6e 66 6f 20 2a 70 44 65 66 65 72 72 65  adInfo *pDeferre
0c30: 64 52 6f 77 4c 6f 61 64 3b 20 20 2f 2a 20 44 65  dRowLoad;  /* De
0c40: 66 65 72 72 65 64 20 72 6f 77 20 6c 6f 61 64 69  ferred row loadi
0c50: 6e 67 20 69 6e 66 6f 20 6f 72 20 4e 55 4c 4c 20  ng info or NULL 
0c60: 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 53 4f  */.};.#define SO
0c70: 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
0c80: 20 20 30 78 30 31 20 20 20 2f 2a 20 55 73 65 20    0x01   /* Use 
0c90: 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 65  SorterOpen inste
0ca0: 61 64 20 6f 66 20 4f 70 65 6e 45 70 68 65 6d 65  ad of OpenEpheme
0cb0: 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65  ral */../*.** De
0cc0: 6c 65 74 65 20 61 6c 6c 20 74 68 65 20 63 6f 6e  lete all the con
0cd0: 74 65 6e 74 20 6f 66 20 61 20 53 65 6c 65 63 74  tent of a Select
0ce0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 44 65 61   structure.  Dea
0cf0: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 74 72 75  llocate the stru
0d00: 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20  cture.** itself 
0d10: 6f 6e 6c 79 20 69 66 20 62 46 72 65 65 20 69 73  only if bFree is
0d20: 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
0d30: 20 76 6f 69 64 20 63 6c 65 61 72 53 65 6c 65 63   void clearSelec
0d40: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  t(sqlite3 *db, S
0d50: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 62 46  elect *p, int bF
0d60: 72 65 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70  ree){.  while( p
0d70: 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a   ){.    Select *
0d80: 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
0d90: 6f 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  or;.    sqlite3E
0da0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
0db0: 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
0dc0: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
0dd0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53  Delete(db, p->pS
0de0: 72 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rc);.    sqlite3
0df0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
0e00: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73  ->pWhere);.    s
0e10: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
0e20: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 47 72 6f  lete(db, p->pGro
0e30: 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  upBy);.    sqlit
0e40: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
0e50: 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
0e60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
0e70: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
0e80: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71  OrderBy);.    sq
0e90: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0ea0: 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
0eb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
0ec0: 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20  MIT_WINDOWFUNC. 
0ed0: 20 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57     if( OK_IF_ALW
0ee0: 41 59 53 5f 54 52 55 45 28 70 2d 3e 70 57 69 6e  AYS_TRUE(p->pWin
0ef0: 44 65 66 6e 29 20 29 7b 0a 20 20 20 20 20 20 73  Defn) ){.      s
0f00: 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69 73 74  qlite3WindowList
0f10: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57  Delete(db, p->pW
0f20: 69 6e 44 65 66 6e 29 3b 0a 20 20 20 20 7d 0a 23  inDefn);.    }.#
0f30: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 4f 4b  endif.    if( OK
0f40: 5f 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28  _IF_ALWAYS_TRUE(
0f50: 70 2d 3e 70 57 69 74 68 29 20 29 20 73 71 6c 69  p->pWith) ) sqli
0f60: 74 65 33 57 69 74 68 44 65 6c 65 74 65 28 64 62  te3WithDelete(db
0f70: 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a 20 20 20  , p->pWith);.   
0f80: 20 69 66 28 20 62 46 72 65 65 20 29 20 73 71 6c   if( bFree ) sql
0f90: 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
0fa0: 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 50 72   p);.    p = pPr
0fb0: 69 6f 72 3b 0a 20 20 20 20 62 46 72 65 65 20 3d  ior;.    bFree =
0fc0: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
0fd0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 53 65   Initialize a Se
0fe0: 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75  lectDest structu
0ff0: 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  re..*/.void sqli
1000: 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
1010: 74 28 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44  t(SelectDest *pD
1020: 65 73 74 2c 20 69 6e 74 20 65 44 65 73 74 2c 20  est, int eDest, 
1030: 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 70 44  int iParm){.  pD
1040: 65 73 74 2d 3e 65 44 65 73 74 20 3d 20 28 75 38  est->eDest = (u8
1050: 29 65 44 65 73 74 3b 0a 20 20 70 44 65 73 74 2d  )eDest;.  pDest-
1060: 3e 69 53 44 50 61 72 6d 20 3d 20 69 50 61 72 6d  >iSDParm = iParm
1070: 3b 0a 20 20 70 44 65 73 74 2d 3e 7a 41 66 66 53  ;.  pDest->zAffS
1080: 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74  dst = 0;.  pDest
1090: 2d 3e 69 53 64 73 74 20 3d 20 30 3b 0a 20 20 70  ->iSdst = 0;.  p
10a0: 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 30 3b  Dest->nSdst = 0;
10b0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  .}.../*.** Alloc
10c0: 61 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63 74  ate a new Select
10d0: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 72   structure and r
10e0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
10f0: 74 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75 63  to that.** struc
1100: 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20  ture..*/.Select 
1110: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65  *sqlite3SelectNe
1120: 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  w(.  Parse *pPar
1130: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
1140: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1150: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
1160: 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69 63  ist,     /* whic
1170: 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63  h columns to inc
1180: 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73 75  lude in the resu
1190: 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  lt */.  SrcList 
11a0: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f 2a  *pSrc,        /*
11b0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
11c0: 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65 73   -- which tables
11d0: 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78   to scan */.  Ex
11e0: 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
11f0: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
1200: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
1210: 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 2c  rList *pGroupBy,
1220: 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50 20     /* the GROUP 
1230: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  BY clause */.  E
1240: 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20 20  xpr *pHaving,   
1250: 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56 49       /* the HAVI
1260: 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  NG clause */.  E
1270: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
1280: 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44 45  y,   /* the ORDE
1290: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
12a0: 20 75 33 32 20 73 65 6c 46 6c 61 67 73 2c 20 20   u32 selFlags,  
12b0: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 70         /* Flag p
12c0: 61 72 61 6d 65 74 65 72 73 2c 20 73 75 63 68 20  arameters, such 
12d0: 61 73 20 53 46 5f 44 69 73 74 69 6e 63 74 20 2a  as SF_Distinct *
12e0: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74  /.  Expr *pLimit
12f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d            /* LIM
1300: 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20  IT value.  NULL 
1310: 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a  means not used *
1320: 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
1330: 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 73 74  New;.  Select st
1340: 61 6e 64 69 6e 3b 0a 20 20 70 4e 65 77 20 3d 20  andin;.  pNew = 
1350: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
1360: 61 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c  awNN(pParse->db,
1370: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
1380: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
1390: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
13a0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
13b0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70  cFailed );.    p
13c0: 4e 65 77 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a  New = &standin;.
13d0: 20 20 7d 0a 20 20 69 66 28 20 70 45 4c 69 73 74    }.  if( pEList
13e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 45 4c 69 73  ==0 ){.    pELis
13f0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
1400: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
1410: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1430: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1440: 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 54  xpr(pParse->db,T
1450: 4b 5f 41 53 54 45 52 49 53 4b 2c 30 29 29 3b 0a  K_ASTERISK,0));.
1460: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69    }.  pNew->pELi
1470: 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 70  st = pEList;.  p
1480: 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c  New->op = TK_SEL
1490: 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c  ECT;.  pNew->sel
14a0: 46 6c 61 67 73 20 3d 20 73 65 6c 46 6c 61 67 73  Flags = selFlags
14b0: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74  ;.  pNew->iLimit
14c0: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f   = 0;.  pNew->iO
14d0: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4e 65  ffset = 0;.  pNe
14e0: 77 2d 3e 73 65 6c 49 64 20 3d 20 2b 2b 70 50 61  w->selId = ++pPa
14f0: 72 73 65 2d 3e 6e 53 65 6c 65 63 74 3b 0a 20 20  rse->nSelect;.  
1500: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
1510: 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[0] = -1;.  pN
1520: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
1530: 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [1] = -1;.  pNew
1540: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30  ->nSelectRow = 0
1550: 3b 0a 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20  ;.  if( pSrc==0 
1560: 29 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ) pSrc = sqlite3
1570: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
1580: 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  rse->db, sizeof(
1590: 2a 70 53 72 63 29 29 3b 0a 20 20 70 4e 65 77 2d  *pSrc));.  pNew-
15a0: 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
15b0: 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70  pNew->pWhere = p
15c0: 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70  Where;.  pNew->p
15d0: 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
15e0: 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76  By;.  pNew->pHav
15f0: 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20  ing = pHaving;. 
1600: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
1610: 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e  = pOrderBy;.  pN
1620: 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a  ew->pPrior = 0;.
1630: 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20    pNew->pNext = 
1640: 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  0;.  pNew->pLimi
1650: 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e  t = pLimit;.  pN
1660: 65 77 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 23  ew->pWith = 0;.#
1670: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1680: 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20  IT_WINDOWFUNC.  
1690: 70 4e 65 77 2d 3e 70 57 69 6e 20 3d 20 30 3b 0a  pNew->pWin = 0;.
16a0: 20 20 70 4e 65 77 2d 3e 70 57 69 6e 44 65 66 6e    pNew->pWinDefn
16b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69   = 0;.#endif.  i
16c0: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
16d0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a  allocFailed ) {.
16e0: 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28      clearSelect(
16f0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 65 77  pParse->db, pNew
1700: 2c 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e  , pNew!=&standin
1710: 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b  );.    pNew = 0;
1720: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
1730: 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 53 72 63  sert( pNew->pSrc
1740: 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  !=0 || pParse->n
1750: 45 72 72 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61  Err>0 );.  }.  a
1760: 73 73 65 72 74 28 20 70 4e 65 77 21 3d 26 73 74  ssert( pNew!=&st
1770: 61 6e 64 69 6e 20 29 3b 0a 20 20 72 65 74 75 72  andin );.  retur
1780: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  n pNew;.}.../*.*
1790: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67 69 76  * Delete the giv
17a0: 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  en Select struct
17b0: 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  ure and all of i
17c0: 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65 73  ts substructures
17d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
17e0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 73 71  3SelectDelete(sq
17f0: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
1800: 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 4f 4b 5f  t *p){.  if( OK_
1810: 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70  IF_ALWAYS_TRUE(p
1820: 29 20 29 20 63 6c 65 61 72 53 65 6c 65 63 74 28  ) ) clearSelect(
1830: 64 62 2c 20 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a  db, p, 1);.}../*
1840: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
1850: 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68  nter to the righ
1860: 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
1870: 61 74 65 6d 65 6e 74 20 69 6e 20 61 20 63 6f 6d  atement in a com
1880: 70 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  pound..*/.static
1890: 20 53 65 6c 65 63 74 20 2a 66 69 6e 64 52 69 67   Select *findRig
18a0: 68 74 6d 6f 73 74 28 53 65 6c 65 63 74 20 2a 70  htmost(Select *p
18b0: 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70  ){.  while( p->p
18c0: 4e 65 78 74 20 29 20 70 20 3d 20 70 2d 3e 70 4e  Next ) p = p->pN
18d0: 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  ext;.  return p;
18e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
18f0: 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65  1 to 3 identifie
1900: 72 73 20 70 72 65 63 65 64 69 6e 67 20 74 68 65  rs preceding the
1910: 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64   JOIN keyword, d
1920: 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20  etermine the.** 
1930: 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52  type of join.  R
1940: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
1950: 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 65   constant that e
1960: 78 70 72 65 73 73 65 73 20 74 68 61 74 20 74 79  xpresses that ty
1970: 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f  pe.** in terms o
1980: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1990: 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a  bit values:.**.*
19a0: 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a  *     JT_INNER.*
19b0: 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a  *     JT_CROSS.*
19c0: 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a  *     JT_OUTER.*
19d0: 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c  *     JT_NATURAL
19e0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a  .**     JT_LEFT.
19f0: 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54 0a  **     JT_RIGHT.
1a00: 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74  **.** A full out
1a10: 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20 63  er join is the c
1a20: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54  ombination of JT
1a30: 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49 47  _LEFT and JT_RIG
1a40: 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  HT..**.** If an 
1a50: 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75 70  illegal or unsup
1a60: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
1a70: 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 73   is seen, then s
1a80: 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61  till return.** a
1a90: 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74 20   join type, but 
1aa0: 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  put an error in 
1ab0: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
1ac0: 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ture..*/.int sql
1ad0: 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61 72  ite3JoinType(Par
1ae0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
1af0: 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42  n *pA, Token *pB
1b00: 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20  , Token *pC){.  
1b10: 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30  int jointype = 0
1b20: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c  ;.  Token *apAll
1b30: 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b  [3];.  Token *p;
1b40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b60: 20 20 20 30 31 32 33 34 35 36 37 38 39 20 31 32     0123456789 12
1b70: 33 34 35 36 37 38 39 20 31 32 33 34 35 36 37 38  3456789 12345678
1b80: 39 20 31 32 33 20 2a 2f 0a 20 20 73 74 61 74 69  9 123 */.  stati
1b90: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65  c const char zKe
1ba0: 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72  yText[] = "natur
1bb0: 61 6c 65 66 74 6f 75 74 65 72 69 67 68 74 66 75  aleftouterightfu
1bc0: 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20  llinnercross";. 
1bd0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
1be0: 72 75 63 74 20 7b 0a 20 20 20 20 75 38 20 69 3b  ruct {.    u8 i;
1bf0: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
1c00: 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72 64 20  ning of keyword 
1c10: 74 65 78 74 20 69 6e 20 7a 4b 65 79 54 65 78 74  text in zKeyText
1c20: 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68  [] */.    u8 nCh
1c30: 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68  ar;    /* Length
1c40: 20 6f 66 20 74 68 65 20 6b 65 79 77 6f 72 64 20   of the keyword 
1c50: 69 6e 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f  in characters */
1c60: 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 20 20 20  .    u8 code;   
1c70: 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d    /* Join type m
1c80: 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77  ask */.  } aKeyw
1c90: 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a  ord[] = {.    /*
1ca0: 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c   natural */ { 0,
1cb0: 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20    7, JT_NATURAL 
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1cd0: 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20 20 20  ,.    /* left   
1ce0: 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f   */ { 6,  4, JT_
1cf0: 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20  LEFT|JT_OUTER   
1d00: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1d10: 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20 31 30   outer   */ { 10
1d20: 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20  , 5, JT_OUTER   
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1d40: 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68 74 20 20  ,.    /* right  
1d50: 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f   */ { 14, 5, JT_
1d60: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20  RIGHT|JT_OUTER  
1d70: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1d80: 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39   full    */ { 19
1d90: 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f  , 4, JT_LEFT|JT_
1da0: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d  RIGHT|JT_OUTER }
1db0: 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20  ,.    /* inner  
1dc0: 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f   */ { 23, 5, JT_
1dd0: 49 4e 4e 45 52 20 20 20 20 20 20 20 20 20 20 20  INNER           
1de0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1df0: 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38   cross   */ { 28
1e00: 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54  , 5, JT_INNER|JT
1e10: 5f 43 52 4f 53 53 20 20 20 20 20 20 20 20 20 7d  _CROSS         }
1e20: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20  ,.  };.  int i, 
1e30: 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20  j;.  apAll[0] = 
1e40: 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d  pA;.  apAll[1] =
1e50: 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20   pB;.  apAll[2] 
1e60: 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  = pC;.  for(i=0;
1e70: 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d   i<3 && apAll[i]
1e80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
1e90: 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f  apAll[i];.    fo
1ea0: 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69  r(j=0; j<ArraySi
1eb0: 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b  ze(aKeyword); j+
1ec0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
1ed0: 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e  >n==aKeyword[j].
1ee0: 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20  nChar .         
1ef0: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
1f00: 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c  Cmp((char*)p->z,
1f10: 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65 79 77   &zKeyText[aKeyw
1f20: 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29  ord[j].i], p->n)
1f30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a  ==0 ){.        j
1f40: 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65 79 77  ointype |= aKeyw
1f50: 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20  ord[j].code;.   
1f60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65    }.    }.    te
1f80: 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20  stcase( j==0 || 
1f90: 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20  j==1 || j==2 || 
1fa0: 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20  j==3 || j==4 || 
1fb0: 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a  j==5 || j==6 );.
1fc0: 20 20 20 20 69 66 28 20 6a 3e 3d 41 72 72 61 79      if( j>=Array
1fd0: 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 20 29  Size(aKeyword) )
1fe0: 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  {.      jointype
1ff0: 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20   |= JT_ERROR;.  
2000: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2010: 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20  .  }.  if(.     
2020: 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f  (jointype & (JT_
2030: 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29  INNER|JT_OUTER))
2040: 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  ==(JT_INNER|JT_O
2050: 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a  UTER) ||.     (j
2060: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52  ointype & JT_ERR
2070: 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  OR)!=0.  ){.    
2080: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 20  const char *zSp 
2090: 3d 20 22 20 22 3b 0a 20 20 20 20 61 73 73 65 72  = " ";.    asser
20a0: 74 28 20 70 42 21 3d 30 20 29 3b 0a 20 20 20 20  t( pB!=0 );.    
20b0: 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70  if( pC==0 ){ zSp
20c0: 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74 65  ++; }.    sqlite
20d0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
20e0: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e  , "unknown or un
20f0: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
2100: 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22 25  ype: ".       "%
2110: 54 20 25 54 25 73 25 54 22 2c 20 70 41 2c 20 70  T %T%s%T", pA, p
2120: 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20  B, zSp, pC);.   
2130: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49   jointype = JT_I
2140: 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NNER;.  }else if
2150: 28 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  ( (jointype & JT
2160: 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20 20  _OUTER)!=0 .    
2170: 20 20 20 20 20 26 26 20 28 6a 6f 69 6e 74 79 70       && (jointyp
2180: 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  e & (JT_LEFT|JT_
2190: 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54  RIGHT))!=JT_LEFT
21a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
21b0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
21c0: 0a 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e  .      "RIGHT an
21d0: 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49  d FULL OUTER JOI
21e0: 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65  Ns are not curre
21f0: 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29  ntly supported")
2200: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
2210: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20   JT_INNER;.  }. 
2220: 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65   return jointype
2230: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2240: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  n the index of a
2250: 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62   column in a tab
2260: 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  le.  Return -1 i
2270: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  f the column.** 
2280: 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
2290: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
22a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c  /.static int col
22b0: 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a  umnIndex(Table *
22c0: 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72  pTab, const char
22d0: 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69   *zCol){.  int i
22e0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
22f0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
2300: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2310: 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43  StrICmp(pTab->aC
2320: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f  ol[i].zName, zCo
2330: 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  l)==0 ) return i
2340: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
2350: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  1;.}../*.** Sear
2360: 63 68 20 74 68 65 20 66 69 72 73 74 20 4e 20 74  ch the first N t
2370: 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2c 20 66  ables in pSrc, f
2380: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
2390: 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  t, looking for a
23a0: 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20 68  .** table that h
23b0: 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  as a column name
23c0: 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20  d zCol.  .**.** 
23d0: 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20  When found, set 
23e0: 2a 70 69 54 61 62 20 61 6e 64 20 2a 70 69 43 6f  *piTab and *piCo
23f0: 6c 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69  l to the table i
2400: 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  ndex and column 
2410: 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20  index.** of the 
2420: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
2430: 61 6e 64 20 72 65 74 75 72 6e 20 54 52 55 45 2e  and return TRUE.
2440: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f  .**.** If not fo
2450: 75 6e 64 2c 20 72 65 74 75 72 6e 20 46 41 4c 53  und, return FALS
2460: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
2470: 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49   tableAndColumnI
2480: 6e 64 65 78 28 0a 20 20 53 72 63 4c 69 73 74 20  ndex(.  SrcList 
2490: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 2f 2a 20  *pSrc,       /* 
24a0: 41 72 72 61 79 20 6f 66 20 74 61 62 6c 65 73 20  Array of tables 
24b0: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69  to search */.  i
24c0: 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
24d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
24e0: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2d   tables in pSrc-
24f0: 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63 68 20 2a  >a[] to search *
2500: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2510: 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65  zCol,    /* Name
2520: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77   of the column w
2530: 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f  e are looking fo
2540: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61  r */.  int *piTa
2550: 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  b,          /* W
2560: 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53  rite index of pS
2570: 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a  rc->a[] here */.
2580: 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20    int *piCol    
2590: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
25a0: 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e 61  index of pSrc->a
25b0: 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61  [*piTab].pTab->a
25c0: 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b  Col[] here */.){
25d0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
25e0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
25f0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c  ooping over tabl
2600: 65 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20  es in pSrc */.  
2610: 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  int iCol;       
2620: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2630: 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67   column matching
2640: 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65   zCol */..  asse
2650: 72 74 28 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d  rt( (piTab==0)==
2660: 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f  (piCol==0) );  /
2670: 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69 74 68 65  * Both or neithe
2680: 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  r are NULL */.  
2690: 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b  for(i=0; i<N; i+
26a0: 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63  +){.    iCol = c
26b0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d  olumnIndex(pSrc-
26c0: 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c  >a[i].pTab, zCol
26d0: 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e  );.    if( iCol>
26e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
26f0: 70 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  piTab ){.       
2700: 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20 20 20   *piTab = i;.   
2710: 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43       *piCol = iC
2720: 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ol;.      }.    
2730: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2740: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2750: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2760: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
2770: 20 74 6f 20 61 64 64 20 74 65 72 6d 73 20 69 6d   to add terms im
2780: 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20 73 79  plied by JOIN sy
2790: 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57  ntax to the.** W
27a0: 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72  HERE clause expr
27b0: 65 73 73 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45  ession of a SELE
27c0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  CT statement. Th
27d0: 65 20 6e 65 77 20 74 65 72 6d 2c 20 77 68 69 63  e new term, whic
27e0: 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20 77 69  h.** is ANDed wi
27f0: 74 68 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  th the existing 
2800: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 73  WHERE clause, is
2810: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
2820: 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e 63 6f 6c  .**    (tab1.col
2830: 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a  1 = tab2.col2).*
2840: 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 31 20  *.** where tab1 
2850: 69 73 20 74 68 65 20 69 53 72 63 27 74 68 20 74  is the iSrc'th t
2860: 61 62 6c 65 20 69 6e 20 53 72 63 4c 69 73 74 20  able in SrcList 
2870: 70 53 72 63 20 61 6e 64 20 74 61 62 32 20 69 73  pSrc and tab2 is
2880: 20 74 68 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31   the .** (iSrc+1
2890: 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c  )'th. Column col
28a0: 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c  1 is column iCol
28b0: 4c 65 66 74 20 6f 66 20 74 61 62 31 2c 20 61 6e  Left of tab1, an
28c0: 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c  d col2 is.** col
28d0: 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20 6f 66  umn iColRight of
28e0: 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63   tab2..*/.static
28f0: 20 76 6f 69 64 20 61 64 64 57 68 65 72 65 54 65   void addWhereTe
2900: 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rm(.  Parse *pPa
2910: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
2920: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
2930: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
2940: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2960: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
2970: 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  in FROM clause *
2980: 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c 20 20  /.  int iLeft,  
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
29b0: 66 69 72 73 74 20 74 61 62 6c 65 20 74 6f 20 6a  first table to j
29c0: 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20  oin in pSrc */. 
29d0: 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20   int iColLeft,  
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
2a00: 75 6d 6e 20 69 6e 20 66 69 72 73 74 20 74 61 62  umn in first tab
2a10: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67  le */.  int iRig
2a20: 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ht,             
2a30: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2a40: 20 6f 66 20 73 65 63 6f 6e 64 20 74 61 62 6c 65   of second table
2a50: 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e   in pSrc */.  in
2a60: 74 20 69 43 6f 6c 52 69 67 68 74 2c 20 20 20 20  t iColRight,    
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a80: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
2a90: 20 69 6e 20 73 65 63 6f 6e 64 20 74 61 62 6c 65   in second table
2aa0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74 65   */.  int isOute
2ab0: 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20 20 20  rJoin,          
2ac0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2ad0: 20 74 68 69 73 20 69 73 20 61 6e 20 4f 55 54 45   this is an OUTE
2ae0: 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72  R join */.  Expr
2af0: 20 2a 2a 70 70 57 68 65 72 65 20 20 20 20 20 20   **ppWhere      
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2b10: 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48 45 52 45  N/OUT: The WHERE
2b20: 20 63 6c 61 75 73 65 20 74 6f 20 61 64 64 20 74   clause to add t
2b30: 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  o */.){.  sqlite
2b40: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
2b50: 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 31 3b  db;.  Expr *pE1;
2b60: 0a 20 20 45 78 70 72 20 2a 70 45 32 3b 0a 20 20  .  Expr *pE2;.  
2b70: 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73  Expr *pEq;..  as
2b80: 73 65 72 74 28 20 69 4c 65 66 74 3c 69 52 69 67  sert( iLeft<iRig
2b90: 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ht );.  assert( 
2ba0: 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68  pSrc->nSrc>iRigh
2bb0: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
2bc0: 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54  Src->a[iLeft].pT
2bd0: 61 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ab );.  assert( 
2be0: 70 53 72 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e  pSrc->a[iRight].
2bf0: 70 54 61 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d  pTab );..  pE1 =
2c00: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f   sqlite3CreateCo
2c10: 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72  lumnExpr(db, pSr
2c20: 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65  c, iLeft, iColLe
2c30: 66 74 29 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c  ft);.  pE2 = sql
2c40: 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e  ite3CreateColumn
2c50: 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20 69  Expr(db, pSrc, i
2c60: 52 69 67 68 74 2c 20 69 43 6f 6c 52 69 67 68 74  Right, iColRight
2c70: 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71 6c 69  );..  pEq = sqli
2c80: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
2c90: 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70 45 32   TK_EQ, pE1, pE2
2ca0: 29 3b 0a 20 20 69 66 28 20 70 45 71 20 26 26 20  );.  if( pEq && 
2cb0: 69 73 4f 75 74 65 72 4a 6f 69 6e 20 29 7b 0a 20  isOuterJoin ){. 
2cc0: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
2cd0: 74 79 28 70 45 71 2c 20 45 50 5f 46 72 6f 6d 4a  ty(pEq, EP_FromJ
2ce0: 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74  oin);.    assert
2cf0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2d00: 74 79 28 70 45 71 2c 20 45 50 5f 54 6f 6b 65 6e  ty(pEq, EP_Token
2d10: 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
2d20: 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74 56   );.    ExprSetV
2d30: 56 41 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20  VAProperty(pEq, 
2d40: 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
2d50: 20 20 70 45 71 2d 3e 69 52 69 67 68 74 4a 6f 69    pEq->iRightJoi
2d60: 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 70 45  nTable = (i16)pE
2d70: 32 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 7d 0a 20  2->iTable;.  }. 
2d80: 20 2a 70 70 57 68 65 72 65 20 3d 20 73 71 6c 69   *ppWhere = sqli
2d90: 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 2a  te3ExprAnd(db, *
2da0: 70 70 57 68 65 72 65 2c 20 70 45 71 29 3b 0a 7d  ppWhere, pEq);.}
2db0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
2dc0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70  EP_FromJoin prop
2dd0: 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  erty on all term
2de0: 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  s of the given e
2df0: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e  xpression..** An
2e00: 64 20 73 65 74 20 74 68 65 20 45 78 70 72 2e 69  d set the Expr.i
2e10: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74  RightJoinTable t
2e20: 6f 20 69 54 61 62 6c 65 20 66 6f 72 20 65 76 65  o iTable for eve
2e30: 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a  ry term in the.*
2e40: 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  * expression..**
2e50: 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a  .** The EP_FromJ
2e60: 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 69 73 20  oin property is 
2e70: 75 73 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66  used on terms of
2e80: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
2e90: 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45  o tell.** the LE
2ea0: 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72  FT OUTER JOIN pr
2eb0: 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 74  ocessing logic t
2ec0: 68 61 74 20 74 68 69 73 20 74 65 72 6d 20 69 73  hat this term is
2ed0: 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20   part of the.** 
2ee0: 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69 6f 6e  join restriction
2ef0: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
2f00: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
2f10: 61 75 73 65 20 61 6e 64 20 6e 6f 74 20 61 20 70  ause and not a p
2f20: 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f  art.** of the mo
2f30: 72 65 20 67 65 6e 65 72 61 6c 20 57 48 45 52 45  re general WHERE
2f40: 20 63 6c 61 75 73 65 2e 20 20 54 68 65 73 65 20   clause.  These 
2f50: 74 65 72 6d 73 20 61 72 65 20 6d 6f 76 65 64 20  terms are moved 
2f60: 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57  over to the.** W
2f70: 48 45 52 45 20 63 6c 61 75 73 65 20 64 75 72 69  HERE clause duri
2f80: 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69  ng join processi
2f90: 6e 67 20 62 75 74 20 77 65 20 6e 65 65 64 20 74  ng but we need t
2fa0: 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 20  o remember that 
2fb0: 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74  they.** originat
2fc0: 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  ed in the ON or 
2fd0: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a  USING clause..**
2fe0: 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 69 52 69  .** The Expr.iRi
2ff0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c  ghtJoinTable tel
3000: 6c 73 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ls the WHERE cla
3010: 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 74  use processing t
3020: 68 61 74 20 74 68 65 0a 2a 2a 20 65 78 70 72 65  hat the.** expre
3030: 73 73 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e  ssion depends on
3040: 20 74 61 62 6c 65 20 69 52 69 67 68 74 4a 6f 69   table iRightJoi
3050: 6e 54 61 62 6c 65 20 65 76 65 6e 20 69 66 20 74  nTable even if t
3060: 68 61 74 20 74 61 62 6c 65 20 69 73 20 6e 6f 74  hat table is not
3070: 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 6d  .** explicitly m
3080: 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20  entioned in the 
3090: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 61  expression.  Tha
30a0: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  t information is
30b0: 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63   needed.** for c
30c0: 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ases like this:.
30d0: 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
30e0: 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a  * FROM t1 LEFT J
30f0: 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74  OIN t2 ON t1.a=t
3100: 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a  2.b AND t1.x=5.*
3110: 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72 65 20 63  *.** The where c
3120: 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20 64  lause needs to d
3130: 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e  efer the handlin
3140: 67 20 6f 66 20 74 68 65 20 74 31 2e 78 3d 35 0a  g of the t1.x=5.
3150: 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20 61 66  ** term until af
3160: 74 65 72 20 74 68 65 20 74 32 20 6c 6f 6f 70 20  ter the t2 loop 
3170: 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e  of the join.  In
3180: 20 74 68 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20   that way, a.** 
3190: 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c  NULL t2 row will
31a0: 20 62 65 20 69 6e 73 65 72 74 65 64 20 77 68 65   be inserted whe
31b0: 6e 65 76 65 72 20 74 31 2e 78 21 3d 35 2e 20 20  never t1.x!=5.  
31c0: 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20  If we do not.** 
31d0: 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69  defer the handli
31e0: 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74  ng of t1.x=5, it
31f0: 20 77 69 6c 6c 20 62 65 20 70 72 6f 63 65 73 73   will be process
3200: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  ed immediately.*
3210: 2a 20 61 66 74 65 72 20 74 68 65 20 74 31 20 6c  * after the t1 l
3220: 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20 77 69 74  oop and rows wit
3230: 68 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e  h t1.x!=5 will n
3240: 65 76 65 72 20 61 70 70 65 61 72 20 69 6e 0a 2a  ever appear in.*
3250: 2a 20 74 68 65 20 6f 75 74 70 75 74 2c 20 77 68  * the output, wh
3260: 69 63 68 20 69 73 20 69 6e 63 6f 72 72 65 63 74  ich is incorrect
3270: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3280: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78 70   setJoinExpr(Exp
3290: 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65  r *p, int iTable
32a0: 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  ){.  while( p ){
32b0: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
32c0: 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a  erty(p, EP_FromJ
32d0: 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74  oin);.    assert
32e0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
32f0: 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ty(p, EP_TokenOn
3300: 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
3310: 3b 0a 20 20 20 20 45 78 70 72 53 65 74 56 56 41  ;.    ExprSetVVA
3320: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4e  Property(p, EP_N
3330: 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 70 2d  oReduce);.    p-
3340: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
3350: 20 3d 20 28 69 31 36 29 69 54 61 62 6c 65 3b 0a   = (i16)iTable;.
3360: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
3370: 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26 20 70 2d  K_FUNCTION && p-
3380: 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  >x.pList ){.    
3390: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
33a0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 78 2e 70  or(i=0; i<p->x.p
33b0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
33c0: 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74 4a 6f  ){.        setJo
33d0: 69 6e 45 78 70 72 28 70 2d 3e 78 2e 70 4c 69 73  inExpr(p->x.pLis
33e0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69  t->a[i].pExpr, i
33f0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Table);.      }.
3400: 20 20 20 20 7d 0a 20 20 20 20 73 65 74 4a 6f 69      }.    setJoi
3410: 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20  nExpr(p->pLeft, 
3420: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d  iTable);.    p =
3430: 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20   p->pRight;.  } 
3440: 0a 7d 0a 0a 2f 2a 20 55 6e 64 6f 20 74 68 65 20  .}../* Undo the 
3450: 77 6f 72 6b 20 6f 66 20 73 65 74 4a 6f 69 6e 45  work of setJoinE
3460: 78 70 72 28 29 2e 20 20 49 6e 20 74 68 65 20 65  xpr().  In the e
3470: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 70  xpression tree p
3480: 2c 20 63 6f 6e 76 65 72 74 20 65 76 65 72 79 0a  , convert every.
3490: 2a 2a 20 74 65 72 6d 20 74 68 61 74 20 69 73 20  ** term that is 
34a0: 6d 61 72 6b 65 64 20 77 69 74 68 20 45 50 5f 46  marked with EP_F
34b0: 72 6f 6d 4a 6f 69 6e 20 61 6e 64 20 69 52 69 67  romJoin and iRig
34c0: 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54 61  htJoinTable==iTa
34d0: 62 6c 65 20 69 6e 74 6f 0a 2a 2a 20 61 6e 20 6f  ble into.** an o
34e0: 72 64 69 6e 61 72 79 20 74 65 72 6d 20 74 68 61  rdinary term tha
34f0: 74 20 6f 6d 69 74 73 20 74 68 65 20 45 50 5f 46  t omits the EP_F
3500: 72 6f 6d 4a 6f 69 6e 20 6d 61 72 6b 2e 0a 2a 2a  romJoin mark..**
3510: 0a 2a 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73  .** This happens
3520: 20 77 68 65 6e 20 61 20 4c 45 46 54 20 4a 4f 49   when a LEFT JOI
3530: 4e 20 69 73 20 73 69 6d 70 6c 69 66 69 65 64 20  N is simplified 
3540: 69 6e 74 6f 20 61 6e 20 6f 72 64 69 6e 61 72 79  into an ordinary
3550: 20 4a 4f 49 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63   JOIN..*/.static
3560: 20 76 6f 69 64 20 75 6e 73 65 74 4a 6f 69 6e 45   void unsetJoinE
3570: 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  xpr(Expr *p, int
3580: 20 69 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c   iTable){.  whil
3590: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  e( p ){.    if( 
35a0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
35b0: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a  p, EP_FromJoin).
35c0: 20 20 20 20 20 26 26 20 28 69 54 61 62 6c 65 3c       && (iTable<
35d0: 30 20 7c 7c 20 70 2d 3e 69 52 69 67 68 74 4a 6f  0 || p->iRightJo
35e0: 69 6e 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 29  inTable==iTable)
35f0: 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 43 6c   ){.      ExprCl
3600: 65 61 72 50 72 6f 70 65 72 74 79 28 70 2c 20 45  earProperty(p, E
3610: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20  P_FromJoin);.   
3620: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70   }.    if( p->op
3630: 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26  ==TK_FUNCTION &&
3640: 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20   p->x.pList ){. 
3650: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
3660: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
3670: 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  x.pList->nExpr; 
3680: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 6e  i++){.        un
3690: 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 78  setJoinExpr(p->x
36a0: 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
36b0: 70 72 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20  pr, iTable);.   
36c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75     }.    }.    u
36d0: 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e  nsetJoinExpr(p->
36e0: 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a  pLeft, iTable);.
36f0: 20 20 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68      p = p->pRigh
3700: 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  t;.  } .}../*.**
3710: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72   This routine pr
3720: 6f 63 65 73 73 65 73 20 74 68 65 20 6a 6f 69 6e  ocesses the join
3730: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
3740: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
3750: 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55  ent..** ON and U
3760: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65  SING clauses are
3770: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
3780: 65 78 74 72 61 20 74 65 72 6d 73 20 6f 66 20 74  extra terms of t
3790: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
37a0: 0a 2a 2a 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e  .** NATURAL join
37b0: 73 20 61 6c 73 6f 20 63 72 65 61 74 65 20 65 78  s also create ex
37c0: 74 72 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  tra WHERE clause
37d0: 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   terms..**.** Th
37e0: 65 20 74 65 72 6d 73 20 6f 66 20 61 20 46 52 4f  e terms of a FRO
37f0: 4d 20 63 6c 61 75 73 65 20 61 72 65 20 63 6f 6e  M clause are con
3800: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 53 65  tained in the Se
3810: 6c 65 63 74 2e 70 53 72 63 20 73 74 72 75 63 74  lect.pSrc struct
3820: 75 72 65 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74  ure..** The left
3830: 20 6d 6f 73 74 20 74 61 62 6c 65 20 69 73 20 74   most table is t
3840: 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
3850: 6e 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 20 20  n Select.pSrc.  
3860: 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a  The right-most.*
3870: 2a 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 6c  * table is the l
3880: 61 73 74 20 65 6e 74 72 79 2e 20 20 54 68 65 20  ast entry.  The 
3890: 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 69 73  join operator is
38a0: 20 68 65 6c 64 20 69 6e 20 74 68 65 20 65 6e 74   held in the ent
38b0: 72 79 20 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66  ry to.** the lef
38c0: 74 2e 20 20 54 68 75 73 20 65 6e 74 72 79 20 30  t.  Thus entry 0
38d0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f   contains the jo
38e0: 69 6e 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20  in operator for 
38f0: 74 68 65 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e  the join between
3900: 0a 2a 2a 20 65 6e 74 72 69 65 73 20 30 20 61 6e  .** entries 0 an
3910: 64 20 31 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20  d 1.  Any ON or 
3920: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 73  USING clauses as
3930: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
3940: 65 20 6a 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c  e join are.** al
3950: 73 6f 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  so attached to t
3960: 68 65 20 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a  he left entry..*
3970: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3980: 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  e returns the nu
3990: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65  mber of errors e
39a0: 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73  ncountered..*/.s
39b0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
39c0: 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50 61 72 73  ProcessJoin(Pars
39d0: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
39e0: 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74  t *p){.  SrcList
39f0: 20 2a 70 53 72 63 3b 20 20 20 20 20 20 20 20 20   *pSrc;         
3a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
3a10: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
3a20: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  OM clause */.  i
3a30: 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3a50: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
3a60: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
3a70: 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b  ist_item *pLeft;
3a80: 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 74 61 62       /* Left tab
3a90: 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20  le being joined 
3aa0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
3ab0: 69 73 74 5f 69 74 65 6d 20 2a 70 52 69 67 68 74  ist_item *pRight
3ac0: 3b 20 20 20 20 2f 2a 20 52 69 67 68 74 20 74 61  ;    /* Right ta
3ad0: 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64  ble being joined
3ae0: 20 2a 2f 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d   */..  pSrc = p-
3af0: 3e 70 53 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d  >pSrc;.  pLeft =
3b00: 20 26 70 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20   &pSrc->a[0];.  
3b10: 70 52 69 67 68 74 20 3d 20 26 70 4c 65 66 74 5b  pRight = &pLeft[
3b20: 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  1];.  for(i=0; i
3b30: 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69  <pSrc->nSrc-1; i
3b40: 2b 2b 2c 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c  ++, pRight++, pL
3b50: 65 66 74 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  eft++){.    Tabl
3b60: 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70  e *pRightTab = p
3b70: 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20  Right->pTab;.   
3b80: 20 69 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20   int isOuter;.. 
3b90: 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 4c 65     if( NEVER(pLe
3ba0: 66 74 2d 3e 70 54 61 62 3d 3d 30 20 7c 7c 20 70  ft->pTab==0 || p
3bb0: 52 69 67 68 74 54 61 62 3d 3d 30 29 20 29 20 63  RightTab==0) ) c
3bc0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 73 4f  ontinue;.    isO
3bd0: 75 74 65 72 20 3d 20 28 70 52 69 67 68 74 2d 3e  uter = (pRight->
3be0: 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  fg.jointype & JT
3bf0: 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a 20 20 20  _OUTER)!=0;..   
3c00: 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54   /* When the NAT
3c10: 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20  URAL keyword is 
3c20: 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45  present, add WHE
3c30: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
3c40: 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79  for.    ** every
3c50: 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65   column that the
3c60: 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65   two tables have
3c70: 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20   in common..    
3c80: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
3c90: 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  t->fg.jointype &
3ca0: 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20   JT_NATURAL ){. 
3cb0: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
3cc0: 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e  >pOn || pRight->
3cd0: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
3ce0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
3cf0: 67 28 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54  g(pParse, "a NAT
3d00: 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f  URAL join may no
3d10: 74 20 68 61 76 65 20 22 0a 20 20 20 20 20 20 20  t have ".       
3d20: 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53      "an ON or US
3d30: 49 4e 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b  ING clause", 0);
3d40: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3d50: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
3d60: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67   for(j=0; j<pRig
3d70: 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  htTab->nCol; j++
3d80: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
3d90: 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d  *zName;   /* Nam
3da0: 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  e of column in t
3db0: 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 2a  he right table *
3dc0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c  /.        int iL
3dd0: 65 66 74 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63  eft;     /* Matc
3de0: 68 69 6e 67 20 6c 65 66 74 20 74 61 62 6c 65 20  hing left table 
3df0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
3e00: 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74  LeftCol;  /* Mat
3e10: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20  ching column in 
3e20: 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 2a  the left table *
3e30: 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  /..        zName
3e40: 20 3d 20 70 52 69 67 68 74 54 61 62 2d 3e 61 43   = pRightTab->aC
3e50: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol[j].zName;.   
3e60: 20 20 20 20 20 69 66 28 20 74 61 62 6c 65 41 6e       if( tableAn
3e70: 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72  dColumnIndex(pSr
3e80: 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26  c, i+1, zName, &
3e90: 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c  iLeft, &iLeftCol
3ea0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
3eb0: 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72  ddWhereTerm(pPar
3ec0: 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c  se, pSrc, iLeft,
3ed0: 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20   iLeftCol, i+1, 
3ee0: 6a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  j,.             
3ef0: 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74 65            isOute
3f00: 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a  r, &p->pWhere);.
3f10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3f20: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
3f30: 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e  Disallow both ON
3f40: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
3f50: 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a  es in the same j
3f60: 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  oin.    */.    i
3f70: 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26  f( pRight->pOn &
3f80: 26 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  & pRight->pUsing
3f90: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
3fa0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
3fb0: 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62  , "cannot have b
3fc0: 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  oth ON and USING
3fd0: 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75   ".        "clau
3fe0: 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ses in the same 
3ff0: 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  join");.      re
4000: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  turn 1;.    }.. 
4010: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e     /* Add the ON
4020: 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65   clause to the e
4030: 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
4040: 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65  clause, connecte
4050: 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41  d by.    ** an A
4060: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20  ND operator..   
4070: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
4080: 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20  ht->pOn ){.     
4090: 20 69 66 28 20 69 73 4f 75 74 65 72 20 29 20 73   if( isOuter ) s
40a0: 65 74 4a 6f 69 6e 45 78 70 72 28 70 52 69 67 68  etJoinExpr(pRigh
40b0: 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e  t->pOn, pRight->
40c0: 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
40d0: 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  p->pWhere = sqli
40e0: 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
40f0: 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  e->db, p->pWhere
4100: 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a  , pRight->pOn);.
4110: 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f        pRight->pO
4120: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  n = 0;.    }..  
4130: 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72    /* Create extr
4140: 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57  a terms on the W
4150: 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20  HERE clause for 
4160: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  each column name
4170: 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  d.    ** in the 
4180: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45  USING clause.  E
4190: 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74  xample: If the t
41a0: 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  wo tables to be 
41b0: 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20  joined are .    
41c0: 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74  ** A and B and t
41d0: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
41e0: 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20  names X, Y, and 
41f0: 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69 73  Z, then add this
4200: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57  .    ** to the W
4210: 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20  HERE clause:    
4220: 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d  A.X=B.X AND A.Y=
4230: 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a  B.Y AND A.Z=B.Z.
4240: 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e      ** Report an
4250: 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f   error if any co
4260: 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69  lumn mentioned i
4270: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
4280: 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74  se is.    ** not
4290: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f   contained in bo
42a0: 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  th tables to be 
42b0: 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  joined..    */. 
42c0: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
42d0: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49  Using ){.      I
42e0: 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  dList *pList = p
42f0: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20  Right->pUsing;. 
4300: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
4310: 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29  pList->nId; j++)
4320: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
4330: 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61  zName;     /* Na
4340: 6d 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20 69  me of the term i
4350: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
4360: 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  se */.        in
4370: 74 20 69 4c 65 66 74 3b 20 20 20 20 20 20 20 2f  t iLeft;       /
4380: 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c  * Table on the l
4390: 65 66 74 20 77 69 74 68 20 6d 61 74 63 68 69 6e  eft with matchin
43a0: 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  g column name */
43b0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
43c0: 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c  ftCol;    /* Col
43d0: 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61  umn number of ma
43e0: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e  tching column on
43f0: 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20   the left */.   
4400: 20 20 20 20 20 69 6e 74 20 69 52 69 67 68 74 43       int iRightC
4410: 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  ol;   /* Column 
4420: 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69  number of matchi
4430: 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65  ng column on the
4440: 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20   right */..     
4450: 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74     zName = pList
4460: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[j].zName;.  
4470: 20 20 20 20 20 20 69 52 69 67 68 74 43 6f 6c 20        iRightCol 
4480: 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52  = columnIndex(pR
4490: 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b  ightTab, zName);
44a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 52 69  .        if( iRi
44b0: 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20  ghtCol<0.       
44c0: 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f    || !tableAndCo
44d0: 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20  lumnIndex(pSrc, 
44e0: 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65  i+1, zName, &iLe
44f0: 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20  ft, &iLeftCol). 
4500: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
4510: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4520: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
4530: 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63  not join using c
4540: 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d  olumn %s - colum
4550: 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  n ".            
4560: 22 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20  "not present in 
4570: 62 6f 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e  both tables", zN
4580: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
4590: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
45a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57    }.        addW
45b0: 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c  hereTerm(pParse,
45c0: 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c   pSrc, iLeft, iL
45d0: 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69  eftCol, i+1, iRi
45e0: 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20  ghtCol,.        
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
4600: 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  uter, &p->pWhere
4610: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
4620: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
4630: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  .}../*.** An ins
4640: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
4650: 6a 65 63 74 20 68 6f 6c 64 73 20 69 6e 66 6f 72  ject holds infor
4660: 6d 61 74 69 6f 6e 20 28 62 65 79 6f 6e 64 20 70  mation (beyond p
4670: 50 61 72 73 65 20 61 6e 64 20 70 53 65 6c 65 63  Parse and pSelec
4680: 74 29 0a 2a 2a 20 6e 65 65 64 65 64 20 74 6f 20  t).** needed to 
4690: 6c 6f 61 64 20 74 68 65 20 6e 65 78 74 20 72 65  load the next re
46a0: 73 75 6c 74 20 72 6f 77 20 74 68 61 74 20 69 73  sult row that is
46b0: 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
46c0: 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 74  the sorter..*/.t
46d0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 52 6f  ypedef struct Ro
46e0: 77 4c 6f 61 64 49 6e 66 6f 20 52 6f 77 4c 6f 61  wLoadInfo RowLoa
46f0: 64 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20 52 6f  dInfo;.struct Ro
4700: 77 4c 6f 61 64 49 6e 66 6f 20 7b 0a 20 20 69 6e  wLoadInfo {.  in
4710: 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20  t regResult;    
4720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
4730: 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61  ore results in a
4740: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
4750: 73 20 68 65 72 65 20 2a 2f 0a 20 20 75 38 20 65  s here */.  u8 e
4760: 63 65 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20  celFlags;       
4770: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
4780: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 45 78 70   argument to Exp
4790: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 29 20  rCodeExprList() 
47a0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
47b0: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
47c0: 45 46 45 52 45 4e 43 45 53 0a 20 20 45 78 70 72  EFERENCES.  Expr
47d0: 4c 69 73 74 20 2a 70 45 78 74 72 61 3b 20 20 20  List *pExtra;   
47e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
47f0: 61 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64  a columns needed
4800: 20 62 79 20 73 6f 72 74 65 72 20 72 65 66 73 20   by sorter refs 
4810: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 78 74 72  */.  int regExtr
4820: 61 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  aResult;        
4830: 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6c 6f    /* Where to lo
4840: 61 64 20 74 68 65 20 65 78 74 72 61 20 63 6f 6c  ad the extra col
4850: 75 6d 6e 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  umns */.#endif.}
4860: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ;../*.** This ro
4870: 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77  utine does the w
4880: 6f 72 6b 20 6f 66 20 6c 6f 61 64 69 6e 67 20 71  ork of loading q
4890: 75 65 72 79 20 64 61 74 61 20 69 6e 74 6f 20 61  uery data into a
48a0: 6e 20 61 72 72 61 79 20 6f 66 0a 2a 2a 20 72 65  n array of.** re
48b0: 67 69 73 74 65 72 73 20 73 6f 20 74 68 61 74 20  gisters so that 
48c0: 69 74 20 63 61 6e 20 62 65 20 61 64 64 65 64 20  it can be added 
48d0: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a  to the sorter..*
48e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
48f0: 6e 65 72 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28 0a  nerLoopLoadRow(.
4900: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
4910: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4920: 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  Statement under 
4930: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
4940: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
4950: 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
4960: 54 68 65 20 71 75 65 72 79 20 62 65 69 6e 67 20  The query being 
4970: 63 6f 64 65 64 20 2a 2f 0a 20 20 52 6f 77 4c 6f  coded */.  RowLo
4980: 61 64 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  adInfo *pInfo   
4990: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6e 65        /* Info ne
49a0: 65 64 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65  eded to complete
49b0: 20 74 68 65 20 72 6f 77 20 6c 6f 61 64 20 2a 2f   the row load */
49c0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  .){.  sqlite3Exp
49d0: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
49e0: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70  arse, pSelect->p
49f0: 45 4c 69 73 74 2c 20 70 49 6e 66 6f 2d 3e 72 65  EList, pInfo->re
4a00: 67 52 65 73 75 6c 74 2c 0a 20 20 20 20 20 20 20  gResult,.       
4a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a20: 20 20 20 30 2c 20 70 49 6e 66 6f 2d 3e 65 63 65     0, pInfo->ece
4a30: 6c 46 6c 61 67 73 29 3b 0a 23 69 66 64 65 66 20  lFlags);.#ifdef 
4a40: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
4a50: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
4a60: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 70 45 78    if( pInfo->pEx
4a70: 74 72 61 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  tra ){.    sqlit
4a80: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
4a90: 73 74 28 70 50 61 72 73 65 2c 20 70 49 6e 66 6f  st(pParse, pInfo
4aa0: 2d 3e 70 45 78 74 72 61 2c 20 70 49 6e 66 6f 2d  ->pExtra, pInfo-
4ab0: 3e 72 65 67 45 78 74 72 61 52 65 73 75 6c 74 2c  >regExtraResult,
4ac0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
4ad0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
4ae0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49  e(pParse->db, pI
4af0: 6e 66 6f 2d 3e 70 45 78 74 72 61 29 3b 0a 20 20  nfo->pExtra);.  
4b00: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
4b10: 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 4d 61  * Code the OP_Ma
4b20: 6b 65 52 65 63 6f 72 64 20 69 6e 73 74 72 75 63  keRecord instruc
4b30: 74 69 6f 6e 20 74 68 61 74 20 67 65 6e 65 72 61  tion that genera
4b40: 74 65 73 20 74 68 65 20 65 6e 74 72 79 20 74 6f  tes the entry to
4b50: 20 62 65 0a 2a 2a 20 61 64 64 65 64 20 69 6e 74   be.** added int
4b60: 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2a  o the sorter..**
4b70: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72  .** Return the r
4b80: 65 67 69 73 74 65 72 20 69 6e 20 77 68 69 63 68  egister in which
4b90: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73   the result is s
4ba0: 74 6f 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  tored..*/.static
4bb0: 20 69 6e 74 20 6d 61 6b 65 53 6f 72 74 65 72 52   int makeSorterR
4bc0: 65 63 6f 72 64 28 0a 20 20 50 61 72 73 65 20 2a  ecord(.  Parse *
4bd0: 70 50 61 72 73 65 2c 0a 20 20 53 6f 72 74 43 74  pParse,.  SortCt
4be0: 78 20 2a 70 53 6f 72 74 2c 0a 20 20 53 65 6c 65  x *pSort,.  Sele
4bf0: 63 74 20 2a 70 53 65 6c 65 63 74 2c 0a 20 20 69  ct *pSelect,.  i
4c00: 6e 74 20 72 65 67 42 61 73 65 2c 0a 20 20 69 6e  nt regBase,.  in
4c10: 74 20 6e 42 61 73 65 0a 29 7b 0a 20 20 69 6e 74  t nBase.){.  int
4c20: 20 6e 4f 42 53 61 74 20 3d 20 70 53 6f 72 74 2d   nOBSat = pSort-
4c30: 3e 6e 4f 42 53 61 74 3b 0a 20 20 56 64 62 65 20  >nOBSat;.  Vdbe 
4c40: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
4c50: 62 65 3b 0a 20 20 69 6e 74 20 72 65 67 4f 75 74  be;.  int regOut
4c60: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
4c70: 6d 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e  m;.  if( pSort->
4c80: 70 44 65 66 65 72 72 65 64 52 6f 77 4c 6f 61 64  pDeferredRowLoad
4c90: 20 29 7b 0a 20 20 20 20 69 6e 6e 65 72 4c 6f 6f   ){.    innerLoo
4ca0: 70 4c 6f 61 64 52 6f 77 28 70 50 61 72 73 65 2c  pLoadRow(pParse,
4cb0: 20 70 53 65 6c 65 63 74 2c 20 70 53 6f 72 74 2d   pSelect, pSort-
4cc0: 3e 70 44 65 66 65 72 72 65 64 52 6f 77 4c 6f 61  >pDeferredRowLoa
4cd0: 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
4ce0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4cf0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
4d00: 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42  gBase+nOBSat, nB
4d10: 61 73 65 2d 6e 4f 42 53 61 74 2c 20 72 65 67 4f  ase-nOBSat, regO
4d20: 75 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  ut);.  return re
4d30: 67 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  gOut;.}../*.** G
4d40: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
4d50: 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20  t will push the 
4d60: 72 65 63 6f 72 64 20 69 6e 20 72 65 67 69 73 74  record in regist
4d70: 65 72 73 20 72 65 67 44 61 74 61 0a 2a 2a 20 74  ers regData.** t
4d80: 68 72 6f 75 67 68 20 72 65 67 44 61 74 61 2b 6e  hrough regData+n
4d90: 44 61 74 61 2d 31 20 6f 6e 74 6f 20 74 68 65 20  Data-1 onto the 
4da0: 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  sorter..*/.stati
4db0: 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53  c void pushOntoS
4dc0: 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a  orter(.  Parse *
4dd0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
4de0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
4df0: 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a  t */.  SortCtx *
4e00: 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20 2f 2a  pSort,        /*
4e10: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
4e20: 75 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ut the ORDER BY 
4e30: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65  clause */.  Sele
4e40: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20  ct *pSelect,    
4e50: 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20     /* The whole 
4e60: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
4e70: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74   */.  int regDat
4e80: 61 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a,           /* 
4e90: 46 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68  First register h
4ea0: 6f 6c 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62  olding data to b
4eb0: 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e  e sorted */.  in
4ec0: 74 20 72 65 67 4f 72 69 67 44 61 74 61 2c 20 20  t regOrigData,  
4ed0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65       /* First re
4ee0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64  gister holding d
4ef0: 61 74 61 20 62 65 66 6f 72 65 20 70 61 63 6b 69  ata before packi
4f00: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74  ng */.  int nDat
4f10: 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  a,             /
4f20: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
4f30: 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65 67 44  ents in the regD
4f40: 61 74 61 20 64 61 74 61 20 61 72 72 61 79 20 2a  ata data array *
4f50: 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52  /.  int nPrefixR
4f60: 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  eg         /* No
4f70: 2e 20 6f 66 20 72 65 67 20 70 72 69 6f 72 20 74  . of reg prior t
4f80: 6f 20 72 65 67 44 61 74 61 20 61 76 61 69 6c 61  o regData availa
4f90: 62 6c 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29  ble for use */.)
4fa0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
4fb0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
4fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fd0: 20 20 20 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64       /* Stmt und
4fe0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
4ff0: 2a 2f 0a 20 20 69 6e 74 20 62 53 65 71 20 3d 20  */.  int bSeq = 
5000: 28 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ((pSort->sortFla
5010: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
5020: 65 53 6f 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20  eSorter)==0);.  
5030: 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 53 6f 72  int nExpr = pSor
5040: 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t->pOrderBy->nEx
5050: 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
5060: 20 2f 2a 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52   /* No. of ORDER
5070: 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69   BY terms */.  i
5080: 6e 74 20 6e 42 61 73 65 20 3d 20 6e 45 78 70 72  nt nBase = nExpr
5090: 20 2b 20 62 53 65 71 20 2b 20 6e 44 61 74 61 3b   + bSeq + nData;
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50b0: 2f 2a 20 46 69 65 6c 64 73 20 69 6e 20 73 6f 72  /* Fields in sor
50c0: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
50d0: 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
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 20 20 20 20 20 20 20 20 20                  
5100: 20 2f 2a 20 52 65 67 73 20 66 6f 72 20 73 6f 72   /* Regs for sor
5110: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
5120: 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20  int regRecord = 
5130: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
5140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5150: 20 2f 2a 20 41 73 73 65 6d 62 6c 65 64 20 73 6f   /* Assembled so
5160: 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20  rter record */. 
5170: 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20 70 53   int nOBSat = pS
5180: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20  ort->nOBSat;    
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51a0: 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65    /* ORDER BY te
51b0: 72 6d 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20  rms to skip */. 
51c0: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
51d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51e0: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f      /* Opcode to
51f0: 20 61 64 64 20 73 6f 72 74 65 72 20 72 65 63 6f   add sorter reco
5200: 72 64 20 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a  rd to sorter */.
5210: 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 20 20 20    int iLimit;   
5220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5230: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 63 6f       /* LIMIT co
5240: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  unter */.  int i
5250: 53 6b 69 70 20 3d 20 30 3b 20 20 20 20 20 20 20  Skip = 0;       
5260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5270: 20 45 6e 64 20 6f 66 20 74 68 65 20 73 6f 72 74   End of the sort
5280: 65 72 20 69 6e 73 65 72 74 20 6c 6f 6f 70 20 2a  er insert loop *
5290: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 62 53 65  /..  assert( bSe
52a0: 71 3d 3d 30 20 7c 7c 20 62 53 65 71 3d 3d 31 20  q==0 || bSeq==1 
52b0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 72 65 65 20 63  );..  /* Three c
52c0: 61 73 65 73 3a 0a 20 20 2a 2a 20 20 20 28 31 29  ases:.  **   (1)
52d0: 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65 20   The data to be 
52e0: 73 6f 72 74 65 64 20 68 61 73 20 61 6c 72 65 61  sorted has alrea
52f0: 64 79 20 62 65 65 6e 20 70 61 63 6b 65 64 20 69  dy been packed i
5300: 6e 74 6f 20 61 20 52 65 63 6f 72 64 0a 20 20 2a  nto a Record.  *
5310: 2a 20 20 20 20 20 20 20 62 79 20 61 20 70 72 69  *       by a pri
5320: 6f 72 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  or OP_MakeRecord
5330: 2e 20 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  .  In this case 
5340: 6e 44 61 74 61 3d 3d 31 20 61 6e 64 20 72 65 67  nData==1 and reg
5350: 44 61 74 61 0a 20 20 2a 2a 20 20 20 20 20 20 20  Data.  **       
5360: 77 69 6c 6c 20 62 65 20 63 6f 6d 70 6c 65 74 65  will be complete
5370: 6c 79 20 75 6e 72 65 6c 61 74 65 64 20 74 6f 20  ly unrelated to 
5380: 72 65 67 4f 72 69 67 44 61 74 61 2e 0a 20 20 2a  regOrigData..  *
5390: 2a 20 20 20 28 32 29 20 41 6c 6c 20 6f 75 74 70  *   (2) All outp
53a0: 75 74 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 69  ut columns are i
53b0: 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73  ncluded in the s
53c0: 6f 72 74 20 72 65 63 6f 72 64 2e 20 20 49 6e 20  ort record.  In 
53d0: 74 68 61 74 0a 20 20 2a 2a 20 20 20 20 20 20 20  that.  **       
53e0: 63 61 73 65 20 72 65 67 44 61 74 61 3d 3d 72 65  case regData==re
53f0: 67 4f 72 69 67 44 61 74 61 2e 0a 20 20 2a 2a 20  gOrigData..  ** 
5400: 20 20 28 33 29 20 53 6f 6d 65 20 6f 75 74 70 75    (3) Some outpu
5410: 74 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6f 6d  t columns are om
5420: 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73  itted from the s
5430: 6f 72 74 20 72 65 63 6f 72 64 20 64 75 65 20 74  ort record due t
5440: 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 74 68 65  o.  **       the
5450: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
5460: 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 20  ORTER_REFERENCE 
5470: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 6f 72  optimization, or
5480: 20 64 75 65 20 74 6f 20 74 68 65 0a 20 20 2a 2a   due to the.  **
5490: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43         SQLITE_EC
54a0: 45 4c 5f 4f 4d 49 54 52 45 46 20 6f 70 74 69 6d  EL_OMITREF optim
54b0: 69 7a 61 74 69 6f 6e 2c 20 6f 72 20 64 75 65 20  ization, or due 
54c0: 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20 20 20 20  to the .  **    
54d0: 20 20 20 53 6f 72 74 43 74 78 2e 70 44 65 66 65     SortCtx.pDefe
54e0: 72 72 65 64 52 6f 77 4c 6f 61 64 20 6f 70 74 69  rredRowLoad opti
54f0: 6d 69 61 74 69 6f 6e 2e 20 20 49 6e 20 61 6e 79  miation.  In any
5500: 20 6f 66 20 74 68 65 73 65 20 63 61 73 65 73 0a   of these cases.
5510: 20 20 2a 2a 20 20 20 20 20 20 20 72 65 67 4f 72    **       regOr
5520: 69 67 44 61 74 61 20 69 73 20 30 20 74 6f 20 70  igData is 0 to p
5530: 72 65 76 65 6e 74 20 74 68 69 73 20 72 6f 75 74  revent this rout
5540: 69 6e 65 20 66 72 6f 6d 20 74 72 79 69 6e 67 20  ine from trying 
5550: 74 6f 20 63 6f 70 79 0a 20 20 2a 2a 20 20 20 20  to copy.  **    
5560: 20 20 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d     values that m
5570: 69 67 68 74 20 6e 6f 74 20 79 65 74 20 65 78 69  ight not yet exi
5580: 73 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  st..  */.  asser
5590: 74 28 20 6e 44 61 74 61 3d 3d 31 20 7c 7c 20 72  t( nData==1 || r
55a0: 65 67 44 61 74 61 3d 3d 72 65 67 4f 72 69 67 44  egData==regOrigD
55b0: 61 74 61 20 7c 7c 20 72 65 67 4f 72 69 67 44 61  ata || regOrigDa
55c0: 74 61 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  ta==0 );..  if( 
55d0: 6e 50 72 65 66 69 78 52 65 67 20 29 7b 0a 20 20  nPrefixReg ){.  
55e0: 20 20 61 73 73 65 72 74 28 20 6e 50 72 65 66 69    assert( nPrefi
55f0: 78 52 65 67 3d 3d 6e 45 78 70 72 2b 62 53 65 71  xReg==nExpr+bSeq
5600: 20 29 3b 0a 20 20 20 20 72 65 67 42 61 73 65 20   );.    regBase 
5610: 3d 20 72 65 67 44 61 74 61 20 2d 20 6e 50 72 65  = regData - nPre
5620: 66 69 78 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b  fixReg;.  }else{
5630: 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 70  .    regBase = p
5640: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
5650: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
5660: 6d 20 2b 3d 20 6e 42 61 73 65 3b 0a 20 20 7d 0a  m += nBase;.  }.
5670: 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65 63    assert( pSelec
5680: 74 2d 3e 69 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  t->iOffset==0 ||
5690: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
56a0: 21 3d 30 20 29 3b 0a 20 20 69 4c 69 6d 69 74 20  !=0 );.  iLimit 
56b0: 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73  = pSelect->iOffs
56c0: 65 74 20 3f 20 70 53 65 6c 65 63 74 2d 3e 69 4f  et ? pSelect->iO
56d0: 66 66 73 65 74 2b 31 20 3a 20 70 53 65 6c 65 63  ffset+1 : pSelec
56e0: 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 70 53 6f  t->iLimit;.  pSo
56f0: 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 20 3d 20  rt->labelDone = 
5700: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
5710: 61 62 65 6c 28 76 29 3b 0a 20 20 73 71 6c 69 74  abel(v);.  sqlit
5720: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
5730: 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  st(pParse, pSort
5740: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42  ->pOrderBy, regB
5750: 61 73 65 2c 20 72 65 67 4f 72 69 67 44 61 74 61  ase, regOrigData
5760: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
5770: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
5780: 54 45 5f 45 43 45 4c 5f 44 55 50 20 7c 20 28 72  TE_ECEL_DUP | (r
5790: 65 67 4f 72 69 67 44 61 74 61 3f 20 53 51 4c 49  egOrigData? SQLI
57a0: 54 45 5f 45 43 45 4c 5f 52 45 46 20 3a 20 30 29  TE_ECEL_REF : 0)
57b0: 29 3b 0a 20 20 69 66 28 20 62 53 65 71 20 29 7b  );.  if( bSeq ){
57c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
57d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71  AddOp2(v, OP_Seq
57e0: 75 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e 69 45  uence, pSort->iE
57f0: 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65 2b  Cursor, regBase+
5800: 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 69 66  nExpr);.  }.  if
5810: 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 30 20  ( nPrefixReg==0 
5820: 26 26 20 6e 44 61 74 61 3e 30 20 29 7b 0a 20 20  && nData>0 ){.  
5830: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
5840: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
5850: 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e  gData, regBase+n
5860: 45 78 70 72 2b 62 53 65 71 2c 20 6e 44 61 74 61  Expr+bSeq, nData
5870: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4f 42  );.  }.  if( nOB
5880: 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  Sat>0 ){.    int
5890: 20 72 65 67 50 72 65 76 4b 65 79 3b 20 20 20 2f   regPrevKey;   /
58a0: 2a 20 54 68 65 20 66 69 72 73 74 20 6e 4f 42 53  * The first nOBS
58b0: 61 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  at columns of th
58c0: 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 2a  e previous row *
58d0: 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 46 69  /.    int addrFi
58e0: 72 73 74 3b 20 20 20 20 2f 2a 20 41 64 64 72 65  rst;    /* Addre
58f0: 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 49 66 4e  ss of the OP_IfN
5900: 6f 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  ot opcode */.   
5910: 20 69 6e 74 20 61 64 64 72 4a 6d 70 3b 20 20 20   int addrJmp;   
5920: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
5930: 20 74 68 65 20 4f 50 5f 4a 75 6d 70 20 6f 70 63   the OP_Jump opc
5940: 6f 64 65 20 2a 2f 0a 20 20 20 20 56 64 62 65 4f  ode */.    VdbeO
5950: 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 2f 2a 20  p *pOp;      /* 
5960: 4f 70 63 6f 64 65 20 74 68 61 74 20 6f 70 65 6e  Opcode that open
5970: 73 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a  s the sorter */.
5980: 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20      int nKey;   
5990: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
59a0: 6f 66 20 73 6f 72 74 69 6e 67 20 6b 65 79 20 63  of sorting key c
59b0: 6f 6c 75 6d 6e 73 2c 20 69 6e 63 6c 75 64 69 6e  olumns, includin
59c0: 67 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 2a 2f  g OP_Sequence */
59d0: 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
59e0: 49 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  I;     /* Origin
59f0: 61 6c 20 4b 65 79 49 6e 66 6f 20 6f 6e 20 74 68  al KeyInfo on th
5a00: 65 20 73 6f 72 74 65 72 20 74 61 62 6c 65 20 2a  e sorter table *
5a10: 2f 0a 0a 20 20 20 20 72 65 67 52 65 63 6f 72 64  /..    regRecord
5a20: 20 3d 20 6d 61 6b 65 53 6f 72 74 65 72 52 65 63   = makeSorterRec
5a30: 6f 72 64 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ord(pParse, pSor
5a40: 74 2c 20 70 53 65 6c 65 63 74 2c 20 72 65 67 42  t, pSelect, regB
5a50: 61 73 65 2c 20 6e 42 61 73 65 29 3b 0a 20 20 20  ase, nBase);.   
5a60: 20 72 65 67 50 72 65 76 4b 65 79 20 3d 20 70 50   regPrevKey = pP
5a70: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
5a80: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
5a90: 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b  = pSort->nOBSat;
5aa0: 0a 20 20 20 20 6e 4b 65 79 20 3d 20 6e 45 78 70  .    nKey = nExp
5ab0: 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  r - pSort->nOBSa
5ac0: 74 20 2b 20 62 53 65 71 3b 0a 20 20 20 20 69 66  t + bSeq;.    if
5ad0: 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20 20 20  ( bSeq ){.      
5ae0: 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69  addrFirst = sqli
5af0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
5b00: 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 42 61   OP_IfNot, regBa
5b10: 73 65 2b 6e 45 78 70 72 29 3b 20 0a 20 20 20 20  se+nExpr); .    
5b20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64  }else{.      add
5b30: 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33  rFirst = sqlite3
5b40: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
5b50: 5f 53 65 71 75 65 6e 63 65 54 65 73 74 2c 20 70  _SequenceTest, p
5b60: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b  Sort->iECursor);
5b70: 0a 20 20 20 20 7d 0a 20 20 20 20 56 64 62 65 43  .    }.    VdbeC
5b80: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
5b90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5ba0: 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  3(v, OP_Compare,
5bb0: 20 72 65 67 50 72 65 76 4b 65 79 2c 20 72 65 67   regPrevKey, reg
5bc0: 42 61 73 65 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42  Base, pSort->nOB
5bd0: 53 61 74 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20  Sat);.    pOp = 
5be0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
5bf0: 28 76 2c 20 70 53 6f 72 74 2d 3e 61 64 64 72 53  (v, pSort->addrS
5c00: 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 69  ortIndex);.    i
5c10: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
5c20: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
5c30: 74 75 72 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  turn;.    pOp->p
5c40: 32 20 3d 20 6e 4b 65 79 20 2b 20 6e 44 61 74 61  2 = nKey + nData
5c50: 3b 0a 20 20 20 20 70 4b 49 20 3d 20 70 4f 70 2d  ;.    pKI = pOp-
5c60: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  >p4.pKeyInfo;.  
5c70: 20 20 6d 65 6d 73 65 74 28 70 4b 49 2d 3e 61 53    memset(pKI->aS
5c80: 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20 70 4b 49  ortOrder, 0, pKI
5c90: 2d 3e 6e 4b 65 79 46 69 65 6c 64 29 3b 20 2f 2a  ->nKeyField); /*
5ca0: 20 4d 61 6b 65 73 20 4f 50 5f 4a 75 6d 70 20 74   Makes OP_Jump t
5cb0: 65 73 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73  estable */.    s
5cc0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
5cd0: 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P4(v, -1, (char*
5ce0: 29 70 4b 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  )pKI, P4_KEYINFO
5cf0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
5d00: 20 70 4b 49 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20   pKI->nAllField 
5d10: 3e 20 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c 64  > pKI->nKeyField
5d20: 2b 32 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  +2 );.    pOp->p
5d30: 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c  4.pKeyInfo = sql
5d40: 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45  ite3KeyInfoFromE
5d50: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 70  xprList(pParse,p
5d60: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c 6e  Sort->pOrderBy,n
5d70: 4f 42 53 61 74 2c 0a 20 20 20 20 20 20 20 20 20  OBSat,.         
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 20 20 20                  
5da0: 20 20 70 4b 49 2d 3e 6e 41 6c 6c 46 69 65 6c 64    pKI->nAllField
5db0: 2d 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c 64 2d  -pKI->nKeyField-
5dc0: 31 29 3b 0a 20 20 20 20 61 64 64 72 4a 6d 70 20  1);.    addrJmp 
5dd0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
5de0: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
5df0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5e00: 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61  p3(v, OP_Jump, a
5e10: 64 64 72 4a 6d 70 2b 31 2c 20 30 2c 20 61 64 64  ddrJmp+1, 0, add
5e20: 72 4a 6d 70 2b 31 29 3b 20 56 64 62 65 43 6f 76  rJmp+1); VdbeCov
5e30: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 70 53  erage(v);.    pS
5e40: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20  ort->labelBkOut 
5e50: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
5e60: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 70  eLabel(v);.    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: 4f 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20 2a  Or, if the.    *
62e0: 2a 20 70 53 6f 72 74 2d 3e 62 4f 72 64 65 72 65  * pSort->bOrdere
62f0: 64 49 6e 6e 65 72 4c 6f 6f 70 20 66 6c 61 67 20  dInnerLoop flag 
6300: 69 73 20 73 65 74 20 74 6f 20 69 6e 64 69 63 61  is set to indica
6310: 74 65 20 74 68 61 74 20 74 68 65 20 69 6e 6e 65  te that the inne
6320: 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 20 64 65  r.    ** loop de
6330: 6c 69 76 65 72 73 20 69 74 65 6d 73 20 69 6e 20  livers items in 
6340: 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20 6a 75  sorted order, ju
6350: 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  mp to the next i
6360: 74 65 72 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  teration.    ** 
6370: 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  of the outer loo
6380: 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  p..    */.    in
6390: 74 20 69 43 73 72 20 3d 20 70 53 6f 72 74 2d 3e  t iCsr = pSort->
63a0: 69 45 43 75 72 73 6f 72 3b 0a 20 20 20 20 73 71  iECursor;.    sq
63b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
63c0: 76 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 2c  v, OP_IfNotZero,
63d0: 20 69 4c 69 6d 69 74 2c 20 73 71 6c 69 74 65 33   iLimit, sqlite3
63e0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
63f0: 76 29 2b 34 29 3b 0a 20 20 20 20 56 64 62 65 43  v)+4);.    VdbeC
6400: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
6410: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6420: 32 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 69 43  2(v, OP_Last, iC
6430: 73 72 2c 20 30 29 3b 0a 20 20 20 20 69 53 6b 69  sr, 0);.    iSki
6440: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
6450: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
6460: 64 78 4c 45 2c 0a 20 20 20 20 20 20 20 20 20 20  dxLE,.          
6470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6480: 20 20 20 20 20 20 20 69 43 73 72 2c 20 30 2c 20         iCsr, 0, 
6490: 72 65 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20  regBase+nOBSat, 
64a0: 6e 45 78 70 72 2d 6e 4f 42 53 61 74 29 3b 0a 20  nExpr-nOBSat);. 
64b0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
64c0: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
64d0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
64e0: 44 65 6c 65 74 65 2c 20 69 43 73 72 29 3b 0a 20  Delete, iCsr);. 
64f0: 20 7d 0a 20 20 69 66 28 20 72 65 67 52 65 63 6f   }.  if( regReco
6500: 72 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 67  rd==0 ){.    reg
6510: 52 65 63 6f 72 64 20 3d 20 6d 61 6b 65 53 6f 72  Record = makeSor
6520: 74 65 72 52 65 63 6f 72 64 28 70 50 61 72 73 65  terRecord(pParse
6530: 2c 20 70 53 6f 72 74 2c 20 70 53 65 6c 65 63 74  , pSort, pSelect
6540: 2c 20 72 65 67 42 61 73 65 2c 20 6e 42 61 73 65  , regBase, nBase
6550: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f  );.  }.  if( pSo
6560: 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20  rt->sortFlags & 
6570: 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
6580: 65 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 4f  er ){.    op = O
6590: 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 3b 0a  P_SorterInsert;.
65a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20    }else{.    op 
65b0: 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 3b 0a  = OP_IdxInsert;.
65c0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
65d0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70  eAddOp4Int(v, op
65e0: 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  , pSort->iECurso
65f0: 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a 20 20  r, regRecord,.  
6600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6610: 20 20 20 20 20 72 65 67 42 61 73 65 2b 6e 4f 42       regBase+nOB
6620: 53 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61  Sat, nBase-nOBSa
6630: 74 29 3b 0a 20 20 69 66 28 20 69 53 6b 69 70 20  t);.  if( iSkip 
6640: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
6650: 53 6f 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e  Sort->bOrderedIn
6660: 6e 65 72 4c 6f 6f 70 3d 3d 30 20 7c 7c 20 70 53  nerLoop==0 || pS
6670: 6f 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e  ort->bOrderedInn
6680: 65 72 4c 6f 6f 70 3d 3d 31 20 29 3b 0a 20 20 20  erLoop==1 );.   
6690: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
66a0: 67 65 50 32 28 76 2c 20 69 53 6b 69 70 2c 0a 20  geP2(v, iSkip,. 
66b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
66c0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
66d0: 29 20 2b 20 70 53 6f 72 74 2d 3e 62 4f 72 64 65  ) + pSort->bOrde
66e0: 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 29 3b 0a 20  redInnerLoop);. 
66f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
6700: 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  code to implemen
6710: 74 20 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a  t the OFFSET.*/.
6720: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
6730: 4f 66 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a  Offset(.  Vdbe *
6740: 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47  v,          /* G
6750: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
6760: 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69  o this VM */.  i
6770: 6e 74 20 69 4f 66 66 73 65 74 2c 20 20 20 20 20  nt iOffset,     
6780: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
6790: 64 69 6e 67 20 74 68 65 20 6f 66 66 73 65 74 20  ding the offset 
67a0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
67b0: 20 69 43 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f   iContinue     /
67c0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73  * Jump here to s
67d0: 6b 69 70 20 74 68 65 20 63 75 72 72 65 6e 74 20  kip the current 
67e0: 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69  record */.){.  i
67f0: 66 28 20 69 4f 66 66 73 65 74 3e 30 20 29 7b 0a  f( iOffset>0 ){.
6800: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6810: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp3(v, OP_IfPo
6820: 73 2c 20 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  s, iOffset, iCon
6830: 74 69 6e 75 65 2c 20 31 29 3b 20 56 64 62 65 43  tinue, 1); VdbeC
6840: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
6850: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
6860: 22 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 7d 0a  "OFFSET"));.  }.
6870: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
6880: 65 20 74 68 61 74 20 77 69 6c 6c 20 63 68 65 63  e that will chec
6890: 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  k to make sure t
68a0: 68 65 20 4e 20 72 65 67 69 73 74 65 72 73 20 73  he N registers s
68b0: 74 61 72 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a  tarting at iMem.
68c0: 2a 2a 20 66 6f 72 6d 20 61 20 64 69 73 74 69 6e  ** form a distin
68d0: 63 74 20 65 6e 74 72 79 2e 20 20 69 54 61 62 20  ct entry.  iTab 
68e0: 69 73 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  is a sorting ind
68f0: 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20 70 72  ex that holds pr
6900: 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e  eviously.** seen
6910: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
6920: 20 74 68 65 20 4e 20 76 61 6c 75 65 73 2e 20 20   the N values.  
6930: 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6d  A new entry is m
6940: 61 64 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69  ade in iTab.** i
6950: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 4e 20  f the current N 
6960: 76 61 6c 75 65 73 20 61 72 65 20 6e 65 77 2e 0a  values are new..
6970: 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20  **.** A jump to 
6980: 61 64 64 72 52 65 70 65 61 74 20 69 73 20 6d 61  addrRepeat is ma
6990: 64 65 20 61 6e 64 20 74 68 65 20 4e 2b 31 20 76  de and the N+1 v
69a0: 61 6c 75 65 73 20 61 72 65 20 70 6f 70 70 65 64  alues are popped
69b0: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61   from the.** sta
69c0: 63 6b 20 69 66 20 74 68 65 20 74 6f 70 20 4e 20  ck if the top N 
69d0: 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74  elements are not
69e0: 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74   distinct..*/.st
69f0: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 44 69  atic void codeDi
6a00: 73 74 69 6e 63 74 28 0a 20 20 50 61 72 73 65 20  stinct(.  Parse 
6a10: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
6a20: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
6a30: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
6a40: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ext */.  int iTa
6a50: 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  b,          /* A
6a60: 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 75   sorting index u
6a70: 73 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20  sed to test for 
6a80: 64 69 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a  distinctness */.
6a90: 20 20 69 6e 74 20 61 64 64 72 52 65 70 65 61 74    int addrRepeat
6aa0: 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  ,    /* Jump to 
6ab0: 68 65 72 65 20 69 66 20 6e 6f 74 20 64 69 73 74  here if not dist
6ac0: 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c  inct */.  int N,
6ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6ae0: 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
6af0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d  ts */.  int iMem
6b00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
6b10: 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29  rst element */.)
6b20: 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  {.  Vdbe *v;.  i
6b30: 6e 74 20 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50  nt r1;..  v = pP
6b40: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72  arse->pVdbe;.  r
6b50: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
6b60: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
6b70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6b80: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
6b90: 64 2c 20 69 54 61 62 2c 20 61 64 64 72 52 65 70  d, iTab, addrRep
6ba0: 65 61 74 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20 56  eat, iMem, N); V
6bb0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
6bc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6bd0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
6be0: 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72  cord, iMem, N, r
6bf0: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
6c00: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
6c10: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61 62  _IdxInsert, iTab
6c20: 2c 20 72 31 2c 20 69 4d 65 6d 2c 20 4e 29 3b 0a  , r1, iMem, N);.
6c30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
6c40: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
6c50: 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a  USESEEKRESULT);.
6c60: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
6c70: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
6c80: 72 31 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  r1);.}..#ifdef S
6c90: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52  QLITE_ENABLE_SOR
6ca0: 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 2f  TER_REFERENCES./
6cb0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
6cc0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20  on is called as 
6cd0: 70 61 72 74 20 6f 66 20 69 6e 6e 65 72 2d 6c 6f  part of inner-lo
6ce0: 6f 70 20 67 65 6e 65 72 61 74 69 6f 6e 20 66 6f  op generation fo
6cf0: 72 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74  r a SELECT.** st
6d00: 61 74 65 6d 65 6e 74 20 77 69 74 68 20 61 6e 20  atement with an 
6d10: 4f 52 44 45 52 20 42 59 20 74 68 61 74 20 69 73  ORDER BY that is
6d20: 20 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 64 20 62   not optimized b
6d30: 79 20 61 6e 20 69 6e 64 65 78 2e 20 49 74 20 0a  y an index. It .
6d40: 2a 2a 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68  ** determines th
6d50: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 69  e expressions, i
6d60: 66 20 61 6e 79 2c 20 74 68 61 74 20 74 68 65 20  f any, that the 
6d70: 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e 63 65  sorter-reference
6d80: 20 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f   .** optimizatio
6d90: 6e 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  n should be used
6da0: 20 66 6f 72 2e 20 54 68 65 20 73 6f 72 74 65 72   for. The sorter
6db0: 2d 72 65 66 65 72 65 6e 63 65 20 6f 70 74 69 6d  -reference optim
6dc0: 69 7a 61 74 69 6f 6e 0a 2a 2a 20 69 73 20 75 73  ization.** is us
6dd0: 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 71 75  ed for SELECT qu
6de0: 65 72 69 65 73 20 6c 69 6b 65 3a 0a 2a 2a 0a 2a  eries like:.**.*
6df0: 2a 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 69  *   SELECT a, bi
6e00: 67 62 6c 6f 62 20 46 52 4f 4d 20 74 31 20 4f 52  gblob FROM t1 OR
6e10: 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 31  DER BY a LIMIT 1
6e20: 30 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  0.**.** If the o
6e30: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75  ptimization is u
6e40: 73 65 64 20 66 6f 72 20 65 78 70 72 65 73 73 69  sed for expressi
6e50: 6f 6e 20 22 62 69 67 62 6c 6f 62 22 2c 20 74 68  on "bigblob", th
6e60: 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  en instead of.**
6e70: 20 73 74 6f 72 69 6e 67 20 76 61 6c 75 65 73 20   storing values 
6e80: 72 65 61 64 20 66 72 6f 6d 20 74 68 61 74 20 63  read from that c
6e90: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73 6f 72  olumn in the sor
6ea0: 74 65 72 20 72 65 63 6f 72 64 73 2c 20 74 68 65  ter records, the
6eb0: 20 50 4b 20 6f 66 0a 2a 2a 20 74 68 65 20 72 6f   PK of.** the ro
6ec0: 77 20 66 72 6f 6d 20 74 61 62 6c 65 20 74 31 20  w from table t1 
6ed0: 69 73 20 73 74 6f 72 65 64 20 69 6e 73 74 65 61  is stored instea
6ee0: 64 2e 20 54 68 65 6e 2c 20 61 73 20 72 65 63 6f  d. Then, as reco
6ef0: 72 64 73 20 61 72 65 20 65 78 74 72 61 63 74 65  rds are extracte
6f00: 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 73 6f  d from.** the so
6f10: 72 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20 74  rter to return t
6f20: 6f 20 74 68 65 20 75 73 65 72 2c 20 74 68 65 20  o the user, the 
6f30: 72 65 71 75 69 72 65 64 20 76 61 6c 75 65 20 6f  required value o
6f40: 66 20 62 69 67 62 6c 6f 62 20 69 73 0a 2a 2a 20  f bigblob is.** 
6f50: 72 65 74 72 69 65 76 65 64 20 64 69 72 65 63 74  retrieved direct
6f60: 6c 79 20 66 72 6f 6d 20 74 61 62 6c 65 20 74 31  ly from table t1
6f70: 2e 20 49 66 20 74 68 65 20 76 61 6c 75 65 73 20  . If the values 
6f80: 61 72 65 20 76 65 72 79 20 6c 61 72 67 65 2c 20  are very large, 
6f90: 74 68 69 73 20 0a 2a 2a 20 63 61 6e 20 62 65 20  this .** can be 
6fa0: 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 20 74  more efficient t
6fb0: 68 61 6e 20 73 74 6f 72 69 6e 67 20 74 68 65 6d  han storing them
6fc0: 20 64 69 72 65 63 74 6c 79 20 69 6e 20 74 68 65   directly in the
6fd0: 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 73 2e   sorter records.
6fe0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 4c  .**.** The ExprL
6ff0: 69 73 74 5f 69 74 65 6d 2e 62 53 6f 72 74 65 72  ist_item.bSorter
7000: 52 65 66 20 66 6c 61 67 20 69 73 20 73 65 74 20  Ref flag is set 
7010: 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  for each express
7020: 69 6f 6e 20 69 6e 20 70 45 4c 69 73 74 20 0a 2a  ion in pEList .*
7030: 2a 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  * for which the 
7040: 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e 63 65  sorter-reference
7050: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 73 68   optimization sh
7060: 6f 75 6c 64 20 62 65 20 65 6e 61 62 6c 65 64 2e  ould be enabled.
7070: 20 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c   .** Additionall
7080: 79 2c 20 74 68 65 20 70 53 6f 72 74 2d 3e 61 44  y, the pSort->aD
7090: 65 66 65 72 5b 5d 20 61 72 72 61 79 20 69 73 20  efer[] array is 
70a0: 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 65  populated with e
70b0: 6e 74 72 69 65 73 0a 2a 2a 20 66 6f 72 20 61 6c  ntries.** for al
70c0: 6c 20 63 75 72 73 6f 72 73 20 72 65 71 75 69 72  l cursors requir
70d0: 65 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  ed to evaluate a
70e0: 6c 6c 20 73 65 6c 65 63 74 65 64 20 65 78 70 72  ll selected expr
70f0: 65 73 73 69 6f 6e 73 2e 20 46 69 6e 61 6c 6c 79  essions. Finally
7100: 2e 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 72 69  ..** output vari
7110: 61 62 6c 65 20 28 2a 70 70 45 78 74 72 61 29 20  able (*ppExtra) 
7120: 69 73 20 73 65 74 20 74 6f 20 61 6e 20 65 78 70  is set to an exp
7130: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e  ression list con
7140: 74 61 69 6e 69 6e 67 0a 2a 2a 20 65 78 70 72 65  taining.** expre
7150: 73 73 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 65  ssions for all e
7160: 78 74 72 61 20 50 4b 20 76 61 6c 75 65 73 20 74  xtra PK values t
7170: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 73 74  hat should be st
7180: 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 73  ored in the.** s
7190: 6f 72 74 65 72 20 72 65 63 6f 72 64 73 2e 0a 2a  orter records..*
71a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
71b0: 6c 65 63 74 45 78 70 72 44 65 66 65 72 28 0a 20  lectExprDefer(. 
71c0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71e0: 20 2f 2a 20 4c 65 61 76 65 20 61 6e 79 20 65 72   /* Leave any er
71f0: 72 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 53 6f  ror here */.  So
7200: 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20  rtCtx *pSort,   
7210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7220: 20 53 6f 72 74 65 72 20 63 6f 6e 74 65 78 74 20   Sorter context 
7230: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
7240: 45 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  EList,          
7250: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
7260: 6f 6e 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72  ons destined for
7270: 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 45 78 70   sorter */.  Exp
7280: 72 4c 69 73 74 20 2a 2a 70 70 45 78 74 72 61 20  rList **ppExtra 
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
72a0: 45 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 20 61  Expressions to a
72b0: 70 70 65 6e 64 20 74 6f 20 73 6f 72 74 65 72 20  ppend to sorter 
72c0: 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69  record */.){.  i
72d0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 44 65 66  nt i;.  int nDef
72e0: 65 72 20 3d 20 30 3b 0a 20 20 45 78 70 72 4c 69  er = 0;.  ExprLi
72f0: 73 74 20 2a 70 45 78 74 72 61 20 3d 20 30 3b 0a  st *pExtra = 0;.
7300: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
7310: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
7320: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
7330: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
7340: 6d 20 3d 20 26 70 45 4c 69 73 74 2d 3e 61 5b 69  m = &pEList->a[i
7350: 5d 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  ];.    if( pItem
7360: 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
7370: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  l==0 ){.      Ex
7380: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 49 74 65  pr *pExpr = pIte
7390: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
73a0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 45  Table *pTab = pE
73b0: 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
73c0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
73d0: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78  TK_COLUMN && pEx
73e0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26  pr->iColumn>=0 &
73f0: 26 20 70 54 61 62 20 26 26 20 21 49 73 56 69 72  & pTab && !IsVir
7400: 74 75 61 6c 28 70 54 61 62 29 0a 20 20 20 20 20  tual(pTab).     
7410: 20 20 26 26 20 28 70 54 61 62 2d 3e 61 43 6f 6c    && (pTab->aCol
7420: 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
7430: 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46  .colFlags & COLF
7440: 4c 41 47 5f 53 4f 52 54 45 52 52 45 46 29 0a 20  LAG_SORTERREF). 
7450: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
7460: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66  int j;.        f
7470: 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 44 65 66 65 72  or(j=0; j<nDefer
7480: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
7490: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 61 44 65    if( pSort->aDe
74a0: 66 65 72 5b 6a 5d 2e 69 43 73 72 3d 3d 70 45 78  fer[j].iCsr==pEx
74b0: 70 72 2d 3e 69 54 61 62 6c 65 20 29 20 62 72 65  pr->iTable ) bre
74c0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
74d0: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 44 65        if( j==nDe
74e0: 66 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  fer ){.         
74f0: 20 69 66 28 20 6e 44 65 66 65 72 3d 3d 41 72 72   if( nDefer==Arr
7500: 61 79 53 69 7a 65 28 70 53 6f 72 74 2d 3e 61 44  aySize(pSort->aD
7510: 65 66 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  efer) ){.       
7520: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
7530: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
7540: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
7550: 6e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  nKey = 1;.      
7560: 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
7570: 20 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a           Index *
7580: 70 50 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  pPk = 0;.       
7590: 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77       if( !HasRow
75a0: 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
75b0: 20 20 20 20 20 20 20 20 20 20 70 50 6b 20 3d 20            pPk = 
75c0: 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
75d0: 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 4b 65 79              nKey
75f0: 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   = pPk->nKeyCol;
7600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
7610: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b             for(k
7620: 3d 30 3b 20 6b 3c 6e 4b 65 79 3b 20 6b 2b 2b 29  =0; k<nKey; k++)
7630: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
7640: 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
7650: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
7660: 2c 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20  , TK_COLUMN, 0, 
7670: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
7680: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
7690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
76a0: 65 77 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78  ew->iTable = pEx
76b0: 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
76c0: 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
76d0: 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e  ->pTab = pExpr->
76e0: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
76f0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 43 6f 6c        pNew->iCol
7700: 75 6d 6e 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d  umn = pPk ? pPk-
7710: 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 3a 20 2d  >aiColumn[k] : -
7720: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
7730: 20 20 20 70 45 78 74 72 61 20 3d 20 73 71 6c 69     pExtra = sqli
7740: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
7750: 64 28 70 50 61 72 73 65 2c 20 70 45 78 74 72 61  d(pParse, pExtra
7760: 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , pNew);.       
7770: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7780: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7790: 20 20 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72     pSort->aDefer
77a0: 5b 6e 44 65 66 65 72 5d 2e 70 54 61 62 20 3d 20  [nDefer].pTab = 
77b0: 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20  pExpr->pTab;.   
77c0: 20 20 20 20 20 20 20 20 20 70 53 6f 72 74 2d 3e           pSort->
77d0: 61 44 65 66 65 72 5b 6e 44 65 66 65 72 5d 2e 69  aDefer[nDefer].i
77e0: 43 73 72 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  Csr = pExpr->iTa
77f0: 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ble;.           
7800: 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6e   pSort->aDefer[n
7810: 44 65 66 65 72 5d 2e 6e 4b 65 79 20 3d 20 6e 4b  Defer].nKey = nK
7820: 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey;.            
7830: 6e 44 65 66 65 72 2b 2b 3b 0a 20 20 20 20 20 20  nDefer++;.      
7840: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
7850: 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 62          pItem->b
7860: 53 6f 72 74 65 72 52 65 66 20 3d 20 31 3b 0a 20  SorterRef = 1;. 
7870: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7880: 0a 20 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72  .  pSort->nDefer
7890: 20 3d 20 28 75 38 29 6e 44 65 66 65 72 3b 0a 20   = (u8)nDefer;. 
78a0: 20 2a 70 70 45 78 74 72 61 20 3d 20 70 45 78 74   *ppExtra = pExt
78b0: 72 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ra;.}.#endif../*
78c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
78d0: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
78e0: 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69  ode for the insi
78f0: 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  de of the inner 
7900: 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c  loop.** of a SEL
7910: 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72  ECT..**.** If sr
7920: 63 54 61 62 20 69 73 20 6e 65 67 61 74 69 76 65  cTab is negative
7930: 2c 20 74 68 65 6e 20 74 68 65 20 70 2d 3e 70 45  , then the p->pE
7940: 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73  List expressions
7950: 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65  .** are evaluate
7960: 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  d in order to ge
7970: 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  t the data for t
7980: 68 69 73 20 72 6f 77 2e 20 20 49 66 20 73 72 63  his row.  If src
7990: 54 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f  Tab is.** zero o
79a0: 72 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64 61 74  r more, then dat
79b0: 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d  a is pulled from
79c0: 20 73 72 63 54 61 62 20 61 6e 64 20 70 2d 3e 70   srcTab and p->p
79d0: 45 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e  EList is used on
79e0: 6c 79 20 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68  ly .** to get th
79f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
7a00: 6d 6e 73 20 61 6e 64 20 74 68 65 20 63 6f 6c 6c  mns and the coll
7a10: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
7a20: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a  or each column..
7a30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
7a40: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a  electInnerLoop(.
7a50: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
7a60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
7a70: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
7a80: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7aa0: 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c  The complete sel
7ab0: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ect statement be
7ac0: 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  ing coded */.  i
7ad0: 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20 20  nt srcTab,      
7ae0: 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64         /* Pull d
7af0: 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61  ata from this ta
7b00: 62 6c 65 20 69 66 20 6e 6f 6e 2d 6e 65 67 61 74  ble if non-negat
7b10: 69 76 65 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78  ive */.  SortCtx
7b20: 20 2a 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20   *pSort,        
7b30: 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c   /* If not NULL,
7b40: 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20   info on how to 
7b50: 70 72 6f 63 65 73 73 20 4f 52 44 45 52 20 42 59  process ORDER BY
7b60: 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74   */.  DistinctCt
7b70: 78 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a  x *pDistinct, /*
7b80: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e   If not NULL, in
7b90: 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f  fo on how to pro
7ba0: 63 65 73 73 20 44 49 53 54 49 4e 43 54 20 2a 2f  cess DISTINCT */
7bb0: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
7bc0: 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f  Dest,      /* Ho
7bd0: 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20  w to dispose of 
7be0: 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  the results */. 
7bf0: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20   int iContinue, 
7c00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
7c10: 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
7c20: 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20  e with next row 
7c30: 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20  */.  int iBreak 
7c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7c50: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65  Jump here to bre
7c60: 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e  ak out of the in
7c70: 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20  ner loop */.){. 
7c80: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
7c90: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
7ca0: 69 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74  i;.  int hasDist
7cb0: 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 20  inct;           
7cc0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
7cd0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
7ce0: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
7cf0: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
7d00: 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20  st->eDest;   /* 
7d10: 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
7d20: 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  f results */.  i
7d30: 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74  nt iParm = pDest
7d40: 2d 3e 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69  ->iSDParm; /* Fi
7d50: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
7d60: 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20  disposal method 
7d70: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74  */.  int nResult
7d80: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
7d90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
7da0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
7db0: 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67    int nPrefixReg
7dc0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
7dd0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
7de0: 20 72 65 67 69 73 74 65 72 73 20 62 65 66 6f 72   registers befor
7df0: 65 20 72 65 67 52 65 73 75 6c 74 20 2a 2f 0a 20  e regResult */. 
7e00: 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20 73 52 6f   RowLoadInfo sRo
7e10: 77 4c 6f 61 64 49 6e 66 6f 3b 20 20 20 2f 2a 20  wLoadInfo;   /* 
7e20: 49 6e 66 6f 20 66 6f 72 20 64 65 66 65 72 72 65  Info for deferre
7e30: 64 20 72 6f 77 20 6c 6f 61 64 69 6e 67 20 2a 2f  d row loading */
7e40: 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 2c 20  ..  /* Usually, 
7e50: 72 65 67 52 65 73 75 6c 74 20 69 73 20 74 68 65  regResult is the
7e60: 20 66 69 72 73 74 20 63 65 6c 6c 20 69 6e 20 61   first cell in a
7e70: 6e 20 61 72 72 61 79 20 6f 66 20 6d 65 6d 6f 72  n array of memor
7e80: 79 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 63 6f 6e  y cells.  ** con
7e90: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72  taining the curr
7ea0: 65 6e 74 20 72 65 73 75 6c 74 20 72 6f 77 2e 20  ent result row. 
7eb0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 72 65 67  In this case reg
7ec0: 4f 72 69 67 20 69 73 20 73 65 74 20 74 6f 20 74  Orig is set to t
7ed0: 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 76 61 6c  he.  ** same val
7ee0: 75 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ue. However, if 
7ef0: 74 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  the results are 
7f00: 62 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 74 68  being sent to th
7f10: 65 20 73 6f 72 74 65 72 2c 20 74 68 65 0a 20 20  e sorter, the.  
7f20: 2a 2a 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6e  ** values for an
7f30: 79 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  y expressions th
7f40: 61 74 20 61 72 65 20 61 6c 73 6f 20 70 61 72 74  at are also part
7f50: 20 6f 66 20 74 68 65 20 73 6f 72 74 2d 6b 65 79   of the sort-key
7f60: 20 61 72 65 20 6f 6d 69 74 74 65 64 0a 20 20 2a   are omitted.  *
7f70: 2a 20 66 72 6f 6d 20 74 68 69 73 20 61 72 72 61  * from this arra
7f80: 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  y. In this case 
7f90: 72 65 67 4f 72 69 67 20 69 73 20 73 65 74 20 74  regOrig is set t
7fa0: 6f 20 7a 65 72 6f 2e 20 20 2a 2f 0a 20 20 69 6e  o zero.  */.  in
7fb0: 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20  t regResult;    
7fc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
7fd0: 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c  rt of memory hol
7fe0: 64 69 6e 67 20 63 75 72 72 65 6e 74 20 72 65 73  ding current res
7ff0: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ults */.  int re
8000: 67 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20  gOrig;          
8010: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
8020: 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67  f memory holding
8030: 20 66 75 6c 6c 20 72 65 73 75 6c 74 20 28 6f 72   full result (or
8040: 20 30 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74   0) */..  assert
8050: 28 20 76 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ( v );.  assert(
8060: 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b   p->pEList!=0 );
8070: 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d  .  hasDistinct =
8080: 20 70 44 69 73 74 69 6e 63 74 20 3f 20 70 44 69   pDistinct ? pDi
8090: 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70  stinct->eTnctTyp
80a0: 65 20 3a 20 57 48 45 52 45 5f 44 49 53 54 49 4e  e : WHERE_DISTIN
80b0: 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70  CT_NOOP;.  if( p
80c0: 53 6f 72 74 20 26 26 20 70 53 6f 72 74 2d 3e 70  Sort && pSort->p
80d0: 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 70 53 6f  OrderBy==0 ) pSo
80e0: 72 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53  rt = 0;.  if( pS
80f0: 6f 72 74 3d 3d 30 20 26 26 20 21 68 61 73 44 69  ort==0 && !hasDi
8100: 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73  stinct ){.    as
8110: 73 65 72 74 28 20 69 43 6f 6e 74 69 6e 75 65 21  sert( iContinue!
8120: 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66  =0 );.    codeOf
8130: 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73  fset(v, p->iOffs
8140: 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  et, iContinue);.
8150: 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74    }..  /* Pull t
8160: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
8170: 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65  umns..  */.  nRe
8180: 73 75 6c 74 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c  sultCol = p->pEL
8190: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69  ist->nExpr;..  i
81a0: 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d  f( pDest->iSdst=
81b0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  =0 ){.    if( pS
81c0: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 72  ort ){.      nPr
81d0: 65 66 69 78 52 65 67 20 3d 20 70 53 6f 72 74 2d  efixReg = pSort-
81e0: 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
81f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 28 70 53  ;.      if( !(pS
8200: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
8210: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
8220: 74 65 72 29 20 29 20 6e 50 72 65 66 69 78 52 65  ter) ) nPrefixRe
8230: 67 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73  g++;.      pPars
8240: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 72 65 66  e->nMem += nPref
8250: 69 78 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20  ixReg;.    }.   
8260: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
8270: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
8280: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
8290: 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a   += nResultCol;.
82a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65 73    }else if( pDes
82b0: 74 2d 3e 69 53 64 73 74 2b 6e 52 65 73 75 6c 74  t->iSdst+nResult
82c0: 43 6f 6c 20 3e 20 70 50 61 72 73 65 2d 3e 6e 4d  Col > pParse->nM
82d0: 65 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  em ){.    /* Thi
82e0: 73 20 69 73 20 61 6e 20 65 72 72 6f 72 20 63 6f  s is an error co
82f0: 6e 64 69 74 69 6f 6e 20 74 68 61 74 20 63 61 6e  ndition that can
8300: 20 72 65 73 75 6c 74 2c 20 66 6f 72 20 65 78 61   result, for exa
8310: 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 53 45 4c  mple, when a SEL
8320: 45 43 54 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  ECT.    ** on th
8330: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
8340: 65 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 20 63  e of an INSERT c
8350: 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 72 65 73  ontains more res
8360: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e  ult columns than
8370: 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20 61 72  .    ** there ar
8380: 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
8390: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65   table on the le
83a0: 66 74 2e 20 20 54 68 65 20 65 72 72 6f 72 20 77  ft.  The error w
83b0: 69 6c 6c 20 62 65 20 63 61 75 67 68 74 0a 20 20  ill be caught.  
83c0: 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72 74 65    ** and reporte
83d0: 64 20 6c 61 74 65 72 2e 20 20 42 75 74 20 77 65  d later.  But we
83e0: 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75   need to make su
83f0: 72 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79  re enough memory
8400: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20   is allocated.  
8410: 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 6f 74    ** to avoid ot
8420: 68 65 72 20 73 70 75 72 69 6f 75 73 20 65 72 72  her spurious err
8430: 6f 72 73 20 69 6e 20 74 68 65 20 6d 65 61 6e 74  ors in the meant
8440: 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 72  ime. */.    pPar
8450: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73  se->nMem += nRes
8460: 75 6c 74 43 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44  ultCol;.  }.  pD
8470: 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 6e 52 65  est->nSdst = nRe
8480: 73 75 6c 74 43 6f 6c 3b 0a 20 20 72 65 67 4f 72  sultCol;.  regOr
8490: 69 67 20 3d 20 72 65 67 52 65 73 75 6c 74 20 3d  ig = regResult =
84a0: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20   pDest->iSdst;. 
84b0: 20 69 66 28 20 73 72 63 54 61 62 3e 3d 30 20 29   if( srcTab>=0 )
84c0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
84d0: 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b  <nResultCol; i++
84e0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
84f0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8500: 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c  _Column, srcTab,
8510: 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 29   i, regResult+i)
8520: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
8530: 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 2d  ent((v, "%s", p-
8540: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  >pEList->a[i].zN
8550: 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ame));.    }.  }
8560: 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d  else if( eDest!=
8570: 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 23 69  SRT_Exists ){.#i
8580: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
8590: 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45  LE_SORTER_REFERE
85a0: 4e 43 45 53 0a 20 20 20 20 45 78 70 72 4c 69 73  NCES.    ExprLis
85b0: 74 20 2a 70 45 78 74 72 61 20 3d 20 30 3b 0a 23  t *pExtra = 0;.#
85c0: 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20  endif.    /* If 
85d0: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
85e0: 69 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e  is an EXISTS(...
85f0: 29 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  ) expression, th
8600: 65 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20  e actual.    ** 
8610: 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20  values returned 
8620: 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 61 72  by the SELECT ar
8630: 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a  e not required..
8640: 20 20 20 20 2a 2f 0a 20 20 20 20 75 38 20 65 63      */.    u8 ec
8650: 65 6c 46 6c 61 67 73 3b 20 20 20 20 2f 2a 20 22  elFlags;    /* "
8660: 65 63 65 6c 22 20 69 73 20 61 6e 20 61 62 62 72  ecel" is an abbr
8670: 65 76 69 61 74 69 6f 6e 20 6f 66 20 22 45 78 70  eviation of "Exp
8680: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 22 20 2a  rCodeExprList" *
8690: 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  /.    ExprList *
86a0: 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20  pEList;.    if( 
86b0: 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c  eDest==SRT_Mem |
86c0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  | eDest==SRT_Out
86d0: 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  put || eDest==SR
86e0: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  T_Coroutine ){. 
86f0: 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73 20 3d       ecelFlags =
8700: 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
8710: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8720: 20 20 20 65 63 65 6c 46 6c 61 67 73 20 3d 20 30     ecelFlags = 0
8730: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8740: 70 53 6f 72 74 20 26 26 20 68 61 73 44 69 73 74  pSort && hasDist
8750: 69 6e 63 74 3d 3d 30 20 26 26 20 65 44 65 73 74  inct==0 && eDest
8760: 21 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 26  !=SRT_EphemTab &
8770: 26 20 65 44 65 73 74 21 3d 53 52 54 5f 54 61 62  & eDest!=SRT_Tab
8780: 6c 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  le ){.      /* F
8790: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
87a0: 6f 6e 20 69 6e 20 70 2d 3e 70 45 4c 69 73 74 20  on in p->pEList 
87b0: 74 68 61 74 20 69 73 20 61 20 63 6f 70 79 20 6f  that is a copy o
87c0: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
87d0: 69 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  in.      ** the 
87e0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
87f0: 28 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79  (pSort->pOrderBy
8800: 29 2c 20 73 65 74 20 74 68 65 20 61 73 73 6f 63  ), set the assoc
8810: 69 61 74 65 64 20 0a 20 20 20 20 20 20 2a 2a 20  iated .      ** 
8820: 69 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75  iOrderByCol valu
8830: 65 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68  e to one more th
8840: 61 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  an the index of 
8850: 74 68 65 20 4f 52 44 45 52 20 42 59 20 0a 20 20  the ORDER BY .  
8860: 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
8870: 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 6f 72  n within the sor
8880: 74 2d 6b 65 79 20 74 68 61 74 20 70 75 73 68 4f  t-key that pushO
8890: 6e 74 6f 53 6f 72 74 65 72 28 29 20 77 69 6c 6c  ntoSorter() will
88a0: 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 20   generate..     
88b0: 20 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77 73 20   ** This allows 
88c0: 74 68 65 20 70 2d 3e 70 45 4c 69 73 74 20 66 69  the p->pEList fi
88d0: 65 6c 64 20 74 6f 20 62 65 20 6f 6d 69 74 74 65  eld to be omitte
88e0: 64 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65  d from the sorte
88f0: 64 20 72 65 63 6f 72 64 2c 0a 20 20 20 20 20 20  d record,.      
8900: 2a 2a 20 73 61 76 69 6e 67 20 73 70 61 63 65 20  ** saving space 
8910: 61 6e 64 20 43 50 55 20 63 79 63 6c 65 73 2e 20  and CPU cycles. 
8920: 20 2a 2f 0a 20 20 20 20 20 20 65 63 65 6c 46 6c   */.      ecelFl
8930: 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 45  ags |= (SQLITE_E
8940: 43 45 4c 5f 4f 4d 49 54 52 45 46 7c 53 51 4c 49  CEL_OMITREF|SQLI
8950: 54 45 5f 45 43 45 4c 5f 52 45 46 29 3b 0a 0a 20  TE_ECEL_REF);.. 
8960: 20 20 20 20 20 66 6f 72 28 69 3d 70 53 6f 72 74       for(i=pSort
8970: 2d 3e 6e 4f 42 53 61 74 3b 20 69 3c 70 53 6f 72  ->nOBSat; i<pSor
8980: 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t->pOrderBy->nEx
8990: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
89a0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
89b0: 20 69 66 28 20 28 6a 20 3d 20 70 53 6f 72 74 2d   if( (j = pSort-
89c0: 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e  >pOrderBy->a[i].
89d0: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29  u.x.iOrderByCol)
89e0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
89f0: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 2d 31  p->pEList->a[j-1
8a00: 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
8a10: 6c 20 3d 20 69 2b 31 2d 70 53 6f 72 74 2d 3e 6e  l = i+1-pSort->n
8a20: 4f 42 53 61 74 3b 0a 20 20 20 20 20 20 20 20 7d  OBSat;.        }
8a30: 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20  .      }.#ifdef 
8a40: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
8a50: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
8a60: 20 20 20 20 20 20 73 65 6c 65 63 74 45 78 70 72        selectExpr
8a70: 44 65 66 65 72 28 70 50 61 72 73 65 2c 20 70 53  Defer(pParse, pS
8a80: 6f 72 74 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  ort, p->pEList, 
8a90: 26 70 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20  &pExtra);.      
8aa0: 69 66 28 20 70 45 78 74 72 61 20 26 26 20 70 50  if( pExtra && pP
8ab0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
8ac0: 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Failed==0 ){.   
8ad0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
8ae0: 20 61 72 65 20 61 6e 79 20 65 78 74 72 61 20 50   are any extra P
8af0: 4b 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 61 64 64  K columns to add
8b00: 20 74 6f 20 74 68 65 20 73 6f 72 74 65 72 20 72   to the sorter r
8b10: 65 63 6f 72 64 73 2c 0a 20 20 20 20 20 20 20 20  ecords,.        
8b20: 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 65 78 74 72  ** allocate extr
8b30: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61  a memory cells a
8b40: 6e 64 20 61 64 6a 75 73 74 20 74 68 65 20 4f 70  nd adjust the Op
8b50: 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20  enEphemeral .   
8b60: 20 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74       ** instruct
8b70: 69 6f 6e 20 74 6f 20 61 63 63 6f 75 6e 74 20 66  ion to account f
8b80: 6f 72 20 74 68 65 20 6c 61 72 67 65 72 20 72 65  or the larger re
8b90: 63 6f 72 64 73 2e 20 54 68 69 73 20 69 73 20 6f  cords. This is o
8ba0: 6e 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  nly.        ** r
8bb0: 65 71 75 69 72 65 64 20 69 66 20 74 68 65 72 65  equired if there
8bc0: 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   are one or more
8bd0: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
8be0: 61 62 6c 65 73 20 77 69 74 68 0a 20 20 20 20 20  ables with.     
8bf0: 20 20 20 2a 2a 20 63 6f 6d 70 6f 73 69 74 65 20     ** composite 
8c00: 70 72 69 6d 61 72 79 20 6b 65 79 73 20 69 6e 20  primary keys in 
8c10: 74 68 65 20 53 6f 72 74 43 74 78 2e 61 44 65 66  the SortCtx.aDef
8c20: 65 72 5b 5d 20 61 72 72 61 79 2e 20 20 2a 2f 0a  er[] array.  */.
8c30: 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a          VdbeOp *
8c40: 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
8c50: 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d  eGetOp(v, pSort-
8c60: 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b  >addrSortIndex);
8c70: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32  .        pOp->p2
8c80: 20 2b 3d 20 28 70 45 78 74 72 61 2d 3e 6e 45 78   += (pExtra->nEx
8c90: 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 44 65 66  pr - pSort->nDef
8ca0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  er);.        pOp
8cb0: 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ->p4.pKeyInfo->n
8cc0: 41 6c 6c 46 69 65 6c 64 20 2b 3d 20 28 70 45 78  AllField += (pEx
8cd0: 74 72 61 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f  tra->nExpr - pSo
8ce0: 72 74 2d 3e 6e 44 65 66 65 72 29 3b 0a 20 20 20  rt->nDefer);.   
8cf0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
8d00: 6d 20 2b 3d 20 70 45 78 74 72 61 2d 3e 6e 45 78  m += pExtra->nEx
8d10: 70 72 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  pr;.      }.#end
8d20: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a  if..      /* Adj
8d30: 75 73 74 20 6e 52 65 73 75 6c 74 43 6f 6c 20 74  ust nResultCol t
8d40: 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 63 6f  o account for co
8d50: 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6f  lumns that are o
8d60: 6d 69 74 74 65 64 0a 20 20 20 20 20 20 2a 2a 20  mitted.      ** 
8d70: 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20  from the sorter 
8d80: 62 79 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  by the optimizat
8d90: 69 6f 6e 73 20 69 6e 20 74 68 69 73 20 62 72 61  ions in this bra
8da0: 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20 70 45 4c  nch */.      pEL
8db0: 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
8dc0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
8dd0: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
8de0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
8df0: 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  f( pEList->a[i].
8e00: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e  u.x.iOrderByCol>
8e10: 30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  0.#ifdef SQLITE_
8e20: 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45  ENABLE_SORTER_RE
8e30: 46 45 52 45 4e 43 45 53 0a 20 20 20 20 20 20 20  FERENCES.       
8e40: 20 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 61 5b 69    || pEList->a[i
8e50: 5d 2e 62 53 6f 72 74 65 72 52 65 66 0a 23 65 6e  ].bSorterRef.#en
8e60: 64 69 66 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  dif.        ){. 
8e70: 20 20 20 20 20 20 20 20 20 6e 52 65 73 75 6c 74           nResult
8e80: 43 6f 6c 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  Col--;.         
8e90: 20 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a 20 20   regOrig = 0;.  
8ea0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
8eb0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8ec0: 20 72 65 67 4f 72 69 67 20 29 3b 0a 20 20 20 20   regOrig );.    
8ed0: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
8ee0: 74 3d 3d 53 52 54 5f 53 65 74 20 29 3b 0a 20 20  t==SRT_Set );.  
8ef0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
8f00: 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 3b 0a  est==SRT_Mem );.
8f10: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
8f20: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
8f30: 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74 65  tine );.      te
8f40: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
8f50: 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
8f60: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
8f70: 3d 3d 53 52 54 5f 53 65 74 20 7c 7c 20 65 44 65  ==SRT_Set || eDe
8f80: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 0a 20 20 20  st==SRT_Mem .   
8f90: 20 20 20 20 20 20 20 20 7c 7c 20 65 44 65 73 74          || eDest
8fa0: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
8fb0: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  || eDest==SRT_Ou
8fc0: 74 70 75 74 20 29 3b 0a 20 20 20 20 7d 0a 20 20  tput );.    }.  
8fd0: 20 20 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 2e 72    sRowLoadInfo.r
8fe0: 65 67 52 65 73 75 6c 74 20 3d 20 72 65 67 52 65  egResult = regRe
8ff0: 73 75 6c 74 3b 0a 20 20 20 20 73 52 6f 77 4c 6f  sult;.    sRowLo
9000: 61 64 49 6e 66 6f 2e 65 63 65 6c 46 6c 61 67 73  adInfo.ecelFlags
9010: 20 3d 20 65 63 65 6c 46 6c 61 67 73 3b 0a 23 69   = ecelFlags;.#i
9020: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
9030: 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45  LE_SORTER_REFERE
9040: 4e 43 45 53 0a 20 20 20 20 73 52 6f 77 4c 6f 61  NCES.    sRowLoa
9050: 64 49 6e 66 6f 2e 70 45 78 74 72 61 20 3d 20 70  dInfo.pExtra = p
9060: 45 78 74 72 61 3b 0a 20 20 20 20 73 52 6f 77 4c  Extra;.    sRowL
9070: 6f 61 64 49 6e 66 6f 2e 72 65 67 45 78 74 72 61  oadInfo.regExtra
9080: 52 65 73 75 6c 74 20 3d 20 72 65 67 52 65 73 75  Result = regResu
9090: 6c 74 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  lt + nResultCol;
90a0: 0a 20 20 20 20 69 66 28 20 70 45 78 74 72 61 20  .    if( pExtra 
90b0: 29 20 6e 52 65 73 75 6c 74 43 6f 6c 20 2b 3d 20  ) nResultCol += 
90c0: 70 45 78 74 72 61 2d 3e 6e 45 78 70 72 3b 0a 23  pExtra->nExpr;.#
90d0: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 2d  endif.    if( p-
90e0: 3e 69 4c 69 6d 69 74 0a 20 20 20 20 20 26 26 20  >iLimit.     && 
90f0: 28 65 63 65 6c 46 6c 61 67 73 20 26 20 53 51 4c  (ecelFlags & SQL
9100: 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46  ITE_ECEL_OMITREF
9110: 29 21 3d 30 20 0a 20 20 20 20 20 26 26 20 6e 50  )!=0 .     && nP
9120: 72 65 66 69 78 52 65 67 3e 30 0a 20 20 20 20 29  refixReg>0.    )
9130: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
9140: 70 53 6f 72 74 21 3d 30 20 29 3b 0a 20 20 20 20  pSort!=0 );.    
9150: 20 20 61 73 73 65 72 74 28 20 68 61 73 44 69 73    assert( hasDis
9160: 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20  tinct==0 );.    
9170: 20 20 70 53 6f 72 74 2d 3e 70 44 65 66 65 72 72    pSort->pDeferr
9180: 65 64 52 6f 77 4c 6f 61 64 20 3d 20 26 73 52 6f  edRowLoad = &sRo
9190: 77 4c 6f 61 64 49 6e 66 6f 3b 0a 20 20 20 20 20  wLoadInfo;.     
91a0: 20 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a 20 20   regOrig = 0;.  
91b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
91c0: 6e 6e 65 72 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28  nnerLoopLoadRow(
91d0: 70 50 61 72 73 65 2c 20 70 2c 20 26 73 52 6f 77  pParse, p, &sRow
91e0: 4c 6f 61 64 49 6e 66 6f 29 3b 0a 20 20 20 20 7d  LoadInfo);.    }
91f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
9200: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
9210: 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f  rd was present o
9220: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
9230: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20  tement.  ** and 
9240: 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65  this row has bee
9250: 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74  n seen before, t
9260: 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20  hen do not make 
9270: 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61  this row.  ** pa
9280: 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rt of the result
9290: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73  ..  */.  if( has
92a0: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
92b0: 73 77 69 74 63 68 28 20 70 44 69 73 74 69 6e 63  switch( pDistinc
92c0: 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 29 7b 0a  t->eTnctType ){.
92d0: 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
92e0: 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
92f0: 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62  D: {.        Vdb
9300: 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 20  eOp *pOp;       
9310: 20 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65       /* No longe
9320: 72 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e 45  r required OpenE
9330: 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20  phemeral instr. 
9340: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
9350: 4a 75 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20  Jump;           
9360: 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69     /* Jump desti
9370: 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  nation */.      
9380: 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20    int regPrev;  
9390: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
93a0: 76 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e  vious row conten
93b0: 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a  t */..        /*
93c0: 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
93d0: 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73  for the previous
93e0: 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20   row */.        
93f0: 72 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65  regPrev = pParse
9400: 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20  ->nMem+1;.      
9410: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
9420: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20  = nResultCol;.. 
9430: 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65         /* Change
9440: 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   the OP_OpenEphe
9450: 6d 65 72 61 6c 20 63 6f 64 65 64 20 65 61 72 6c  meral coded earl
9460: 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c  ier to an OP_Nul
9470: 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74  l.        ** set
9480: 73 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61 72 65  s the MEM_Cleare
9490: 64 20 62 69 74 20 6f 6e 20 74 68 65 20 66 69 72  d bit on the fir
94a0: 73 74 20 72 65 67 69 73 74 65 72 20 6f 66 20 74  st register of t
94b0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  he.        ** pr
94c0: 65 76 69 6f 75 73 20 76 61 6c 75 65 2e 20 20 54  evious value.  T
94d0: 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74  his will cause t
94e0: 68 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77 20 74  he OP_Ne below t
94f0: 6f 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20 20  o always.       
9500: 20 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68 65 20   ** fail on the 
9510: 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20  first iteration 
9520: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 65 76 65 6e  of the loop even
9530: 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20   if the first.  
9540: 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 69 73 20        ** row is 
9550: 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20 20 20  all NULLs..     
9560: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71     */.        sq
9570: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
9580: 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e  oNoop(v, pDistin
9590: 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20  ct->addrTnct);. 
95a0: 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c         pOp = sql
95b0: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
95c0: 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72   pDistinct->addr
95d0: 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Tnct);.        p
95e0: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
95f0: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f  Null;.        pO
9600: 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20 20 20  p->p1 = 1;.     
9610: 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65 67     pOp->p2 = reg
9620: 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 20 20 69  Prev;..        i
9630: 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Jump = sqlite3Vd
9640: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
9650: 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20   + nResultCol;. 
9660: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
9670: 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b  i<nResultCol; i+
9680: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 43 6f  +){.          Co
9690: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
96a0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
96b0: 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c  q(pParse, p->pEL
96c0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
96d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
96e0: 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20 29  i<nResultCol-1 )
96f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
9700: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
9710: 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73  v, OP_Ne, regRes
9720: 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65  ult+i, iJump, re
9730: 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20  gPrev+i);.      
9740: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
9750: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
9760: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9770: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9780: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20  ddOp3(v, OP_Eq, 
9790: 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 43 6f  regResult+i, iCo
97a0: 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65 76 2b  ntinue, regPrev+
97b0: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
97c0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
97d0: 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  .           }.  
97e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
97f0: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
9800: 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  1, (const char *
9810: 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
9820: 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  EQ);.          s
9830: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
9840: 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c  P5(v, SQLITE_NUL
9850: 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  LEQ);.        }.
9860: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9870: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
9880: 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d 70  ntAddr(v)==iJump
9890: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
98a0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
98b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
98c0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
98d0: 43 6f 70 79 2c 20 72 65 67 52 65 73 75 6c 74 2c  Copy, regResult,
98e0: 20 72 65 67 50 72 65 76 2c 20 6e 52 65 73 75 6c   regPrev, nResul
98f0: 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20  tCol-1);.       
9900: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
9910: 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
9920: 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
9930: 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  E: {.        sql
9940: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
9950: 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63  Noop(v, pDistinc
9960: 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20  t->addrTnct);.  
9970: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9980: 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66 61     }..      defa
9990: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 61  ult: {.        a
99a0: 73 73 65 72 74 28 20 70 44 69 73 74 69 6e 63 74  ssert( pDistinct
99b0: 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45  ->eTnctType==WHE
99c0: 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52  RE_DISTINCT_UNOR
99d0: 44 45 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20  DERED );.       
99e0: 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50   codeDistinct(pP
99f0: 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2d  arse, pDistinct-
9a00: 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e 74 69  >tabTnct, iConti
9a10: 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  nue, nResultCol,
9a20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9a30: 20 20 20 20 20 20 72 65 67 52 65 73 75 6c 74 29        regResult)
9a40: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9a50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9a60: 20 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20     if( pSort==0 
9a70: 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66 66  ){.      codeOff
9a80: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
9a90: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  t, iContinue);. 
9aa0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74     }.  }..  swit
9ab0: 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20  ch( eDest ){.   
9ac0: 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65   /* In this mode
9ad0: 2c 20 77 72 69 74 65 20 65 61 63 68 20 71 75 65  , write each que
9ae0: 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65  ry result to the
9af0: 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70   key of the temp
9b00: 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62  orary.    ** tab
9b10: 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f  le iParm..    */
9b20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9b30: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
9b40: 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20 53 52  LECT.    case SR
9b50: 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20  T_Union: {.     
9b60: 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 72   int r1;.      r
9b70: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
9b80: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
9b90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9ba0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
9bb0: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
9bc0: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20  lt, nResultCol, 
9bd0: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
9be0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
9bf0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
9c00: 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 65 67 52   iParm, r1, regR
9c10: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
9c20: 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
9c30: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
9c40: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
9c50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9c60: 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63  .    /* Construc
9c70: 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20  t a record from 
9c80: 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74  the query result
9c90: 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66  , but instead of
9ca0: 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74  .    ** saving t
9cb0: 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20  hat record, use 
9cc0: 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64  it as a key to d
9cd0: 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66  elete elements f
9ce0: 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74  rom.    ** the t
9cf0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
9d00: 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Parm..    */.   
9d10: 20 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74   case SRT_Except
9d20: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
9d30: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
9d40: 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50 61  P_IdxDelete, iPa
9d50: 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rm, regResult, n
9d60: 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20  ResultCol);.    
9d70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
9d80: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
9d90: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
9da0: 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  LECT */..    /* 
9db0: 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
9dc0: 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61   as data using a
9dd0: 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20   unique key..   
9de0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
9df0: 5f 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20  _Fifo:.    case 
9e00: 53 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a 20 20  SRT_DistFifo:.  
9e10: 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
9e20: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  :.    case SRT_E
9e30: 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
9e40: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
9e50: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
9e60: 61 72 73 65 2c 20 6e 50 72 65 66 69 78 52 65 67  arse, nPrefixReg
9e70: 2b 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  +1);.      testc
9e80: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
9e90: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74  Table );.      t
9ea0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
9eb0: 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a  SRT_EphemTab );.
9ec0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9ed0: 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 20  eDest==SRT_Fifo 
9ee0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
9ef0: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  e( eDest==SRT_Di
9f00: 73 74 46 69 66 6f 20 29 3b 0a 20 20 20 20 20 20  stFifo );.      
9f10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9f20: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
9f30: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
9f40: 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 2b 6e 50  ResultCol, r1+nP
9f50: 72 65 66 69 78 52 65 67 29 3b 0a 23 69 66 6e 64  refixReg);.#ifnd
9f60: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
9f70: 54 45 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  TE.      if( eDe
9f80: 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f  st==SRT_DistFifo
9f90: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
9fa0: 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  f the destinatio
9fb0: 6e 20 69 73 20 44 69 73 74 46 69 66 6f 2c 20 74  n is DistFifo, t
9fc0: 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50 61 72  hen cursor (iPar
9fd0: 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20 20 20  m+1) is open.   
9fe0: 20 20 20 20 20 2a 2a 20 6f 6e 20 61 6e 20 65 70       ** on an ep
9ff0: 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 2e 20 49  hemeral index. I
a000: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
a010: 77 20 69 73 20 61 6c 72 65 61 64 79 20 70 72 65  w is already pre
a020: 73 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  sent.        ** 
a030: 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20 64 6f  in the index, do
a040: 20 6e 6f 74 20 77 72 69 74 65 20 69 74 20 74 6f   not write it to
a050: 20 74 68 65 20 6f 75 74 70 75 74 2e 20 49 66 20   the output. If 
a060: 6e 6f 74 2c 20 61 64 64 20 74 68 65 0a 20 20 20  not, add the.   
a070: 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20       ** current 
a080: 72 6f 77 20 74 6f 20 74 68 65 20 69 6e 64 65 78  row to the index
a090: 20 61 6e 64 20 70 72 6f 63 65 65 64 20 77 69 74   and proceed wit
a0a0: 68 20 77 72 69 74 69 6e 67 20 69 74 20 74 6f 20  h writing it to 
a0b0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  the.        ** o
a0c0: 75 74 70 75 74 20 74 61 62 6c 65 20 61 73 20 77  utput table as w
a0d0: 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ell.  */.       
a0e0: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
a0f0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
a100: 64 72 28 76 29 20 2b 20 34 3b 0a 20 20 20 20 20  dr(v) + 4;.     
a110: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a120: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
a130: 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 61 64  und, iParm+1, ad
a140: 64 72 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20  dr, r1, 0);.    
a150: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
a160: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
a170: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
a180: 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
a190: 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31 2c 72  t, iParm+1, r1,r
a1a0: 65 67 52 65 73 75 6c 74 2c 6e 52 65 73 75 6c 74  egResult,nResult
a1b0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 61 73  Col);.        as
a1c0: 73 65 72 74 28 20 70 53 6f 72 74 3d 3d 30 20 29  sert( pSort==0 )
a1d0: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
a1e0: 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74  .      if( pSort
a1f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
a200: 72 74 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 72  rt( regResult==r
a210: 65 67 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20  egOrig );.      
a220: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
a230: 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20  (pParse, pSort, 
a240: 70 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65 67  p, r1+nPrefixReg
a250: 2c 20 72 65 67 4f 72 69 67 2c 20 31 2c 20 6e 50  , regOrig, 1, nP
a260: 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20  refixReg);.     
a270: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a280: 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
a290: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
a2a0: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
a2b0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a2c0: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50   OP_NewRowid, iP
a2d0: 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  arm, r2);.      
a2e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a2f0: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
a300: 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29  , iParm, r1, r2)
a310: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a320: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
a330: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
a340: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a350: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
a360: 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20  Parse, r2);.    
a370: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
a380: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
a390: 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 50  e(pParse, r1, nP
a3a0: 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20 20  refixReg+1);.   
a3b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a3c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a3d0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
a3e0: 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63    /* If we are c
a3f0: 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f  reating a set fo
a400: 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53  r an "expr IN (S
a410: 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73  ELECT ...)" cons
a420: 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68  truct,.    ** th
a430: 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  en there should 
a440: 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d  be a single item
a450: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
a460: 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a  Write this.    *
a470: 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20  * item into the 
a480: 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62  set table with b
a490: 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a  ogus data..    *
a4a0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
a4b0: 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  et: {.      if( 
a4c0: 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  pSort ){.       
a4d0: 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61   /* At first gla
a4e0: 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68  nce you would th
a4f0: 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74  ink we could opt
a500: 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20  imize out the.  
a510: 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42        ** ORDER B
a520: 59 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 73  Y in this case s
a530: 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f  ince the order o
a540: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
a550: 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   set.        ** 
a560: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e  does not matter.
a570: 20 20 42 75 74 20 74 68 65 72 65 20 6d 69 67 68    But there migh
a580: 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61  t be a LIMIT cla
a590: 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20  use, in which.  
a5a0: 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68        ** case th
a5b0: 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74  e order does mat
a5c0: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ter */.        p
a5d0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20  ushOntoSorter(. 
a5e0: 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
a5f0: 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67  e, pSort, p, reg
a600: 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c  Result, regOrig,
a610: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72   nResultCol, nPr
a620: 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20  efixReg);.      
a630: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
a640: 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
a650: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
a660: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
a670: 74 28 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  t( sqlite3Strlen
a680: 33 30 28 70 44 65 73 74 2d 3e 7a 41 66 66 53 64  30(pDest->zAffSd
a690: 73 74 29 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c 20  st)==nResultCol 
a6a0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
a6b0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
a6c0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
a6d0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
a6e0: 74 43 6f 6c 2c 20 0a 20 20 20 20 20 20 20 20 20  tCol, .         
a6f0: 20 20 20 72 31 2c 20 70 44 65 73 74 2d 3e 7a 41     r1, pDest->zA
a700: 66 66 53 64 73 74 2c 20 6e 52 65 73 75 6c 74 43  ffSdst, nResultC
a710: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
a720: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
a730: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
a740: 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  se, regResult, n
a750: 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20  ResultCol);.    
a760: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a770: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
a780: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
a790: 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74 2c 20   r1, regResult, 
a7a0: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
a7b0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
a7c0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
a7d0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a  e, r1);.      }.
a7e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a7f0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e   }..    /* If an
a800: 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74  y row exist in t
a810: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72  he result set, r
a820: 65 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20  ecord that fact 
a830: 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a  and abort..    *
a840: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  /.    case SRT_E
a850: 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73  xists: {.      s
a860: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a870: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
a880: 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  1, iParm);.     
a890: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
a8a0: 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e  ause will termin
a8b0: 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72  ate the loop for
a8c0: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
a8d0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
a8e0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
a8f0: 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61  calar select tha
a900: 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
a910: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
a920: 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68  .    ** store th
a930: 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
a940: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d   appropriate mem
a950: 6f 72 79 20 63 65 6c 6c 20 6f 72 20 61 72 72 61  ory cell or arra
a960: 79 20 6f 66 20 0a 20 20 20 20 2a 2a 20 6d 65 6d  y of .    ** mem
a970: 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64 20 62 72  ory cells and br
a980: 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 73  eak out of the s
a990: 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
a9a0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
a9b0: 6d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  m: {.      if( p
a9c0: 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
a9d0: 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43  assert( nResultC
a9e0: 6f 6c 3c 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74  ol<=pDest->nSdst
a9f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68   );.        push
aa00: 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 20 20  OntoSorter(.    
aa10: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
aa20: 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73  pSort, p, regRes
aa30: 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52  ult, regOrig, nR
aa40: 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65 66 69  esultCol, nPrefi
aa50: 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xReg);.      }el
aa60: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
aa70: 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d  rt( nResultCol==
aa80: 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 29 3b 0a  pDest->nSdst );.
aa90: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
aaa0: 72 65 67 52 65 73 75 6c 74 3d 3d 69 50 61 72 6d  regResult==iParm
aab0: 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   );.        /* T
aac0: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
aad0: 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66  will jump out of
aae0: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
aaf0: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
ab00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
ab10: 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
ab20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
ab30: 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 63 61  QUERY */..    ca
ab40: 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  se SRT_Coroutine
ab50: 3a 20 20 20 20 20 20 20 2f 2a 20 53 65 6e 64 20  :       /* Send 
ab60: 64 61 74 61 20 74 6f 20 61 20 63 6f 2d 72 6f 75  data to a co-rou
ab70: 74 69 6e 65 20 2a 2f 0a 20 20 20 20 63 61 73 65  tine */.    case
ab80: 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b 20 20   SRT_Output: {  
ab90: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
aba0: 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  the results */. 
abb0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
abc0: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
abd0: 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ine );.      tes
abe0: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
abf0: 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
ac00: 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20    if( pSort ){. 
ac10: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
ac20: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53  orter(pParse, pS
ac30: 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c  ort, p, regResul
ac40: 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52 65 73  t, regOrig, nRes
ac50: 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20  ultCol,.        
ac60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
ac70: 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20  PrefixReg);.    
ac80: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73    }else if( eDes
ac90: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
aca0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
acb0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
acc0: 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74   OP_Yield, pDest
acd0: 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  ->iSDParm);.    
ace0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
acf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ad00: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
ad10: 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  ow, regResult, n
ad20: 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20  ResultCol);.    
ad30: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
ad40: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
ad50: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  ge(pParse, regRe
ad60: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
ad70: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
ad80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
ad90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ada0: 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20 57 72  IT_CTE.    /* Wr
adb0: 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ite the results 
adc0: 69 6e 74 6f 20 61 20 70 72 69 6f 72 69 74 79 20  into a priority 
add0: 71 75 65 75 65 20 74 68 61 74 20 69 73 20 6f 72  queue that is or
ade0: 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  der according to
adf0: 0a 20 20 20 20 2a 2a 20 70 44 65 73 74 2d 3e 70  .    ** pDest->p
ae00: 4f 72 64 65 72 42 79 20 28 69 6e 20 70 53 4f 29  OrderBy (in pSO)
ae10: 2e 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  .  pDest->iSDPar
ae20: 6d 20 28 69 6e 20 69 50 61 72 6d 29 20 69 73 20  m (in iParm) is 
ae30: 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 61  the cursor for a
ae40: 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 77  n.    ** index w
ae50: 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72 2b 32  ith pSO->nExpr+2
ae60: 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69 6c 64   columns.  Build
ae70: 20 61 20 6b 65 79 20 75 73 69 6e 67 20 70 53 4f   a key using pSO
ae80: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 0a 20   for the first. 
ae90: 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70 72     ** pSO->nExpr
aea0: 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6d   columns, then m
aeb0: 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b 65 79  ake sure all key
aec0: 73 20 61 72 65 20 75 6e 69 71 75 65 20 62 79 20  s are unique by 
aed0: 61 64 64 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20  adding a.    ** 
aee0: 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65 6e 63  final OP_Sequenc
aef0: 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 6c  e column.  The l
af00: 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68  ast column is th
af10: 65 20 72 65 63 6f 72 64 20 61 73 20 61 20 62 6c  e record as a bl
af20: 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ob..    */.    c
af30: 61 73 65 20 53 52 54 5f 44 69 73 74 51 75 65 75  ase SRT_DistQueu
af40: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
af50: 51 75 65 75 65 3a 20 7b 0a 20 20 20 20 20 20 69  Queue: {.      i
af60: 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20 69  nt nKey;.      i
af70: 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 20  nt r1, r2, r3;. 
af80: 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 65 73       int addrTes
af90: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78 70  t = 0;.      Exp
afa0: 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20 20 20  rList *pSO;.    
afb0: 20 20 70 53 4f 20 3d 20 70 44 65 73 74 2d 3e 70    pSO = pDest->p
afc0: 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 61  OrderBy;.      a
afd0: 73 73 65 72 74 28 20 70 53 4f 20 29 3b 0a 20 20  ssert( pSO );.  
afe0: 20 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f 2d 3e      nKey = pSO->
aff0: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 31 20  nExpr;.      r1 
b000: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
b010: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
b020: 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47     r2 = sqlite3G
b030: 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
b040: 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20  se, nKey+2);.   
b050: 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65 79 2b     r3 = r2+nKey+
b060: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  1;.      if( eDe
b070: 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75  st==SRT_DistQueu
b080: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
b090: 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  If the destinati
b0a0: 6f 6e 20 69 73 20 44 69 73 74 51 75 65 75 65 2c  on is DistQueue,
b0b0: 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50   then cursor (iP
b0c0: 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20  arm+1) is open. 
b0d0: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20 73         ** on a s
b0e0: 65 63 6f 6e 64 20 65 70 68 65 6d 65 72 61 6c 20  econd ephemeral 
b0f0: 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73  index that holds
b100: 20 61 6c 6c 20 76 61 6c 75 65 73 20 65 76 65 72   all values ever
b110: 79 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 20  y previously.   
b120: 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74 6f       ** added to
b130: 20 74 68 65 20 71 75 65 75 65 2e 20 2a 2f 0a 20   the queue. */. 
b140: 20 20 20 20 20 20 20 61 64 64 72 54 65 73 74 20         addrTest 
b150: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
b160: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
b170: 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30 2c 20  nd, iParm+1, 0, 
b180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1a0: 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75           regResu
b1b0: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
b1c0: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
b1d0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
b1e0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
b1f0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
b200: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
b210: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
b220: 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 69 66  l, r3);.      if
b230: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
b240: 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20  tQueue ){.      
b250: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b260: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
b270: 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 33  ert, iParm+1, r3
b280: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
b290: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
b2a0: 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  , OPFLAG_USESEEK
b2b0: 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20 7d  RESULT);.      }
b2c0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
b2d0: 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20 20  i<nKey; i++){.  
b2e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b2f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
b300: 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  opy,.           
b310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
b320: 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f 2d 3e  egResult + pSO->
b330: 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  a[i].u.x.iOrderB
b340: 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20 20 20  yCol - 1,.      
b350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b360: 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20 20 20      r2+i);.     
b370: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
b380: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b390: 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61 72 6d  _Sequence, iParm
b3a0: 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20 20 20  , r2+nKey);.    
b3b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b3c0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
b3d0: 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79 2b 32  cord, r2, nKey+2
b3e0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
b3f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
b400: 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
b410: 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 32  t, iParm, r1, r2
b420: 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20  , nKey+2);.     
b430: 20 69 66 28 20 61 64 64 72 54 65 73 74 20 29 20   if( addrTest ) 
b440: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
b450: 65 72 65 28 76 2c 20 61 64 64 72 54 65 73 74 29  ere(v, addrTest)
b460: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
b470: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
b480: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
b490: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
b4a0: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
b4b0: 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20   r2, nKey+2);.  
b4c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b4d0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
b4e0: 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 0a  E_OMIT_CTE */...
b4f0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
b500: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
b510: 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72  R).    /* Discar
b520: 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20  d the results.  
b530: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
b540: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
b550: 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a  ts inside.    **
b560: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54   the body of a T
b570: 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72  RIGGER.  The pur
b580: 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c  pose of such sel
b590: 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a  ects is to call.
b5a0: 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69      ** user-defi
b5b0: 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  ned functions th
b5c0: 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66  at have side eff
b5d0: 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74  ects.  We do not
b5e0: 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f   care.    ** abo
b5f0: 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65  ut the actual re
b600: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
b610: 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
b620: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
b630: 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d   assert( eDest==
b640: 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20  SRT_Discard );. 
b650: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b660: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  }.#endif.  }..  
b670: 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65  /* Jump to the e
b680: 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  nd of the loop i
b690: 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72  f the LIMIT is r
b6a0: 65 61 63 68 65 64 2e 20 20 45 78 63 65 70 74 2c  eached.  Except,
b6b0: 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65 20 69   if.  ** there i
b6c0: 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e 20 77  s a sorter, in w
b6d0: 68 69 63 68 20 63 61 73 65 20 74 68 65 20 73 6f  hich case the so
b6e0: 72 74 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  rter has already
b6f0: 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74 68   limited.  ** th
b700: 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75 73 2e  e output for us.
b710: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 6f 72  .  */.  if( pSor
b720: 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69 6d 69  t==0 && p->iLimi
b730: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
b740: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b750: 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70  _DecrJumpZero, p
b760: 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  ->iLimit, iBreak
b770: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
b780: 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  v);.  }.}../*.**
b790: 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49   Allocate a KeyI
b7a0: 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66 66 69  nfo object suffi
b7b0: 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e 64  cient for an ind
b7c0: 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f 6c 75  ex of N key colu
b7d0: 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65 78 74  mns and.** X ext
b7e0: 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b  ra columns..*/.K
b7f0: 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b  eyInfo *sqlite3K
b800: 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71 6c 69  eyInfoAlloc(sqli
b810: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 2c 20  te3 *db, int N, 
b820: 69 6e 74 20 58 29 7b 0a 20 20 69 6e 74 20 6e 45  int X){.  int nE
b830: 78 74 72 61 20 3d 20 28 4e 2b 58 29 2a 28 73 69  xtra = (N+X)*(si
b840: 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31  zeof(CollSeq*)+1
b850: 29 20 2d 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  ) - sizeof(CollS
b860: 65 71 2a 29 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  eq*);.  KeyInfo 
b870: 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  *p = sqlite3DbMa
b880: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
b890: 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20  zeof(KeyInfo) + 
b8a0: 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 70  nExtra);.  if( p
b8b0: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74   ){.    p->aSort
b8c0: 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 2d  Order = (u8*)&p-
b8d0: 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20 20  >aColl[N+X];.   
b8e0: 20 70 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 3d 20   p->nKeyField = 
b8f0: 28 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e  (u16)N;.    p->n
b900: 41 6c 6c 46 69 65 6c 64 20 3d 20 28 75 31 36 29  AllField = (u16)
b910: 28 4e 2b 58 29 3b 0a 20 20 20 20 70 2d 3e 65 6e  (N+X);.    p->en
b920: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20  c = ENC(db);.   
b930: 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20   p->db = db;.   
b940: 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20   p->nRef = 1;.  
b950: 20 20 6d 65 6d 73 65 74 28 26 70 5b 31 5d 2c 20    memset(&p[1], 
b960: 30 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 7d 65  0, nExtra);.  }e
b970: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
b980: 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20  OomFault(db);.  
b990: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
b9a0: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
b9b0: 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  e a KeyInfo obje
b9c0: 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  ct.*/.void sqlit
b9d0: 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 4b  e3KeyInfoUnref(K
b9e0: 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66  eyInfo *p){.  if
b9f0: 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ( p ){.    asser
ba00: 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  t( p->nRef>0 );.
ba10: 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a 20      p->nRef--;. 
ba20: 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d     if( p->nRef==
ba30: 30 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  0 ) sqlite3DbFre
ba40: 65 4e 4e 28 70 2d 3e 64 62 2c 20 70 29 3b 0a 20  eNN(p->db, p);. 
ba50: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
ba60: 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 74   a new pointer t
ba70: 6f 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  o a KeyInfo obje
ba80: 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73  ct.*/.KeyInfo *s
ba90: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66  qlite3KeyInfoRef
baa0: 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20  (KeyInfo *p){.  
bab0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73  if( p ){.    ass
bac0: 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29  ert( p->nRef>0 )
bad0: 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b  ;.    p->nRef++;
bae0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
baf0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
bb00: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65  E_DEBUG./*.** Re
bb10: 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 20 4b  turn TRUE if a K
bb20: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 61  eyInfo object ca
bb30: 6e 20 62 65 20 63 68 61 6e 67 65 2e 20 20 54 68  n be change.  Th
bb40: 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  e KeyInfo object
bb50: 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  .** can only be 
bb60: 63 68 61 6e 67 65 64 20 69 66 20 74 68 69 73 20  changed if this 
bb70: 69 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65  is just a single
bb80: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
bb90: 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  e object..**.** 
bba0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
bbb0: 75 73 65 64 20 6f 6e 6c 79 20 69 6e 73 69 64 65  used only inside
bbc0: 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61   of assert() sta
bbd0: 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20  tements..*/.int 
bbe0: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
bbf0: 57 72 69 74 65 61 62 6c 65 28 4b 65 79 49 6e 66  Writeable(KeyInf
bc00: 6f 20 2a 70 29 7b 20 72 65 74 75 72 6e 20 70 2d  o *p){ return p-
bc10: 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23 65 6e 64  >nRef==1; }.#end
bc20: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
bc30: 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  UG */../*.** Giv
bc40: 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  en an expression
bc50: 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74 65 20   list, generate 
bc60: 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
bc70: 75 72 65 20 74 68 61 74 20 72 65 63 6f 72 64 73  ure that records
bc80: 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  .** the collatin
bc90: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65  g sequence for e
bca0: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ach expression i
bcb0: 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  n that expressio
bcc0: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  n list..**.** If
bcd0: 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73   the ExprList is
bce0: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   an ORDER BY or 
bcf0: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
bd00: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69  then the resulti
bd10: 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74  ng.** KeyInfo st
bd20: 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f  ructure is appro
bd30: 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69  priate for initi
bd40: 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61  alizing a virtua
bd50: 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d  l index to.** im
bd60: 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63 6c 61  plement that cla
bd70: 75 73 65 2e 20 20 49 66 20 74 68 65 20 45 78 70  use.  If the Exp
bd80: 72 4c 69 73 74 20 69 73 20 74 68 65 20 72 65 73  rList is the res
bd90: 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c  ult set of a SEL
bda0: 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  ECT.** then the 
bdb0: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
bdc0: 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  e is appropriate
bdd0: 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e   for initializin
bde0: 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69  g a virtual.** i
bdf0: 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  ndex to implemen
be00: 74 20 61 20 44 49 53 54 49 4e 43 54 20 74 65 73  t a DISTINCT tes
be10: 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  t..**.** Space t
be20: 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e  o hold the KeyIn
be30: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
be40: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
be50: 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c 69  lloc.  The calli
be60: 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  ng.** function i
be70: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
be80: 72 20 73 65 65 69 6e 67 20 74 68 61 74 20 74 68  r seeing that th
be90: 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20  is structure is 
bea0: 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72  eventually.** fr
beb0: 65 65 64 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  eed..*/.KeyInfo 
bec0: 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46  *sqlite3KeyInfoF
bed0: 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50  romExprList(.  P
bee0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
bef0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
bf00: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
bf10: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
bf20: 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65 79   /* Form the Key
bf30: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f 6d  Info object from
bf40: 20 74 68 69 73 20 45 78 70 72 4c 69 73 74 20 2a   this ExprList *
bf50: 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20  /.  int iStart, 
bf60: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69           /* Begi
bf70: 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f 6c 75  n with this colu
bf80: 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a 20  mn of pList */. 
bf90: 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20 20   int nExtra     
bfa0: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
bfb0: 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63 6f 6c  s many extra col
bfc0: 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e 64 20  umns to the end 
bfd0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 78 70  */.){.  int nExp
bfe0: 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49  r;.  KeyInfo *pI
bff0: 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78  nfo;.  struct Ex
c000: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
c010: 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  em;.  sqlite3 *d
c020: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
c030: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70    int i;..  nExp
c040: 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  r = pList->nExpr
c050: 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69  ;.  pInfo = sqli
c060: 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
c070: 64 62 2c 20 6e 45 78 70 72 2d 69 53 74 61 72 74  db, nExpr-iStart
c080: 2c 20 6e 45 78 74 72 61 2b 31 29 3b 0a 20 20 69  , nExtra+1);.  i
c090: 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20  f( pInfo ){.    
c0a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
c0b0: 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
c0c0: 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20  e(pInfo) );.    
c0d0: 66 6f 72 28 69 3d 69 53 74 61 72 74 2c 20 70 49  for(i=iStart, pI
c0e0: 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69 53 74  tem=pList->a+iSt
c0f0: 61 72 74 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b  art; i<nExpr; i+
c100: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
c110: 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b     pInfo->aColl[
c120: 69 2d 69 53 74 61 72 74 5d 20 3d 20 73 71 6c 69  i-iStart] = sqli
c130: 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71  te3ExprNNCollSeq
c140: 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
c150: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70 49  pExpr);.      pI
c160: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
c170: 69 2d 69 53 74 61 72 74 5d 20 3d 20 70 49 74 65  i-iStart] = pIte
c180: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  m->sortOrder;.  
c190: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
c1a0: 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pInfo;.}../*.**
c1b0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   Name of the con
c1c0: 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72  nection operator
c1d0: 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72  , used for error
c1e0: 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74   messages..*/.st
c1f0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
c200: 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e  *selectOpName(in
c210: 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a  t id){.  char *z
c220: 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20 29  ;.  switch( id )
c230: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c  {.    case TK_AL
c240: 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e  L:       z = "UN
c250: 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61  ION ALL";   brea
c260: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
c270: 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49  NTERSECT: z = "I
c280: 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72 65  NTERSECT";   bre
c290: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
c2a0: 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22  EXCEPT:    z = "
c2b0: 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62 72  EXCEPT";      br
c2c0: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
c2d0: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20  :           z = 
c2e0: 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62  "UNION";       b
c2f0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
c300: 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  rn z;.}..#ifndef
c310: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
c320: 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  LAIN./*.** Unles
c330: 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55  s an "EXPLAIN QU
c340: 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e  ERY PLAN" comman
c350: 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65  d is being proce
c360: 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ssed, this funct
c370: 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f  ion.** is a no-o
c380: 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  p. Otherwise, it
c390: 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72   adds a single r
c3a0: 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20  ow of output to 
c3b0: 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a  the EQP result,.
c3c0: 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70  ** where the cap
c3d0: 74 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66  tion is of the f
c3e0: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55 53  orm:.**.**   "US
c3f0: 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f  E TEMP B-TREE FO
c400: 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68 65  R xxx".**.** whe
c410: 72 65 20 78 78 78 20 69 73 20 6f 6e 65 20 6f 66  re xxx is one of
c420: 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22 4f 52   "DISTINCT", "OR
c430: 44 45 52 20 42 59 22 20 6f 72 20 22 47 52 4f 55  DER BY" or "GROU
c440: 50 20 42 59 22 2e 20 45 78 61 63 74 6c 79 20 77  P BY". Exactly w
c450: 68 69 63 68 0a 2a 2a 20 69 73 20 64 65 74 65 72  hich.** is deter
c460: 6d 69 6e 65 64 20 62 79 20 74 68 65 20 7a 55 73  mined by the zUs
c470: 61 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  age argument..*/
c480: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
c490: 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 50 61  lainTempTable(Pa
c4a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
c4b0: 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67 65 29  st char *zUsage)
c4c0: 7b 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79  {.  ExplainQuery
c4d0: 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c  Plan((pParse, 0,
c4e0: 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45   "USE TEMP B-TRE
c4f0: 45 20 46 4f 52 20 25 73 22 2c 20 7a 55 73 61 67  E FOR %s", zUsag
c500: 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  e));.}../*.** As
c510: 73 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  sign expression 
c520: 62 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41  b to lvalue a. A
c530: 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20   second, no-op, 
c540: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20  version of this 
c550: 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76  macro.** is prov
c560: 69 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45  ided when SQLITE
c570: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73  _OMIT_EXPLAIN is
c580: 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61   defined. This a
c590: 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a  llows the code.*
c5a0: 2a 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65  * in sqlite3Sele
c5b0: 63 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76  ct() to assign v
c5c0: 61 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74 75  alues to structu
c5d0: 72 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62  re member variab
c5e0: 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79  les that.** only
c5f0: 20 65 78 69 73 74 20 69 66 20 53 51 4c 49 54 45   exist if SQLITE
c600: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73  _OMIT_EXPLAIN is
c610: 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74   not defined wit
c620: 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74  hout polluting t
c630: 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20  he.** code with 
c640: 23 69 66 6e 64 65 66 20 64 69 72 65 63 74 69 76  #ifndef directiv
c650: 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20  es..*/.# define 
c660: 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
c670: 72 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23  r(a, b) a = b..#
c680: 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65  else./* No-op ve
c690: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78  rsions of the ex
c6a0: 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74  plainXXX() funct
c6b0: 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e  ions and macros.
c6c0: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70   */.# define exp
c6d0: 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c  lainTempTable(y,
c6e0: 7a 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  z).# define expl
c6f0: 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c  ainSetInteger(y,
c700: 7a 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  z).#endif.../*.*
c710: 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  * If the inner l
c720: 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74 65  oop was generate
c730: 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75  d using a non-nu
c740: 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67 75  ll pOrderBy argu
c750: 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ment,.** then th
c760: 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20 70  e results were p
c770: 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65  laced in a sorte
c780: 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f  r.  After the lo
c790: 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64  op is terminated
c7a0: 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72  .** we need to r
c7b0: 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e  un the sorter an
c7c0: 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65 73  d output the res
c7d0: 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  ults.  The follo
c7e0: 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  wing.** routine 
c7f0: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
c800: 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20  de needed to do 
c810: 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  that..*/.static 
c820: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72  void generateSor
c830: 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a  tTail(.  Parse *
c840: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
c850: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
c860: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
c870: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
c880: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
c890: 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74    SortCtx *pSort
c8a0: 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69  ,   /* Informati
c8b0: 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20  on on the ORDER 
c8c0: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
c8d0: 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt nColumn,     
c8e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
c8f0: 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f  lumns of data */
c900: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
c910: 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68  Dest /* Write th
c920: 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73  e sorted results
c930: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64   here */.){.  Vd
c940: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
c950: 70 56 64 62 65 3b 20 20 20 20 20 20 20 20 20 20  pVdbe;          
c960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
c970: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
c980: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ment */.  int ad
c990: 64 72 42 72 65 61 6b 20 3d 20 70 53 6f 72 74 2d  drBreak = pSort-
c9a0: 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20 20  >labelDone;     
c9b0: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
c9c0: 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70  ere to exit loop
c9d0: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
c9e0: 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
c9f0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
ca00: 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  ;  /* Jump here 
ca10: 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20 2a  for next cycle *
ca20: 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20  /.  int addr;   
ca30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca40: 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 6f 75      /* Top of ou
ca50: 74 70 75 74 20 6c 6f 6f 70 2e 20 4a 75 6d 70 20  tput loop. Jump 
ca60: 66 6f 72 20 4e 65 78 74 2e 20 2a 2f 0a 20 20 69  for Next. */.  i
ca70: 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b  nt addrOnce = 0;
ca80: 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 45  .  int iTab;.  E
ca90: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
caa0: 79 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65  y = pSort->pOrde
cab0: 72 42 79 3b 0a 20 20 69 6e 74 20 65 44 65 73 74  rBy;.  int eDest
cac0: 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b   = pDest->eDest;
cad0: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70  .  int iParm = p
cae0: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a 20  Dest->iSDParm;. 
caf0: 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20 69   int regRow;.  i
cb00: 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 20 20 69  nt regRowid;.  i
cb10: 6e 74 20 69 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e  nt iCol;.  int n
cb20: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  Key;            
cb30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
cb40: 6d 62 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75  mber of key colu
cb50: 6d 6e 73 20 69 6e 20 73 6f 72 74 65 72 20 72 65  mns in sorter re
cb60: 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 69 53  cord */.  int iS
cb70: 6f 72 74 54 61 62 3b 20 20 20 20 20 20 20 20 20  ortTab;         
cb80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72            /* Sor
cb90: 74 65 72 20 63 75 72 73 6f 72 20 74 6f 20 72 65  ter cursor to re
cba0: 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ad from */.  int
cbb0: 20 69 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b 20   i;.  int bSeq; 
cbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbd0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
cbe0: 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 69   sorter record i
cbf0: 6e 63 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f 2e  ncludes seq. no.
cc00: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 4b 65   */.  int nRefKe
cc10: 79 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20  y = 0;.  struct 
cc20: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
cc30: 4f 75 74 45 78 20 3d 20 70 2d 3e 70 45 4c 69 73  OutEx = p->pELis
cc40: 74 2d 3e 61 3b 0a 0a 20 20 61 73 73 65 72 74 28  t->a;..  assert(
cc50: 20 61 64 64 72 42 72 65 61 6b 3c 30 20 29 3b 0a   addrBreak<0 );.
cc60: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62    if( pSort->lab
cc70: 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73  elBkOut ){.    s
cc80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
cc90: 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53  (v, OP_Gosub, pS
cca0: 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  ort->regReturn, 
ccb0: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
ccc0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
ccd0: 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 42  dbeGoto(v, addrB
cce0: 72 65 61 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  reak);.    sqlit
ccf0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
cd00: 65 6c 28 76 2c 20 70 53 6f 72 74 2d 3e 6c 61 62  el(v, pSort->lab
cd10: 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a 0a 23  elBkOut);.  }..#
cd20: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
cd30: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
cd40: 45 4e 43 45 53 0a 20 20 2f 2a 20 4f 70 65 6e 20  ENCES.  /* Open 
cd50: 61 6e 79 20 63 75 72 73 6f 72 73 20 6e 65 65 64  any cursors need
cd60: 65 64 20 66 6f 72 20 73 6f 72 74 65 72 2d 72 65  ed for sorter-re
cd70: 66 65 72 65 6e 63 65 20 65 78 70 72 65 73 73 69  ference expressi
cd80: 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ons */.  for(i=0
cd90: 3b 20 69 3c 70 53 6f 72 74 2d 3e 6e 44 65 66 65  ; i<pSort->nDefe
cda0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 61 62  r; i++){.    Tab
cdb0: 6c 65 20 2a 70 54 61 62 20 3d 20 70 53 6f 72 74  le *pTab = pSort
cdc0: 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 70 54 61 62  ->aDefer[i].pTab
cdd0: 3b 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20  ;.    int iDb = 
cde0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
cdf0: 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
ce00: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
ce10: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  .    sqlite3Open
ce20: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 53  Table(pParse, pS
ce30: 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 69  ort->aDefer[i].i
ce40: 43 73 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  Csr, iDb, pTab, 
ce50: 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
ce60: 20 20 6e 52 65 66 4b 65 79 20 3d 20 4d 41 58 28    nRefKey = MAX(
ce70: 6e 52 65 66 4b 65 79 2c 20 70 53 6f 72 74 2d 3e  nRefKey, pSort->
ce80: 61 44 65 66 65 72 5b 69 5d 2e 6e 4b 65 79 29 3b  aDefer[i].nKey);
ce90: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
cea0: 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43  Tab = pSort->iEC
ceb0: 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 65 44 65  ursor;.  if( eDe
cec0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
ced0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
cee0: 6f 75 74 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d  outine || eDest=
cef0: 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20  =SRT_Mem ){.    
cf00: 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  regRowid = 0;.  
cf10: 20 20 72 65 67 52 6f 77 20 3d 20 70 44 65 73 74    regRow = pDest
cf20: 2d 3e 69 53 64 73 74 3b 0a 20 20 7d 65 6c 73 65  ->iSdst;.  }else
cf30: 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d  {.    regRowid =
cf40: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
cf50: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
cf60: 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  regRow = sqlite3
cf70: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
cf80: 72 73 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  rse, nColumn);. 
cf90: 20 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72 64   }.  nKey = pOrd
cfa0: 65 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70 53  erBy->nExpr - pS
cfb0: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 69  ort->nOBSat;.  i
cfc0: 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c  f( pSort->sortFl
cfd0: 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55  ags & SORTFLAG_U
cfe0: 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20  seSorter ){.    
cff0: 69 6e 74 20 72 65 67 53 6f 72 74 4f 75 74 20 3d  int regSortOut =
d000: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
d010: 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20  .    iSortTab = 
d020: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
d030: 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c      if( pSort->l
d040: 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20  abelBkOut ){.   
d050: 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71     addrOnce = sq
d060: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
d070: 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62  v, OP_Once); Vdb
d080: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
d090: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
d0a0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d0b0: 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 53 6f 72  OpenPseudo, iSor
d0c0: 74 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74  tTab, regSortOut
d0d0: 2c 20 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 2b  , .        nKey+
d0e0: 31 2b 6e 43 6f 6c 75 6d 6e 2b 6e 52 65 66 4b 65  1+nColumn+nRefKe
d0f0: 79 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72  y);.    if( addr
d100: 4f 6e 63 65 20 29 20 73 71 6c 69 74 65 33 56 64  Once ) sqlite3Vd
d110: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
d120: 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 61 64 64  drOnce);.    add
d130: 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  r = 1 + sqlite3V
d140: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d150: 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54 61 62  SorterSort, iTab
d160: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
d170: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
d180: 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  );.    codeOffse
d190: 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
d1a0: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
d1b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d1c0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp3(v, OP_Sort
d1d0: 65 72 44 61 74 61 2c 20 69 54 61 62 2c 20 72 65  erData, iTab, re
d1e0: 67 53 6f 72 74 4f 75 74 2c 20 69 53 6f 72 74 54  gSortOut, iSortT
d1f0: 61 62 29 3b 0a 20 20 20 20 62 53 65 71 20 3d 20  ab);.    bSeq = 
d200: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
d210: 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74  addr = 1 + sqlit
d220: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d230: 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 61  OP_Sort, iTab, a
d240: 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43  ddrBreak); VdbeC
d250: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
d260: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
d270: 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f  >iOffset, addrCo
d280: 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 69 53 6f  ntinue);.    iSo
d290: 72 74 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20  rtTab = iTab;.  
d2a0: 20 20 62 53 65 71 20 3d 20 31 3b 0a 20 20 7d 0a    bSeq = 1;.  }.
d2b0: 20 20 66 6f 72 28 69 3d 30 2c 20 69 43 6f 6c 3d    for(i=0, iCol=
d2c0: 6e 4b 65 79 2b 62 53 65 71 2d 31 3b 20 69 3c 6e  nKey+bSeq-1; i<n
d2d0: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 23 69  Column; i++){.#i
d2e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
d2f0: 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45  LE_SORTER_REFERE
d300: 4e 43 45 53 0a 20 20 20 20 69 66 28 20 61 4f 75  NCES.    if( aOu
d310: 74 45 78 5b 69 5d 2e 62 53 6f 72 74 65 72 52 65  tEx[i].bSorterRe
d320: 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 65  f ) continue;.#e
d330: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 61 4f 75  ndif.    if( aOu
d340: 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  tEx[i].u.x.iOrde
d350: 72 42 79 43 6f 6c 3d 3d 30 20 29 20 69 43 6f 6c  rByCol==0 ) iCol
d360: 2b 2b 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  ++;.  }.#ifdef S
d370: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52  QLITE_ENABLE_SOR
d380: 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20  TER_REFERENCES. 
d390: 20 69 66 28 20 70 53 6f 72 74 2d 3e 6e 44 65 66   if( pSort->nDef
d3a0: 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4b  er ){.    int iK
d3b0: 65 79 20 3d 20 69 43 6f 6c 2b 31 3b 0a 20 20 20  ey = iCol+1;.   
d3c0: 20 69 6e 74 20 72 65 67 4b 65 79 20 3d 20 73 71   int regKey = sq
d3d0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
d3e0: 65 28 70 50 61 72 73 65 2c 20 6e 52 65 66 4b 65  e(pParse, nRefKe
d3f0: 79 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  y);..    for(i=0
d400: 3b 20 69 3c 70 53 6f 72 74 2d 3e 6e 44 65 66 65  ; i<pSort->nDefe
d410: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; i++){.      i
d420: 6e 74 20 69 43 73 72 20 3d 20 70 53 6f 72 74 2d  nt iCsr = pSort-
d430: 3e 61 44 65 66 65 72 5b 69 5d 2e 69 43 73 72 3b  >aDefer[i].iCsr;
d440: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
d450: 61 62 20 3d 20 70 53 6f 72 74 2d 3e 61 44 65 66  ab = pSort->aDef
d460: 65 72 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20  er[i].pTab;.    
d470: 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 53 6f    int nKey = pSo
d480: 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 6e 4b  rt->aDefer[i].nK
d490: 65 79 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  ey;..      sqlit
d4a0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
d4b0: 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 73 72  OP_NullRow, iCsr
d4c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 48 61 73  );.      if( Has
d4d0: 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
d4e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d4f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
d500: 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62 2c  olumn, iSortTab,
d510: 20 69 4b 65 79 2b 2b 2c 20 72 65 67 4b 65 79 29   iKey++, regKey)
d520: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
d530: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d540: 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 69 43 73  P_SeekRowid, iCs
d550: 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  r, .            
d560: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
d570: 6e 74 41 64 64 72 28 76 29 2b 31 2c 20 72 65 67  ntAddr(v)+1, reg
d580: 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Key);.      }els
d590: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b  e{.        int k
d5a0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a  ;.        int iJ
d5b0: 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  mp;.        asse
d5c0: 72 74 28 20 73 71 6c 69 74 65 33 50 72 69 6d 61  rt( sqlite3Prima
d5d0: 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
d5e0: 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 6e 4b 65 79 20  ->nKeyCol==nKey 
d5f0: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b  );.        for(k
d600: 3d 30 3b 20 6b 3c 6e 4b 65 79 3b 20 6b 2b 2b 29  =0; k<nKey; k++)
d610: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
d620: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
d630: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72   OP_Column, iSor
d640: 74 54 61 62 2c 20 69 4b 65 79 2b 2b 2c 20 72 65  tTab, iKey++, re
d650: 67 4b 65 79 2b 6b 29 3b 0a 20 20 20 20 20 20 20  gKey+k);.       
d660: 20 7d 0a 20 20 20 20 20 20 20 20 69 4a 6d 70 20   }.        iJmp 
d670: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
d680: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
d690: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d6a0: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
d6b0: 53 65 65 6b 47 45 2c 20 69 43 73 72 2c 20 69 4a  SeekGE, iCsr, iJ
d6c0: 6d 70 2b 32 2c 20 72 65 67 4b 65 79 2c 20 6e 4b  mp+2, regKey, nK
d6d0: 65 79 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ey);.        sql
d6e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
d6f0: 74 28 76 2c 20 4f 50 5f 49 64 78 4c 45 2c 20 69  t(v, OP_IdxLE, i
d700: 43 73 72 2c 20 69 4a 6d 70 2b 33 2c 20 72 65 67  Csr, iJmp+3, reg
d710: 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20  Key, nKey);.    
d720: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d730: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp1(v, OP_Null
d740: 52 6f 77 2c 20 69 43 73 72 29 3b 0a 20 20 20 20  Row, iCsr);.    
d750: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
d760: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
d770: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
d780: 67 4b 65 79 2c 20 6e 52 65 66 4b 65 79 29 3b 0a  gKey, nRefKey);.
d790: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72    }.#endif.  for
d7a0: 28 69 3d 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 69 3e  (i=nColumn-1; i>
d7b0: 3d 30 3b 20 69 2d 2d 29 7b 0a 23 69 66 64 65 66  =0; i--){.#ifdef
d7c0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
d7d0: 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53  ORTER_REFERENCES
d7e0: 0a 20 20 20 20 69 66 28 20 61 4f 75 74 45 78 5b  .    if( aOutEx[
d7f0: 69 5d 2e 62 53 6f 72 74 65 72 52 65 66 20 29 7b  i].bSorterRef ){
d800: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
d810: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61  prCode(pParse, a
d820: 4f 75 74 45 78 5b 69 5d 2e 70 45 78 70 72 2c 20  OutEx[i].pExpr, 
d830: 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20 7d  regRow+i);.    }
d840: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
d850: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 52 65 61  {.      int iRea
d860: 64 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4f 75  d;.      if( aOu
d870: 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  tEx[i].u.x.iOrde
d880: 72 42 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  rByCol ){.      
d890: 20 20 69 52 65 61 64 20 3d 20 61 4f 75 74 45 78    iRead = aOutEx
d8a0: 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
d8b0: 43 6f 6c 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c  Col-1;.      }el
d8c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 52 65 61  se{.        iRea
d8d0: 64 20 3d 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20  d = iCol--;.    
d8e0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
d8f0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d900: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54  P_Column, iSortT
d910: 61 62 2c 20 69 52 65 61 64 2c 20 72 65 67 52 6f  ab, iRead, regRo
d920: 77 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65  w+i);.      Vdbe
d930: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
d940: 2c 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d  , aOutEx[i].zNam
d950: 65 3f 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d  e?aOutEx[i].zNam
d960: 65 20 3a 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 53  e : aOutEx[i].zS
d970: 70 61 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pan));.    }.  }
d980: 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74  .  switch( eDest
d990: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54   ){.    case SRT
d9a0: 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65  _Table:.    case
d9b0: 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b   SRT_EphemTab: {
d9c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d9d0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
d9e0: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
d9f0: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
da00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
da10: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
da20: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20   iParm, regRow, 
da30: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
da40: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
da50: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
da60: 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72  PPEND);.      br
da70: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
da80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
da90: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
daa0: 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
dab0: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
dac0: 6e 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  n==sqlite3Strlen
dad0: 33 30 28 70 44 65 73 74 2d 3e 7a 41 66 66 53 64  30(pDest->zAffSd
dae0: 73 74 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  st) );.      sql
daf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
db00: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
db10: 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e   regRow, nColumn
db20: 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20 20 20 20  , regRowid,.    
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db40: 20 20 20 20 70 44 65 73 74 2d 3e 7a 41 66 66 53      pDest->zAffS
db50: 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  dst, nColumn);. 
db60: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
db70: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
db80: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
db90: 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ow, nColumn);.  
dba0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
dbb0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
dbc0: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
dbd0: 20 72 65 67 52 6f 77 69 64 2c 20 72 65 67 52 6f   regRowid, regRo
dbe0: 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  w, nColumn);.   
dbf0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
dc00: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
dc10: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
dc20: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
dc30: 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
dc40: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
dc50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
dc60: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
dc70: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
dc80: 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52  ssert( eDest==SR
dc90: 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73  T_Output || eDes
dca0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
dcb0: 20 29 3b 20 0a 20 20 20 20 20 20 74 65 73 74 63   ); .      testc
dcc0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
dcd0: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
dce0: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
dcf0: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
dd00: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  ;.      if( eDes
dd10: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
dd20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
dd30: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
dd40: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44 65 73  _ResultRow, pDes
dd50: 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d  t->iSdst, nColum
dd60: 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
dd70: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
dd80: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
dd90: 65 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c  e, pDest->iSdst,
dda0: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
ddb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ddc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ddd0: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
dde0: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
ddf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
de00: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
de10: 20 69 66 28 20 72 65 67 52 6f 77 69 64 20 29 7b   if( regRowid ){
de20: 0a 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d  .    if( eDest==
de30: 53 52 54 5f 53 65 74 20 29 7b 0a 20 20 20 20 20  SRT_Set ){.     
de40: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
de50: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
de60: 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e   regRow, nColumn
de70: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
de80: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
de90: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
dea0: 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 7d  , regRow);.    }
deb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
dec0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
ded0: 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  e, regRowid);.  
dee0: 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f  }.  /* The botto
def0: 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20  m of the loop.  
df00: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
df10: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
df20: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
df30: 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74   if( pSort->sort
df40: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
df50: 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20  _UseSorter ){.  
df60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
df70: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
df80: 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
df90: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
dfa0: 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  v);.  }else{.   
dfb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dfc0: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  p2(v, OP_Next, i
dfd0: 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62 65  Tab, addr); Vdbe
dfe0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
dff0: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 72 65  .  if( pSort->re
e000: 67 52 65 74 75 72 6e 20 29 20 73 71 6c 69 74 65  gReturn ) sqlite
e010: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
e020: 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d  P_Return, pSort-
e030: 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 73  >regReturn);.  s
e040: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
e050: 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72  eLabel(v, addrBr
e060: 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  eak);.}../*.** R
e070: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
e080: 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74  to a string cont
e090: 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c  aining the 'decl
e0a0: 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66  aration type' of
e0b0: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
e0c0: 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73 74  on pExpr. The st
e0d0: 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61  ring may be trea
e0e0: 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62 79  ted as static by
e0f0: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
e100: 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f 20 65  ** Also try to e
e110: 73 74 69 6d 61 74 65 20 74 68 65 20 73 69 7a 65  stimate the size
e120: 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   of the returned
e130: 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74 75 72   value and retur
e140: 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74  n that.** result
e150: 20 69 6e 20 2a 70 45 73 74 57 69 64 74 68 2e 0a   in *pEstWidth..
e160: 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  **.** The declar
e170: 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68  ation type is th
e180: 65 20 65 78 61 63 74 20 64 61 74 61 74 79 70 65  e exact datatype
e190: 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72   definition extr
e1a0: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  acted from the.*
e1b0: 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54  * original CREAT
e1c0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
e1d0: 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  t if the express
e1e0: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
e1f0: 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74   The.** declarat
e200: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52  ion type for a R
e210: 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e  OWID field is IN
e220: 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77  TEGER. Exactly w
e230: 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f  hen an expressio
e240: 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  n.** is consider
e250: 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  ed a column can 
e260: 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68  be complex in th
e270: 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75  e presence of su
e280: 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a  bqueries. The.**
e290: 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72   result-set expr
e2a0: 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66  ession in all of
e2b0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53   the following S
e2c0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
e2d0: 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72   is .** consider
e2e0: 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74  ed a column by t
e2f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
e300: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c  .**   SELECT col
e310: 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20   FROM tbl;.**   
e320: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
e330: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
e340: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
e350: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   col FROM tbl);.
e360: 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63 20  **   SELECT abc 
e370: 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c  FROM (SELECT col
e380: 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c   AS abc FROM tbl
e390: 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65  );.** .** The de
e3a0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66  claration type f
e3b0: 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  or any expressio
e3c0: 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63  n other than a c
e3d0: 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a  olumn is NULL..*
e3e0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
e3f0: 65 20 68 61 73 20 65 69 74 68 65 72 20 33 20 6f  e has either 3 o
e400: 72 20 36 20 70 61 72 61 6d 65 74 65 72 73 20 64  r 6 parameters d
e410: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
e420: 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68  her or not.** th
e430: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
e440: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20  COLUMN_METADATA 
e450: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
e460: 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a  ion is used..*/.
e470: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
e480: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
e490: 44 41 54 41 0a 23 20 64 65 66 69 6e 65 20 63 6f  DATA.# define co
e4a0: 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44  lumnType(A,B,C,D
e4b0: 2c 45 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d  ,E) columnTypeIm
e4c0: 70 6c 28 41 2c 42 2c 43 2c 44 2c 45 29 0a 23 65  pl(A,B,C,D,E).#e
e4d0: 6c 73 65 20 2f 2a 20 69 66 20 21 64 65 66 69 6e  lse /* if !defin
e4e0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
e4f0: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
e500: 29 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63 6f  ) */.# define co
e510: 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44  lumnType(A,B,C,D
e520: 2c 45 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d  ,E) columnTypeIm
e530: 70 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 0a 73  pl(A,B).#endif.s
e540: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
e550: 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c   *columnTypeImpl
e560: 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  (.  NameContext 
e570: 2a 70 4e 43 2c 20 0a 23 69 66 6e 64 65 66 20 53  *pNC, .#ifndef S
e580: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
e590: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 45  UMN_METADATA.  E
e5a0: 78 70 72 20 2a 70 45 78 70 72 0a 23 65 6c 73 65  xpr *pExpr.#else
e5b0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a  .  Expr *pExpr,.
e5c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
e5d0: 7a 4f 72 69 67 44 62 2c 0a 20 20 63 6f 6e 73 74  zOrigDb,.  const
e5e0: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 54 61   char **pzOrigTa
e5f0: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
e600: 2a 2a 70 7a 4f 72 69 67 43 6f 6c 0a 23 65 6e 64  **pzOrigCol.#end
e610: 69 66 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e  if.){.  char con
e620: 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20  st *zType = 0;. 
e630: 20 69 6e 74 20 6a 3b 0a 23 69 66 64 65 66 20 53   int j;.#ifdef S
e640: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
e650: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 63  UMN_METADATA.  c
e660: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
e670: 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  Db = 0;.  char c
e680: 6f 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62 20 3d  onst *zOrigTab =
e690: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
e6a0: 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a   *zOrigCol = 0;.
e6b0: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
e6c0: 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ( pExpr!=0 );.  
e6d0: 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72  assert( pNC->pSr
e6e0: 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73  cList!=0 );.  as
e6f0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
e700: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
e710: 3b 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  ;  /* This routi
e720: 6e 65 20 72 75 6e 65 73 20 62 65 66 6f 72 65 20  ne runes before 
e730: 61 67 67 72 65 67 61 74 65 73 0a 20 20 20 20 20  aggregates.     
e740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e760: 20 20 2a 2a 20 61 72 65 20 70 72 6f 63 65 73 73    ** are process
e770: 65 64 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20  ed */.  switch( 
e780: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
e790: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
e7a0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
e7b0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
e7c0: 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74  column. Locate t
e7d0: 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f 6c  he table the col
e7e0: 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20  umn is being.   
e7f0: 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20     ** extracted 
e800: 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74  from in NameCont
e810: 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54 68  ext.pSrcList. Th
e820: 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20  is table may be 
e830: 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61  real.      ** da
e840: 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20  tabase table or 
e850: 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20  a subquery..    
e860: 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65    */.      Table
e870: 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20   *pTab = 0;     
e880: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
e890: 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e  structure column
e8a0: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
e8b0: 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65  om */.      Sele
e8c0: 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20 20  ct *pS = 0;     
e8d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63          /* Selec
e8e0: 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  t the column is 
e8f0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a  extracted from *
e900: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  /.      int iCol
e910: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
e920: 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20  n;  /* Index of 
e930: 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a  column in pTab *
e940: 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  /.      while( p
e950: 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20  NC && !pTab ){. 
e960: 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a         SrcList *
e970: 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pTabList = pNC->
e980: 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20  pSrcList;.      
e990: 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62    for(j=0;j<pTab
e9a0: 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54  List->nSrc && pT
e9b0: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
e9c0: 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61  rsor!=pExpr->iTa
e9d0: 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20  ble;j++);.      
e9e0: 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74    if( j<pTabList
e9f0: 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20  ->nSrc ){.      
ea00: 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c      pTab = pTabL
ea10: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a  ist->a[j].pTab;.
ea20: 20 20 20 20 20 20 20 20 20 20 70 53 20 3d 20 70            pS = p
ea30: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53  TabList->a[j].pS
ea40: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d  elect;.        }
ea50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ea60: 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74  pNC = pNC->pNext
ea70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ea80: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
ea90: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
eaa0: 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65    /* At one time
eab0: 2c 20 63 6f 64 65 20 73 75 63 68 20 61 73 20 22  , code such as "
eac0: 53 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77 69  SELECT new.x" wi
ead0: 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 20 77  thin a trigger w
eae0: 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ould.        ** 
eaf0: 63 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64 69  cause this condi
eb00: 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69  tion to run.  Si
eb10: 6e 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61 76  nce then, we hav
eb20: 65 20 72 65 73 74 72 75 63 74 75 72 65 64 20 68  e restructured h
eb30: 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  ow.        ** tr
eb40: 69 67 67 65 72 20 63 6f 64 65 20 69 73 20 67 65  igger code is ge
eb50: 6e 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20 74  nerated and so t
eb60: 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  his condition is
eb70: 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20   no longer .    
eb80: 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e      ** possible.
eb90: 20 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e   However, it can
eba0: 20 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20 66   still be true f
ebb0: 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69  or statements li
ebc0: 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ke.        ** th
ebd0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20  e following:.   
ebe0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
ebf0: 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
ec00: 45 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45 52  E t1(col INTEGER
ec10: 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  );.        **   
ec20: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 74  SELECT (SELECT t
ec30: 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d  1.col) FROM FROM
ec40: 20 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a   t1;.        **.
ec50: 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20          ** when 
ec60: 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20  columnType() is 
ec70: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78  called on the ex
ec80: 70 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c  pression "t1.col
ec90: 22 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20  " in the .      
eca0: 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e    ** sub-select.
ecb0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73   In this case, s
ecc0: 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  et the column ty
ecd0: 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e  pe to NULL, even
ece0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 75  .        ** thou
ecf0: 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65 61  gh it should rea
ed00: 6c 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52 22  lly be "INTEGER"
ed10: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
ed20: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
ed30: 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61  not a problem, a
ed40: 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70  s the column typ
ed50: 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69 73  e of "t1.col" is
ed60: 20 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20 2a   never.        *
ed70: 2a 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c  * used. When col
ed80: 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c  umnType() is cal
ed90: 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65  led on the expre
eda0: 73 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a  ssion .        *
edb0: 2a 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63 6f  * "(SELECT t1.co
edc0: 6c 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63 74  l)", the correct
edd0: 20 74 79 70 65 20 69 73 20 72 65 74 75 72 6e 65   type is returne
ede0: 64 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53 45  d (see the TK_SE
edf0: 4c 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a 20  LECT.        ** 
ee00: 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a  branch below.  *
ee10: 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
ee20: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
ee30: 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20  assert( pTab && 
ee40: 70 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61  pExpr->pTab==pTa
ee50: 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  b );.      if( p
ee60: 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  S ){.        /* 
ee70: 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20 61  The "table" is a
ee80: 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65  ctually a sub-se
ee90: 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20 69  lect or a view i
eea0: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
eeb0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  e.        ** of 
eec0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
eed0: 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65  ment. Return the
eee0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
eef0: 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20  e and origin.   
ef00: 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72       ** data for
ef10: 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20   the result-set 
ef20: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75  column of the su
ef30: 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20  b-select..      
ef40: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
ef50: 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c   iCol>=0 && iCol
ef60: 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <pS->pEList->nEx
ef70: 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pr ){.          
ef80: 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65  /* If iCol is le
ef90: 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
efa0: 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
efb0: 6e 20 72 65 71 75 65 73 74 73 20 74 68 65 0a 20  n requests the. 
efc0: 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69           ** rowi
efd0: 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c  d of the sub-sel
efe0: 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69  ect or view. Thi
eff0: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
f000: 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20  legal (see .    
f010: 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61        ** test ca
f020: 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20  se misc2.2.2) - 
f030: 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61  it always evalua
f040: 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20  tes to NULL..   
f050: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
f060: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
f070: 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45  sNC;.          E
f080: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
f090: 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  ist->a[iCol].pEx
f0a0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  pr;.          sN
f0b0: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d  C.pSrcList = pS-
f0c0: 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20  >pSrc;.         
f0d0: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43   sNC.pNext = pNC
f0e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
f0f0: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
f100: 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  arse;.          
f110: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
f120: 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69  pe(&sNC, p,&zOri
f130: 67 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a  gDb,&zOrigTab,&z
f140: 4f 72 69 67 43 6f 6c 29 3b 20 0a 20 20 20 20 20  OrigCol); .     
f150: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
f160: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72  {.        /* A r
f170: 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 61 20 43  eal table or a C
f180: 54 45 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  TE table */.    
f190: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53 20      assert( !pS 
f1a0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
f1b0: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
f1c0: 45 54 41 44 41 54 41 0a 20 20 20 20 20 20 20 20  ETADATA.        
f1d0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
f1e0: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
f1f0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
f200: 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20   iCol==XN_ROWID 
f210: 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  || (iCol>=0 && i
f220: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Col<pTab->nCol) 
f230: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
f240: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
f250: 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45     zType = "INTE
f260: 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20  GER";.          
f270: 7a 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f 77 69  zOrigCol = "rowi
f280: 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  d";.        }els
f290: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  e{.          zOr
f2a0: 69 67 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43  igCol = pTab->aC
f2b0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a  ol[iCol].zName;.
f2c0: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
f2d0: 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54  = sqlite3ColumnT
f2e0: 79 70 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  ype(&pTab->aCol[
f2f0: 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20  iCol],0);.      
f300: 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72 69    }.        zOri
f310: 67 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  gTab = pTab->zNa
f320: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
f330: 70 4e 43 2d 3e 70 50 61 72 73 65 20 26 26 20 70  pNC->pParse && p
f340: 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  Tab->pSchema ){.
f350: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
f360: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
f370: 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50  aToIndex(pNC->pP
f380: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
f390: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
f3a0: 20 20 20 20 7a 4f 72 69 67 44 62 20 3d 20 70 4e      zOrigDb = pN
f3b0: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  C->pParse->db->a
f3c0: 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
f3d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6c 73  ;.        }.#els
f3e0: 65 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  e.        assert
f3f0: 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44  ( iCol==XN_ROWID
f400: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
f410: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
f420: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
f430: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
f440: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54      zType = "INT
f450: 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 7d  EGER";.        }
f460: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
f470: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 43  zType = sqlite3C
f480: 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62 2d  olumnType(&pTab-
f490: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b 0a  >aCol[iCol],0);.
f4a0: 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
f4b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
f4c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
f4d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f4e0: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
f4f0: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
f500: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
f510: 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d  ession is a sub-
f520: 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74  select. Return t
f530: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
f540: 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ype and.      **
f550: 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72   origin info for
f560: 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75   the single colu
f570: 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  mn in the result
f580: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
f590: 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  CT.      ** stat
f5a0: 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ement..      */.
f5b0: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
f5c0: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c  t sNC;.      Sel
f5d0: 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d  ect *pS = pExpr-
f5e0: 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  >x.pSelect;.    
f5f0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e    Expr *p = pS->
f600: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
f610: 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
f620: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
f630: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
f640: 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
f650: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
f660: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73  S->pSrc;.      s
f670: 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a  NC.pNext = pNC;.
f680: 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65        sNC.pParse
f690: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
f6a0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f        zType = co
f6b0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
f6c0: 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72  , &zOrigDb, &zOr
f6d0: 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c  igTab, &zOrigCol
f6e0: 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ); .      break;
f6f0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
f700: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
f710: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
f720: 45 54 41 44 41 54 41 20 20 0a 20 20 69 66 28 20  ETADATA  .  if( 
f730: 70 7a 4f 72 69 67 44 62 20 29 7b 0a 20 20 20 20  pzOrigDb ){.    
f740: 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67 54 61  assert( pzOrigTa
f750: 62 20 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20 29  b && pzOrigCol )
f760: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 44 62 20  ;.    *pzOrigDb 
f770: 3d 20 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20 2a  = zOrigDb;.    *
f780: 70 7a 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72 69  pzOrigTab = zOri
f790: 67 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  gTab;.    *pzOri
f7a0: 67 43 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b  gCol = zOrigCol;
f7b0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
f7c0: 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f  turn zType;.}../
f7d0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
f7e0: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c  de that will tel
f7f0: 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20 64  l the VDBE the d
f800: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73  eclaration types
f810: 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69   of columns.** i
f820: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
f830: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
f840: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
f850: 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ypes(.  Parse *p
f860: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
f870: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
f880: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
f890: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
f8a0: 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78  f tables */.  Ex
f8b0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
f8c0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
f8d0: 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65   defining the re
f8e0: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23  sult set */.){.#
f8f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f900: 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56 64  IT_DECLTYPE.  Vd
f910: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
f920: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
f930: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
f940: 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  C;.  sNC.pSrcLis
f950: 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
f960: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
f970: 72 73 65 3b 0a 20 20 73 4e 43 2e 70 4e 65 78 74  rse;.  sNC.pNext
f980: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
f990: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
f9a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
f9b0: 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   *p = pEList->a[
f9c0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f  i].pExpr;.    co
f9d0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
f9e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
f9f0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
fa00: 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74 20  ADATA.    const 
fa10: 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20  char *zOrigDb = 
fa20: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
fa30: 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b  r *zOrigTab = 0;
fa40: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
fa50: 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20  *zOrigCol = 0;. 
fa60: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
fa70: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
fa80: 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54  zOrigDb, &zOrigT
fa90: 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 0a  ab, &zOrigCol);.
faa0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62 65  .    /* The vdbe
fab0: 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73 20 6f   must make its o
fac0: 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63  wn copy of the c
fad0: 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f  olumn-type and o
fae0: 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c  ther .    ** col
faf0: 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74 72  umn specific str
fb00: 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74 68  ings, in case th
fb10: 65 20 73 63 68 65 6d 61 20 69 73 20 72 65 73 65  e schema is rese
fb20: 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20 20  t before this.  
fb30: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63    ** virtual mac
fb40: 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e  hine is deleted.
fb50: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
fb60: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
fb70: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
fb80: 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67 44  DATABASE, zOrigD
fb90: 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  b, SQLITE_TRANSI
fba0: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
fbb0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
fbc0: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41  v, i, COLNAME_TA
fbd0: 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c 20 53  BLE, zOrigTab, S
fbe0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
fbf0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
fc00: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
fc10: 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e  , COLNAME_COLUMN
fc20: 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51 4c 49  , zOrigCol, SQLI
fc30: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 23  TE_TRANSIENT);.#
fc40: 65 6c 73 65 0a 20 20 20 20 7a 54 79 70 65 20 3d  else.    zType =
fc50: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
fc60: 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23  , p, 0, 0, 0);.#
fc70: 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
fc80: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
fc90: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45  v, i, COLNAME_DE
fca0: 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c 20 53  CLTYPE, zType, S
fcb0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
fcc0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
fcd0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
fce0: 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 29 20 2a  OMIT_DECLTYPE) *
fcf0: 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  /.}.../*.** Comp
fd00: 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ute the column n
fd10: 61 6d 65 73 20 66 6f 72 20 61 20 53 45 4c 45 43  ames for a SELEC
fd20: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  T statement..**.
fd30: 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 67 75 61 72  ** The only guar
fd40: 61 6e 74 65 65 20 74 68 61 74 20 53 51 4c 69 74  antee that SQLit
fd50: 65 20 6d 61 6b 65 73 20 61 62 6f 75 74 20 63 6f  e makes about co
fd60: 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 73 20 74 68  lumn names is th
fd70: 61 74 20 69 66 20 74 68 65 0a 2a 2a 20 63 6f 6c  at if the.** col
fd80: 75 6d 6e 20 68 61 73 20 61 6e 20 41 53 20 63 6c  umn has an AS cl
fd90: 61 75 73 65 20 61 73 73 69 67 6e 69 6e 67 20 69  ause assigning i
fda0: 74 20 61 20 6e 61 6d 65 2c 20 74 68 61 74 20 77  t a name, that w
fdb0: 69 6c 6c 20 62 65 20 74 68 65 20 6e 61 6d 65 20  ill be the name 
fdc0: 75 73 65 64 2e 0a 2a 2a 20 54 68 61 74 20 69 73  used..** That is
fdd0: 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d 65   the only docume
fde0: 6e 74 65 64 20 67 75 61 72 61 6e 74 65 65 2e 20  nted guarantee. 
fdf0: 20 48 6f 77 65 76 65 72 2c 20 63 6f 75 6e 74 6c   However, countl
fe00: 65 73 73 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  ess applications
fe10: 0a 2a 2a 20 64 65 76 65 6c 6f 70 65 64 20 6f 76  .** developed ov
fe20: 65 72 20 74 68 65 20 79 65 61 72 73 20 68 61 76  er the years hav
fe30: 65 20 6d 61 64 65 20 62 61 73 65 6c 65 73 73 20  e made baseless 
fe40: 61 73 73 75 6d 70 74 69 6f 6e 73 20 61 62 6f 75  assumptions abou
fe50: 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 2a  t column names.*
fe60: 2a 20 61 6e 64 20 77 69 6c 6c 20 62 72 65 61 6b  * and will break
fe70: 20 69 66 20 74 68 6f 73 65 20 61 73 73 75 6d 70   if those assump
fe80: 74 69 6f 6e 73 20 63 68 61 6e 67 65 73 2e 20 20  tions changes.  
fe90: 48 65 6e 63 65 2c 20 75 73 65 20 65 78 74 72 65  Hence, use extre
fea0: 6d 65 20 63 61 75 74 69 6f 6e 0a 2a 2a 20 77 68  me caution.** wh
feb0: 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 69  en modifying thi
fec0: 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 61 76 6f  s routine to avo
fed0: 69 64 20 62 72 65 61 6b 69 6e 67 20 6c 65 67 61  id breaking lega
fee0: 63 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 41 6c  cy..**.** See Al
fef0: 73 6f 3a 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  so: sqlite3Colum
ff00: 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 29  nsFromExprList()
ff10: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 52 41 47 4d  .**.** The PRAGM
ff20: 41 20 73 68 6f 72 74 5f 63 6f 6c 75 6d 6e 5f 6e  A short_column_n
ff30: 61 6d 65 73 20 61 6e 64 20 50 52 41 47 4d 41 20  ames and PRAGMA 
ff40: 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  full_column_name
ff50: 73 20 73 65 74 74 69 6e 67 73 20 61 72 65 0a 2a  s settings are.*
ff60: 2a 20 64 65 70 72 65 63 61 74 65 64 2e 20 20 54  * deprecated.  T
ff70: 68 65 20 64 65 66 61 75 6c 74 20 73 65 74 74 69  he default setti
ff80: 6e 67 20 69 73 20 73 68 6f 72 74 3d 4f 4e 2c 20  ng is short=ON, 
ff90: 66 75 6c 6c 3d 4f 46 46 2e 20 20 39 39 2e 39 25  full=OFF.  99.9%
ffa0: 20 6f 66 20 61 6c 6c 0a 2a 2a 20 61 70 70 6c 69   of all.** appli
ffb0: 63 61 74 69 6f 6e 73 20 73 68 6f 75 6c 64 20 6f  cations should o
ffc0: 70 65 72 61 74 65 20 74 68 69 73 20 77 61 79 2e  perate this way.
ffd0: 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
ffe0: 77 65 20 6e 65 65 64 20 74 6f 20 73 75 70 70 6f  we need to suppo
fff0: 72 74 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20  rt the.** other 
10000 6d 6f 64 65 73 20 66 6f 72 20 6c 65 67 61 63 79  modes for legacy
10010 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 68 6f 72 74  :.**.**    short
10020 3d 4f 46 46 2c 20 66 75 6c 6c 3d 4f 46 46 3a 20  =OFF, full=OFF: 
10030 20 20 20 20 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65       Column name
10040 20 69 73 20 74 68 65 20 74 65 78 74 20 6f 66 20   is the text of 
10050 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68  the expression h
10060 61 73 20 69 74 0a 2a 2a 20 20 20 20 20 20 20 20  as it.**        
10070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10080 20 20 20 20 20 20 6f 72 69 67 69 6e 61 6c 6c 79        originally
10090 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 20   appears in the 
100a0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
100b0 2e 20 20 49 6e 0a 2a 2a 20 20 20 20 20 20 20 20  .  In.**        
100c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100d0 20 20 20 20 20 20 6f 74 68 65 72 20 77 6f 72 64        other word
100e0 73 2c 20 74 68 65 20 7a 53 70 61 6e 20 6f 66 20  s, the zSpan of 
100f0 74 68 65 20 72 65 73 75 6c 74 20 65 78 70 72 65  the result expre
10100 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ssion..**.**    
10110 73 68 6f 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f  short=ON, full=O
10120 46 46 3a 20 20 20 20 20 20 20 28 54 68 69 73 20  FF:       (This 
10130 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 73  is the default s
10140 65 74 74 69 6e 67 29 2e 20 20 49 66 20 74 68 65  etting).  If the
10150 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 20   result.**      
10160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10170 20 20 20 20 20 20 20 20 72 65 66 65 72 73 20 64          refers d
10180 69 72 65 63 74 6c 79 20 74 6f 20 61 20 74 61 62  irectly to a tab
10190 6c 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20  le column, then 
101a0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
101b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101c0 20 20 20 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d      result colum
101d0 6e 20 6e 61 6d 65 20 69 73 20 6a 75 73 74 20 74  n name is just t
101e0 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a  he table column.
101f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
10200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10210 6e 61 6d 65 3a 20 43 4f 4c 55 4d 4e 2e 20 20 4f  name: COLUMN.  O
10220 74 68 65 72 77 69 73 65 20 75 73 65 20 7a 53 70  therwise use zSp
10230 61 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 66 75 6c  an..**.**    ful
10240 6c 3d 4f 4e 2c 20 73 68 6f 72 74 3d 41 4e 59 3a  l=ON, short=ANY:
10250 20 20 20 20 20 20 20 49 66 20 74 68 65 20 72 65         If the re
10260 73 75 6c 74 20 72 65 66 65 72 73 20 64 69 72 65  sult refers dire
10270 63 74 6c 79 20 74 6f 20 61 20 74 61 62 6c 65 20  ctly to a table 
10280 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 20 20 20 20 20  column,.**      
10290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102a0 20 20 20 20 20 20 20 20 74 68 65 6e 20 74 68 65          then the
102b0 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e   result column n
102c0 61 6d 65 20 77 69 74 68 20 74 68 65 20 74 61 62  ame with the tab
102d0 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 20 20 20  le name.**      
102e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102f0 20 20 20 20 20 20 20 20 70 72 65 66 69 78 2c 20          prefix, 
10300 65 78 3a 20 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e  ex: TABLE.COLUMN
10310 2e 20 20 4f 74 68 65 72 77 69 73 65 20 75 73 65  .  Otherwise use
10320 20 7a 53 70 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69   zSpan..*/.stati
10330 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
10340 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61  olumnNames(.  Pa
10350 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
10360 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
10370 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
10380 2a 70 53 65 6c 65 63 74 20 20 20 20 20 2f 2a 20  *pSelect     /* 
10390 47 65 6e 65 72 61 74 65 20 63 6f 6c 75 6d 6e 20  Generate column 
103a0 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20 53  names for this S
103b0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
103c0 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
103d0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
103e0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 54 61 62 6c  .  int i;.  Tabl
103f0 65 20 2a 70 54 61 62 3b 0a 20 20 53 72 63 4c 69  e *pTab;.  SrcLi
10400 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20  st *pTabList;.  
10410 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
10420 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
10430 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
10440 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 3b 20 20 20  int fullName;   
10450 20 2f 2a 20 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e   /* TABLE.COLUMN
10460 20 69 66 20 6e 6f 20 41 53 20 63 6c 61 75 73 65   if no AS clause
10470 20 61 6e 64 20 69 73 20 61 20 64 69 72 65 63 74   and is a direct
10480 20 74 61 62 6c 65 20 72 65 66 20 2a 2f 0a 20 20   table ref */.  
10490 69 6e 74 20 73 72 63 4e 61 6d 65 3b 20 20 20 20  int srcName;    
104a0 20 2f 2a 20 43 4f 4c 55 4d 4e 20 6f 72 20 54 41   /* COLUMN or TA
104b0 42 4c 45 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f  BLE.COLUMN if no
104c0 20 41 53 20 63 6c 61 75 73 65 20 61 6e 64 20 69   AS clause and i
104d0 73 20 64 69 72 65 63 74 20 2a 2f 0a 0a 23 69 66  s direct */..#if
104e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
104f0 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66  _EXPLAIN.  /* If
10500 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c   this is an EXPL
10510 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73  AIN, skip this s
10520 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  tep */.  if( pPa
10530 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
10540 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
10550 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50  #endif..  if( pP
10560 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
10570 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 2f 2a  t ) return;.  /*
10580 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72   Column names ar
10590 65 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  e determined by 
105a0 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  the left-most te
105b0 72 6d 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  rm of a compound
105c0 20 73 65 6c 65 63 74 20 2a 2f 0a 20 20 77 68 69   select */.  whi
105d0 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  le( pSelect->pPr
105e0 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20  ior ) pSelect = 
105f0 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b  pSelect->pPrior;
10600 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31  .  SELECTTRACE(1
10610 2c 70 50 61 72 73 65 2c 70 53 65 6c 65 63 74 2c  ,pParse,pSelect,
10620 28 22 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6c  ("generating col
10630 75 6d 6e 20 6e 61 6d 65 73 5c 6e 22 29 29 3b 0a  umn names\n"));.
10640 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 53 65    pTabList = pSe
10650 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 70 45  lect->pSrc;.  pE
10660 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
10670 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74  pEList;.  assert
10680 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( v!=0 );.  asse
10690 72 74 28 20 70 54 61 62 4c 69 73 74 21 3d 30 20  rt( pTabList!=0 
106a0 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c  );.  pParse->col
106b0 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20  NamesSet = 1;.  
106c0 66 75 6c 6c 4e 61 6d 65 20 3d 20 28 64 62 2d 3e  fullName = (db->
106d0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
106e0 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b  ullColNames)!=0;
106f0 0a 20 20 73 72 63 4e 61 6d 65 20 3d 20 28 64 62  .  srcName = (db
10700 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
10710 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21  _ShortColNames)!
10720 3d 30 20 7c 7c 20 66 75 6c 6c 4e 61 6d 65 3b 0a  =0 || fullName;.
10730 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
10740 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73  NumCols(v, pELis
10750 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72  t->nExpr);.  for
10760 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
10770 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
10780 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73   Expr *p = pELis
10790 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 0a  t->a[i].pExpr;..
107a0 20 20 20 20 61 73 73 65 72 74 28 20 70 21 3d 30      assert( p!=0
107b0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
107c0 70 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f  p->op!=TK_AGG_CO
107d0 4c 55 4d 4e 20 29 3b 20 20 2f 2a 20 41 67 67 20  LUMN );  /* Agg 
107e0 70 72 6f 63 65 73 73 69 6e 67 20 68 61 73 20 6e  processing has n
107f0 6f 74 20 72 75 6e 20 79 65 74 20 2a 2f 0a 20 20  ot run yet */.  
10800 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21    assert( p->op!
10810 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d  =TK_COLUMN || p-
10820 3e 70 54 61 62 21 3d 30 20 29 3b 20 2f 2a 20 43  >pTab!=0 ); /* C
10830 6f 76 65 72 69 6e 67 20 69 64 78 20 6e 6f 74 20  overing idx not 
10840 79 65 74 20 63 6f 64 65 64 20 2a 2f 0a 20 20 20  yet coded */.   
10850 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69   if( pEList->a[i
10860 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ].zName ){.     
10870 20 2f 2a 20 41 6e 20 41 53 20 63 6c 61 75 73 65   /* An AS clause
10880 20 61 6c 77 61 79 73 20 74 61 6b 65 73 20 66 69   always takes fi
10890 72 73 74 20 70 72 69 6f 72 69 74 79 20 2a 2f 0a  rst priority */.
108a0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
108b0 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
108c0 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71  .zName;.      sq
108d0 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
108e0 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
108f0 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
10900 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
10910 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
10920 73 72 63 4e 61 6d 65 20 26 26 20 70 2d 3e 6f 70  srcName && p->op
10930 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
10940 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b       char *zCol;
10950 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
10960 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  = p->iColumn;.  
10970 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 54      pTab = p->pT
10980 61 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ab;.      assert
10990 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ( pTab!=0 );.   
109a0 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
109b0 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
109c0 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ey;.      assert
109d0 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69  ( iCol==-1 || (i
109e0 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
109f0 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
10a00 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
10a10 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
10a20 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20   "rowid";.      
10a30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
10a40 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
10a50 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  [iCol].zName;.  
10a60 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
10a70 66 75 6c 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20  fullName ){.    
10a80 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
10a90 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  = 0;.        zNa
10aa0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
10ab0 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c  ntf(db, "%s.%s",
10ac0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43   pTab->zName, zC
10ad0 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
10ae0 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
10af0 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
10b00 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51  _NAME, zName, SQ
10b10 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  LITE_DYNAMIC);. 
10b20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10b30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
10b40 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
10b50 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43  COLNAME_NAME, zC
10b60 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ol, SQLITE_TRANS
10b70 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20  IENT);.      }. 
10b80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10b90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
10ba0 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70  pEList->a[i].zSp
10bb0 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a 3d  an;.      z = z=
10bc0 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d 50 72 69  =0 ? sqlite3MPri
10bd0 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25  ntf(db, "column%
10be0 64 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69 74  d", i+1) : sqlit
10bf0 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a  e3DbStrDup(db, z
10c00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10c10 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
10c20 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
10c30 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59 4e  E, z, SQLITE_DYN
10c40 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  AMIC);.    }.  }
10c50 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  .  generateColum
10c60 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70  nTypes(pParse, p
10c70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
10c80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
10c90 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
10ca0 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72 65  ist (which is re
10cb0 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f 66  ally the list of
10cc0 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
10cd0 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72 65  that form the re
10ce0 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45  sult set of a SE
10cf0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29 20  LECT statement) 
10d00 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72 69  compute appropri
10d10 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61  ate.** column na
10d20 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20  mes for a table 
10d30 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20  that would hold 
10d40 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
10d50 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63  ist..**.** All c
10d60 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c  olumn names will
10d70 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a   be unique..**.*
10d80 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d  * Only the colum
10d90 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d 70  n names are comp
10da0 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54  uted.  Column.zT
10db0 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c  ype, Column.zCol
10dc0 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20  l,.** and other 
10dd0 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e  fields of Column
10de0 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a   are zeroed..**.
10df0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
10e00 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
10e10 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
10e20 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63  ocation error oc
10e30 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e  curs,.** store N
10e40 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e  ULL in *paCol an
10e50 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e  d 0 in *pnCol an
10e60 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
10e70 4e 4f 4d 45 4d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  NOMEM..**.** The
10e80 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 20   only guarantee 
10e90 74 68 61 74 20 53 51 4c 69 74 65 20 6d 61 6b 65  that SQLite make
10ea0 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e  s about column n
10eb0 61 6d 65 73 20 69 73 20 74 68 61 74 20 69 66 20  ames is that if 
10ec0 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61  the.** column ha
10ed0 73 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20 61  s an AS clause a
10ee0 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 6e 61  ssigning it a na
10ef0 6d 65 2c 20 74 68 61 74 20 77 69 6c 6c 20 62 65  me, that will be
10f00 20 74 68 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a   the name used..
10f10 2a 2a 20 54 68 61 74 20 69 73 20 74 68 65 20 6f  ** That is the o
10f20 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64 20 67  nly documented g
10f30 75 61 72 61 6e 74 65 65 2e 20 20 48 6f 77 65 76  uarantee.  Howev
10f40 65 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61 70  er, countless ap
10f50 70 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65  plications.** de
10f60 76 65 6c 6f 70 65 64 20 6f 76 65 72 20 74 68 65  veloped over the
10f70 20 79 65 61 72 73 20 68 61 76 65 20 6d 61 64 65   years have made
10f80 20 62 61 73 65 6c 65 73 73 20 61 73 73 75 6d 70   baseless assump
10f90 74 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75  tions about colu
10fa0 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20  mn names.** and 
10fb0 77 69 6c 6c 20 62 72 65 61 6b 20 69 66 20 74 68  will break if th
10fc0 6f 73 65 20 61 73 73 75 6d 70 74 69 6f 6e 73 20  ose assumptions 
10fd0 63 68 61 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c  changes.  Hence,
10fe0 20 75 73 65 20 65 78 74 72 65 6d 65 20 63 61 75   use extreme cau
10ff0 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64  tion.** when mod
11000 69 66 79 69 6e 67 20 74 68 69 73 20 72 6f 75 74  ifying this rout
11010 69 6e 65 20 74 6f 20 61 76 6f 69 64 20 62 72 65  ine to avoid bre
11020 61 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a  aking legacy..**
11030 0a 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20 67 65  .** See Also: ge
11040 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
11050 73 28 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  s().*/.int sqlit
11060 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  e3ColumnsFromExp
11070 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
11080 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
11090 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
110a0 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
110b0 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20  t *pEList,      
110c0 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72   /* Expr list fr
110d0 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72 69  om which to deri
110e0 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ve column names 
110f0 2a 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c  */.  i16 *pnCol,
11100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11110 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
11120 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65   of columns here
11130 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70   */.  Column **p
11140 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a  aCol          /*
11150 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20 63   Write the new c
11160 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20  olumn list here 
11170 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
11180 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
11190 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ;   /* Database 
111a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
111b0 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
111c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
111d0 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
111e0 20 20 75 33 32 20 63 6e 74 3b 20 20 20 20 20 20    u32 cnt;      
111f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11200 20 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20   Index added to 
11210 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e  make the name un
11220 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  ique */.  Column
11230 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20   *aCol, *pCol;  
11240 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
11250 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74  ping over result
11260 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
11270 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
11280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11290 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
112a0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
112b0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
112c0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
112d0 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65    /* Column name
112e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
112f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11300 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d    /* Size of nam
11310 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a  e in zName[] */.
11320 20 20 48 61 73 68 20 68 74 3b 20 20 20 20 20 20    Hash ht;      
11330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11340 20 48 61 73 68 20 74 61 62 6c 65 20 6f 66 20 63   Hash table of c
11350 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a  olumn names */..
11360 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69    sqlite3HashIni
11370 74 28 26 68 74 29 3b 0a 20 20 69 66 28 20 70 45  t(&ht);.  if( pE
11380 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c  List ){.    nCol
11390 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
113a0 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c  ;.    aCol = sql
113b0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
113c0 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c  (db, sizeof(aCol
113d0 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20  [0])*nCol);.    
113e0 74 65 73 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d  testcase( aCol==
113f0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f  0 );.    if( nCo
11400 6c 3e 33 32 37 36 37 20 29 20 6e 43 6f 6c 20 3d  l>32767 ) nCol =
11410 20 33 32 37 36 37 3b 0a 20 20 7d 65 6c 73 65 7b   32767;.  }else{
11420 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20  .    nCol = 0;. 
11430 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d     aCol = 0;.  }
11440 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d  .  assert( nCol=
11450 3d 28 69 31 36 29 6e 43 6f 6c 20 29 3b 0a 20 20  =(i16)nCol );.  
11460 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  *pnCol = nCol;. 
11470 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a   *paCol = aCol;.
11480 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c  .  for(i=0, pCol
11490 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26 26  =aCol; i<nCol &&
114a0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
114b0 65 64 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ed; i++, pCol++)
114c0 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20  {.    /* Get an 
114d0 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65  appropriate name
114e0 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a   for the column.
114f0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
11500 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
11510 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29  a[i].zName)!=0 )
11520 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
11530 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  e column contain
11540 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22  s an "AS <name>"
11550 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61   phrase, use <na
11560 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20  me> as the name 
11570 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
11580 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 45 78      Expr *pColEx
11590 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
115a0 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69  SkipCollate(pELi
115b0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
115c0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 43  .      while( pC
115d0 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44  olExpr->op==TK_D
115e0 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OT ){.        pC
115f0 6f 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70  olExpr = pColExp
11600 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
11610 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45     assert( pColE
11620 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
11630 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
11640 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  pColExpr->op!=TK
11650 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
11660 20 20 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70       if( pColExp
11670 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
11680 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
11690 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74  or columns use t
116a0 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e  he column name n
116b0 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ame */.        i
116c0 6e 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78  nt iCol = pColEx
116d0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
116e0 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
116f0 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61   = pColExpr->pTa
11700 62 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  b;.        asser
11710 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
11720 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
11730 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
11740 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 7a  iPKey;.        z
11750 4e 61 6d 65 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f  Name = iCol>=0 ?
11760 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
11770 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64  ].zName : "rowid
11780 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ";.      }else i
11790 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d  f( pColExpr->op=
117a0 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20  =TK_ID ){.      
117b0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
117c0 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c 45  asProperty(pColE
117d0 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
117e0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  ) );.        zNa
117f0 6d 65 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 75  me = pColExpr->u
11800 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d  .zToken;.      }
11810 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
11820 20 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61   Use the origina
11830 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f  l text of the co
11840 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lumn expression 
11850 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20  as its name */. 
11860 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70         zName = p
11870 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  EList->a[i].zSpa
11880 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
11890 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29  .    if( zName )
118a0 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  {.      zName = 
118b0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
118c0 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
118d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 61  }else{.      zNa
118e0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
118f0 6e 74 66 28 64 62 2c 22 63 6f 6c 75 6d 6e 25 64  ntf(db,"column%d
11900 22 2c 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20  ",i+1);.    }.. 
11910 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
11920 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
11930 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74  is unique.  If t
11940 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75  he name is not u
11950 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70  nique,.    ** ap
11960 70 65 6e 64 20 61 6e 20 69 6e 74 65 67 65 72 20  pend an integer 
11970 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74  to the name so t
11980 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75  hat it becomes u
11990 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  nique..    */.  
119a0 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77    cnt = 0;.    w
119b0 68 69 6c 65 28 20 7a 4e 61 6d 65 20 26 26 20 73  hile( zName && s
119c0 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
119d0 68 74 2c 20 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  ht, zName)!=0 ){
119e0 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73  .      nName = s
119f0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
11a00 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Name);.      if(
11a10 20 6e 4e 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20   nName>0 ){.    
11a20 20 20 20 20 66 6f 72 28 6a 3d 6e 4e 61 6d 65 2d      for(j=nName-
11a30 31 3b 20 6a 3e 30 20 26 26 20 73 71 6c 69 74 65  1; j>0 && sqlite
11a40 33 49 73 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6a  3Isdigit(zName[j
11a50 5d 29 3b 20 6a 2d 2d 29 7b 7d 0a 20 20 20 20 20  ]); j--){}.     
11a60 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 6a 5d 3d     if( zName[j]=
11a70 3d 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6a  =':' ) nName = j
11a80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11a90 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
11aa0 50 72 69 6e 74 66 28 64 62 2c 20 22 25 2e 2a 7a  Printf(db, "%.*z
11ab0 3a 25 75 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61  :%u", nName, zNa
11ac0 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20  me, ++cnt);.    
11ad0 20 20 69 66 28 20 63 6e 74 3e 33 20 29 20 73 71    if( cnt>3 ) sq
11ae0 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
11af0 28 73 69 7a 65 6f 66 28 63 6e 74 29 2c 20 26 63  (sizeof(cnt), &c
11b00 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nt);.    }.    p
11b10 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  Col->zName = zNa
11b20 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  me;.    sqlite3C
11b30 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46  olumnPropertiesF
11b40 72 6f 6d 4e 61 6d 65 28 30 2c 20 70 43 6f 6c 29  romName(0, pCol)
11b50 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20  ;.    if( zName 
11b60 26 26 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e  && sqlite3HashIn
11b70 73 65 72 74 28 26 68 74 2c 20 7a 4e 61 6d 65 2c  sert(&ht, zName,
11b80 20 70 43 6f 6c 29 3d 3d 70 43 6f 6c 20 29 7b 0a   pCol)==pCol ){.
11b90 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d        sqlite3Oom
11ba0 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 7d  Fault(db);.    }
11bb0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61  .  }.  sqlite3Ha
11bc0 73 68 43 6c 65 61 72 28 26 68 74 29 3b 0a 20 20  shClear(&ht);.  
11bd0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
11be0 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28  iled ){.    for(
11bf0 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a  j=0; j<i; j++){.
11c00 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
11c10 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e  ree(db, aCol[j].
11c20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
11c30 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
11c40 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a  db, aCol);.    *
11c50 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a  paCol = 0;.    *
11c60 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72  pnCol = 0;.    r
11c70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
11c80 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  EM_BKPT;.  }.  r
11c90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11ca0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79  .}../*.** Add ty
11cb0 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  pe and collation
11cc0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
11cd0 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61  a column list ba
11ce0 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45  sed on.** a SELE
11cf0 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
11d00 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20   .** The column 
11d10 6c 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20  list presumably 
11d20 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74  came from select
11d30 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45  ColumnNamesFromE
11d40 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68  xprList()..** Th
11d50 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61  e column list ha
11d60 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f  s only names, no
11d70 74 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61  t types or colla
11d80 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20  tions.  This.** 
11d90 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72  routine goes thr
11da0 6f 75 67 68 20 61 6e 64 20 61 64 64 73 20 74 68  ough and adds th
11db0 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c  e types and coll
11dc0 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ations..**.** Th
11dd0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69  is routine requi
11de0 72 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64 65  res that all ide
11df0 6e 74 69 66 69 65 72 73 20 69 6e 20 74 68 65 20  ntifiers in the 
11e00 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d  SELECT.** statem
11e10 65 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e  ent be resolved.
11e20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
11e30 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  SelectAddColumnT
11e40 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
11e50 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
11e60 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
11e70 69 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a  ing contexts */.
11e80 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
11e90 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 63          /* Add c
11ea0 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72  olumn type infor
11eb0 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 74  mation to this t
11ec0 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  able */.  Select
11ed0 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20   *pSelect       
11ee0 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20 74  /* SELECT used t
11ef0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65  o determine type
11f00 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  s and collations
11f10 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
11f20 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
11f30 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  b;.  NameContext
11f40 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a   sNC;.  Column *
11f50 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  pCol;.  CollSeq 
11f60 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b  *pColl;.  int i;
11f70 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74  .  Expr *p;.  st
11f80 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
11f90 65 6d 20 2a 61 3b 0a 0a 20 20 61 73 73 65 72 74  em *a;..  assert
11fa0 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a  ( pSelect!=0 );.
11fb0 20 20 61 73 73 65 72 74 28 20 28 70 53 65 6c 65    assert( (pSele
11fc0 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ct->selFlags & S
11fd0 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29  F_Resolved)!=0 )
11fe0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
11ff0 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d  ->nCol==pSelect-
12000 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c  >pEList->nExpr |
12010 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
12020 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ed );.  if( db->
12030 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
12040 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28  eturn;.  memset(
12050 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
12060 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72  sNC));.  sNC.pSr
12070 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  cList = pSelect-
12080 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65  >pSrc;.  a = pSe
12090 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b  lect->pEList->a;
120a0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c  .  for(i=0, pCol
120b0 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70  =pTab->aCol; i<p
120c0 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  Tab->nCol; i++, 
120d0 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  pCol++){.    con
120e0 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a  st char *zType;.
120f0 20 20 20 20 69 6e 74 20 6e 2c 20 6d 3b 0a 20 20      int n, m;.  
12100 20 20 70 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72    p = a[i].pExpr
12110 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  ;.    zType = co
12120 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
12130 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
12140 2f 2a 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d  /* pCol->szEst =
12150 20 2e 2e 2e 20 2f 2f 20 43 6f 6c 75 6d 6e 20 73   ... // Column s
12160 69 7a 65 20 65 73 74 20 66 6f 72 20 53 45 4c 45  ize est for SELE
12170 43 54 20 74 61 62 6c 65 73 20 6e 65 76 65 72 20  CT tables never 
12180 75 73 65 64 20 2a 2f 0a 20 20 20 20 70 43 6f 6c  used */.    pCol
12190 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c  ->affinity = sql
121a0 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
121b0 28 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 79  (p);.    if( zTy
121c0 70 65 20 29 7b 0a 20 20 20 20 20 20 6d 20 3d 20  pe ){.      m = 
121d0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
121e0 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20 6e 20  zType);.      n 
121f0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
12200 30 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  0(pCol->zName);.
12210 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d        pCol->zNam
12220 65 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  e = sqlite3DbRea
12230 6c 6c 6f 63 4f 72 46 72 65 65 28 64 62 2c 20 70  llocOrFree(db, p
12240 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b 6d 2b  Col->zName, n+m+
12250 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  2);.      if( pC
12260 6f 6c 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  ol->zName ){.   
12270 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 43 6f       memcpy(&pCo
12280 6c 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c 20 7a  l->zName[n+1], z
12290 54 79 70 65 2c 20 6d 2b 31 29 3b 0a 20 20 20 20  Type, m+1);.    
122a0 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
122b0 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41  gs |= COLFLAG_HA
122c0 53 54 59 50 45 3b 0a 20 20 20 20 20 20 7d 0a 20  STYPE;.      }. 
122d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 6f     }.    if( pCo
122e0 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20 29  l->affinity==0 )
122f0 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
12300 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  = SQLITE_AFF_BLO
12310 42 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  B;.    pColl = s
12320 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
12330 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  q(pParse, p);.  
12340 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70    if( pColl && p
12350 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20 29 7b  Col->zColl==0 ){
12360 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f  .      pCol->zCo
12370 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ll = sqlite3DbSt
12380 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e  rDup(db, pColl->
12390 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
123a0 7d 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52  }.  pTab->szTabR
123b0 6f 77 20 3d 20 31 3b 20 2f 2a 20 41 6e 79 20 6e  ow = 1; /* Any n
123c0 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 77 6f  on-zero value wo
123d0 72 6b 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rks */.}../*.** 
123e0 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73  Given a SELECT s
123f0 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61  tatement, genera
12400 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  te a Table struc
12410 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
12420 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  bes.** the resul
12430 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45  t set of that SE
12440 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  LECT..*/.Table *
12450 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
12460 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a  OfSelect(Parse *
12470 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
12480 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c  pSelect){.  Tabl
12490 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
124a0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
124b0 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  >db;.  int saved
124c0 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46  Flags;..  savedF
124d0 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73  lags = db->flags
124e0 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
124f0 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c   ~SQLITE_FullCol
12500 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61  Names;.  db->fla
12510 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f  gs |= SQLITE_Sho
12520 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71  rtColNames;.  sq
12530 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
12540 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
12550 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73   0);.  if( pPars
12560 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
12570 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65   0;.  while( pSe
12580 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  lect->pPrior ) p
12590 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
125a0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e  ->pPrior;.  db->
125b0 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61  flags = savedFla
125c0 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  gs;.  pTab = sql
125d0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
125e0 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
125f0 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  e) );.  if( pTab
12600 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
12610 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68  n 0;.  }.  /* Th
12620 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  e sqlite3ResultS
12630 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20  etOfSelect() is 
12640 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74  only used n cont
12650 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61  exts where looka
12660 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73  side.  ** is dis
12670 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  abled */.  asser
12680 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  t( db->lookaside
12690 2e 62 44 69 73 61 62 6c 65 20 29 3b 0a 20 20 70  .bDisable );.  p
126a0 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31  Tab->nTabRef = 1
126b0 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20  ;.  pTab->zName 
126c0 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f  = 0;.  pTab->nRo
126d0 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61  wLogEst = 200; a
126e0 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69  ssert( 200==sqli
126f0 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37  te3LogEst(104857
12700 36 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  6) );.  sqlite3C
12710 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
12720 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  st(pParse, pSele
12730 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61  ct->pEList, &pTa
12740 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e  b->nCol, &pTab->
12750 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  aCol);.  sqlite3
12760 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  SelectAddColumnT
12770 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
12780 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53  pParse, pTab, pS
12790 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e  elect);.  pTab->
127a0 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66  iPKey = -1;.  if
127b0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
127c0 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
127d0 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
127e0 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75   pTab);.    retu
127f0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
12800 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
12810 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72  * Get a VDBE for
12820 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65   the given parse
12830 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61  r context.  Crea
12840 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
12850 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66  necessary..** If
12860 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
12870 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
12880 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67  d leave a messag
12890 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
128a0 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74  Vdbe *sqlite3Get
128b0 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72  Vdbe(Parse *pPar
128c0 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  se){.  if( pPars
128d0 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20  e->pVdbe ){.    
128e0 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 70  return pParse->p
128f0 56 64 62 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Vdbe;.  }.  if( 
12900 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65  pParse->pTopleve
12910 6c 3d 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d  l==0.   && Optim
12920 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70  izationEnabled(p
12930 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45  Parse->db,SQLITE
12940 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29  _FactorOutConst)
12950 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  .  ){.    pParse
12960 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20  ->okConstFactor 
12970 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
12980 6e 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65  n sqlite3VdbeCre
12990 61 74 65 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a  ate(pParse);.}..
129a0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
129b0 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  he iLimit and iO
129c0 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20  ffset fields of 
129d0 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64  the SELECT based
129e0 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69   on the.** pLimi
129f0 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  t expressions.  
12a00 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e  pLimit->pLeft an
12a10 64 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74  d pLimit->pRight
12a20 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73   hold the expres
12a30 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70  sions.** that ap
12a40 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67  pear in the orig
12a50 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  inal SQL stateme
12a60 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d  nt after the LIM
12a70 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a  IT and OFFSET.**
12a80 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e   keywords.  Or N
12a90 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79  ULL if those key
12aa0 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65  words are omitte
12ab0 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  d. iLimit and iO
12ac0 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68  ffset .** are th
12ad0 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79  e integer memory
12ae0 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
12af0 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75  s for counters u
12b00 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a  sed to compute .
12b10 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64  ** the limit and
12b20 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65   offset.  If the
12b30 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61  re is no limit a
12b40 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68  nd/or offset, th
12b50 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e  en .** iLimit an
12b60 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65  d iOffset are ne
12b70 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  gative..**.** Th
12b80 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67  is routine chang
12b90 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  es the values of
12ba0 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
12bb0 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61  set only if.** a
12bc0 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74   limit or offset
12bd0 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
12be0 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e 64  Limit->pLeft and
12bf0 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 2e   pLimit->pRight.
12c00 20 20 69 4c 69 6d 69 74 0a 2a 2a 20 61 6e 64 20    iLimit.** and 
12c10 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68  iOffset should h
12c20 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20  ave been preset 
12c30 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64  to appropriate d
12c40 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a  efault values (z
12c50 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  ero).** prior to
12c60 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
12c70 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
12c80 20 69 4f 66 66 73 65 74 20 72 65 67 69 73 74 65   iOffset registe
12c90 72 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29  r (if it exists)
12ca0 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
12cb0 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  to the value.** 
12cc0 6f 66 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20  of the OFFSET.  
12cd0 54 68 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73  The iLimit regis
12ce0 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ter is initializ
12cf0 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65  ed to LIMIT.  Re
12d00 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65  gister.** iOffse
12d10 74 2b 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  t+1 is initializ
12d20 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53  ed to LIMIT+OFFS
12d30 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69  ET..**.** Only i
12d40 66 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21  f pLimit->pLeft!
12d50 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20  =0 do the limit 
12d60 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a  registers get.**
12d70 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65   redefined.  The
12d80 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
12d90 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72  tor uses this pr
12da0 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a  operty to force.
12db0 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20  ** the reuse of 
12dc0 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61  the same limit a
12dd0 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74  nd offset regist
12de0 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69  ers across multi
12df0 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  ple.** SELECT st
12e00 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
12e10 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65  tic void compute
12e20 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50  LimitRegisters(P
12e30 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
12e40 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72  lect *p, int iBr
12e50 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  eak){.  Vdbe *v 
12e60 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69  = 0;.  int iLimi
12e70 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66  t = 0;.  int iOf
12e80 66 73 65 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  fset;.  int n;. 
12e90 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20   Expr *pLimit = 
12ea0 70 2d 3e 70 4c 69 6d 69 74 3b 0a 0a 20 20 69 66  p->pLimit;..  if
12eb0 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65  ( p->iLimit ) re
12ec0 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  turn;..  /* .  *
12ed0 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77  * "LIMIT -1" alw
12ee0 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f  ays shows all ro
12ef0 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f  ws.  There is so
12f00 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65  me.  ** controve
12f10 72 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74  rsy about what t
12f20 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76  he correct behav
12f30 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20  ior should be.. 
12f40 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   ** The current 
12f50 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
12f60 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54  nterprets "LIMIT
12f70 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a   0" to mean.  **
12f80 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20   no rows..  */. 
12f90 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
12fa0 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
12fb0 20 20 69 66 28 20 70 4c 69 6d 69 74 20 29 7b 0a    if( pLimit ){.
12fc0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 6d      assert( pLim
12fd0 69 74 2d 3e 6f 70 3d 3d 54 4b 5f 4c 49 4d 49 54  it->op==TK_LIMIT
12fe0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12ff0 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21 3d 30  pLimit->pLeft!=0
13000 20 29 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69   );.    p->iLimi
13010 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70  t = iLimit = ++p
13020 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
13030 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
13040 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
13050 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
13060 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
13070 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 4c  ExprIsInteger(pL
13080 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 29  imit->pLeft, &n)
13090 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
130a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
130b0 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c  P_Integer, n, iL
130c0 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62  imit);.      Vdb
130d0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
130e0 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  MIT counter"));.
130f0 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29        if( n==0 )
13100 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13110 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 42 72  3VdbeGoto(v, iBr
13120 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  eak);.      }els
13130 65 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d  e if( n>=0 && p-
13140 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 73 71 6c 69  >nSelectRow>sqli
13150 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e  te3LogEst((u64)n
13160 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ) ){.        p->
13170 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
13180 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29  ite3LogEst((u64)
13190 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73  n);.        p->s
131a0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 46 69  elFlags |= SF_Fi
131b0 78 65 64 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  xedLimit;.      
131c0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
131d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
131e0 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69 6d 69  de(pParse, pLimi
131f0 74 2d 3e 70 4c 65 66 74 2c 20 69 4c 69 6d 69 74  t->pLeft, iLimit
13200 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13210 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
13220 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d  _MustBeInt, iLim
13230 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  it); VdbeCoverag
13240 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
13250 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
13260 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  IT counter"));. 
13270 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13280 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e  AddOp2(v, OP_IfN
13290 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65  ot, iLimit, iBre
132a0 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
132b0 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e(v);.    }.    
132c0 69 66 28 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67  if( pLimit->pRig
132d0 68 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  ht ){.      p->i
132e0 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74  Offset = iOffset
132f0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
13300 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  m;.      pParse-
13310 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c  >nMem++;   /* Al
13320 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61 20  locate an extra 
13330 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d  register for lim
13340 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20  it+offset */.   
13350 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
13360 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69 6d 69  de(pParse, pLimi
13370 74 2d 3e 70 52 69 67 68 74 2c 20 69 4f 66 66 73  t->pRight, iOffs
13380 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
13390 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
133a0 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f  OP_MustBeInt, iO
133b0 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65  ffset); VdbeCove
133c0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
133d0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
133e0 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29  OFFSET counter")
133f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13400 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
13410 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 20 69 4c  _OffsetLimit, iL
13420 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2b 31 2c  imit, iOffset+1,
13430 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20   iOffset);.     
13440 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
13450 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29   "LIMIT+OFFSET")
13460 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
13470 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13480 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
13490 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ECT./*.** Return
134a0 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
134b0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
134c0 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c  nce for the iCol
134d0 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a  -th column of.**
134e0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
134f0 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  for the compound
13500 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e  -select statemen
13510 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e  t "p".  Return N
13520 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f  ULL if.** the co
13530 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61  lumn has no defa
13540 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ult collating se
13550 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  quence..**.** Th
13560 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
13570 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d  ence for the com
13580 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20  pound select is 
13590 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a  taken from the.*
135a0 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  * left-most term
135b0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 74   of the select t
135c0 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  hat has a collat
135d0 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f  ing sequence..*/
135e0 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20  .static CollSeq 
135f0 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c  *multiSelectColl
13600 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
13610 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
13620 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53  t iCol){.  CollS
13630 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20  eq *pRet;.  if( 
13640 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
13650 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c   pRet = multiSel
13660 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
13670 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43  e, p->pPrior, iC
13680 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ol);.  }else{.  
13690 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a    pRet = 0;.  }.
136a0 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
136b0 30 20 29 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20 6d  0 );.  /* iCol m
136c0 75 73 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ust be less than
136d0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
136e0 72 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61 6e  r.  Otherwise an
136f0 20 65 72 72 6f 72 20 77 6f 75 6c 64 0a 20 20 2a   error would.  *
13700 2a 20 68 61 76 65 20 62 65 65 6e 20 74 68 72 6f  * have been thro
13710 77 6e 20 64 75 72 69 6e 67 20 6e 61 6d 65 20 72  wn during name r
13720 65 73 6f 6c 75 74 69 6f 6e 20 61 6e 64 20 77 65  esolution and we
13730 20 77 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20   would not have 
13740 67 6f 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73  gotten.  ** this
13750 20 66 61 72 20 2a 2f 0a 20 20 69 66 28 20 70 52   far */.  if( pR
13760 65 74 3d 3d 30 20 26 26 20 41 4c 57 41 59 53 28  et==0 && ALWAYS(
13770 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e  iCol<p->pEList->
13780 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 70 52  nExpr) ){.    pR
13790 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
137a0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
137b0 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  p->pEList->a[iCo
137c0 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20  l].pExpr);.  }. 
137d0 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
137e0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63  ./*.** The selec
137f0 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
13800 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
13810 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
13820 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a  compound SELECT.
13830 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52  ** with an ORDER
13840 20 42 59 20 63 6c 61 75 73 65 2e 20 54 68 69 73   BY clause. This
13850 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
13860 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20  tes and returns 
13870 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72  a KeyInfo.** str
13880 75 63 74 75 72 65 20 73 75 69 74 61 62 6c 65 20  ucture suitable 
13890 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67  for implementing
138a0 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a   the ORDER BY..*
138b0 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
138c0 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ld the KeyInfo s
138d0 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61  tructure is obta
138e0 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
138f0 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  . The calling.**
13900 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
13910 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73  ponsible for ens
13920 75 72 69 6e 67 20 74 68 61 74 20 74 68 69 73 20  uring that this 
13930 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65  structure is eve
13940 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64  ntually.** freed
13950 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49  ..*/.static KeyI
13960 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74  nfo *multiSelect
13970 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 50  OrderByKeyInfo(P
13980 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
13990 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78  lect *p, int nEx
139a0 74 72 61 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  tra){.  ExprList
139b0 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e   *pOrderBy = p->
139c0 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20  pOrderBy;.  int 
139d0 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  nOrderBy = p->pO
139e0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
139f0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13a00 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79  Parse->db;.  Key
13a10 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c  Info *pRet = sql
13a20 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
13a30 28 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45  (db, nOrderBy+nE
13a40 78 74 72 61 2c 20 31 29 3b 0a 20 20 69 66 28 20  xtra, 1);.  if( 
13a50 70 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  pRet ){.    int 
13a60 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
13a70 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
13a80 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  {.      struct E
13a90 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
13aa0 74 65 6d 20 3d 20 26 70 4f 72 64 65 72 42 79 2d  tem = &pOrderBy-
13ab0 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78 70  >a[i];.      Exp
13ac0 72 20 2a 70 54 65 72 6d 20 3d 20 70 49 74 65 6d  r *pTerm = pItem
13ad0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 43  ->pExpr;.      C
13ae0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a  ollSeq *pColl;..
13af0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
13b00 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
13b10 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ate ){.        p
13b20 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
13b30 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
13b40 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
13b50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
13b60 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
13b70 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
13b80 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  , p, pItem->u.x.
13b90 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a  iOrderByCol-1);.
13ba0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
13bb0 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64  l==0 ) pColl = d
13bc0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
13bd0 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
13be0 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20  a[i].pExpr =.   
13bf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
13c00 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69  prAddCollateStri
13c10 6e 67 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  ng(pParse, pTerm
13c20 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
13c30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
13c40 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
13c50 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
13c60 28 70 52 65 74 29 20 29 3b 0a 20 20 20 20 20 20  (pRet) );.      
13c70 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  pRet->aColl[i] =
13c80 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52   pColl;.      pR
13c90 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  et->aSortOrder[i
13ca0 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ] = pOrderBy->a[
13cb0 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
13cc0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
13cd0 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64  n pRet;.}..#ifnd
13ce0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
13cf0 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  TE./*.** This ro
13d00 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
13d10 56 44 42 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d  VDBE code to com
13d20 70 75 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  pute the content
13d30 20 6f 66 20 61 20 57 49 54 48 20 52 45 43 55 52   of a WITH RECUR
13d40 53 49 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66  SIVE.** query of
13d50 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
13d60 20 20 20 3c 72 65 63 75 72 73 69 76 65 2d 74 61     <recursive-ta
13d70 62 6c 65 3e 20 41 53 20 28 3c 73 65 74 75 70 2d  ble> AS (<setup-
13d80 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c  query> UNION [AL
13d90 4c 5d 20 3c 72 65 63 75 72 73 69 76 65 2d 71 75  L] <recursive-qu
13da0 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20  ery>).**        
13db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13dc0 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20   \___________/  
13dd0 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
13de0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20  ___________/.** 
13df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e00 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
13e10 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ior             
13e20 20 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a           p.**.**
13e30 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 65 78 61  .** There is exa
13e40 63 74 6c 79 20 6f 6e 65 20 72 65 66 65 72 65 6e  ctly one referen
13e50 63 65 20 74 6f 20 74 68 65 20 72 65 63 75 72 73  ce to the recurs
13e60 69 76 65 2d 74 61 62 6c 65 20 69 6e 20 74 68 65  ive-table in the
13e70 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20   FROM clause.** 
13e80 6f 66 20 72 65 63 75 72 73 69 76 65 2d 71 75 65  of recursive-que
13e90 72 79 2c 20 6d 61 72 6b 65 64 20 77 69 74 68 20  ry, marked with 
13ea0 74 68 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d  the SrcList->a[]
13eb0 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  .fg.isRecursive 
13ec0 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  flag..**.** The 
13ed0 73 65 74 75 70 2d 71 75 65 72 79 20 72 75 6e 73  setup-query runs
13ee0 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72 61 74   once to generat
13ef0 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73 65 74  e an initial set
13f00 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 67 6f   of rows that go
13f10 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65 75 65  .** into a Queue
13f20 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20 61 72   table.  Rows ar
13f30 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
13f40 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
13f50 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20   one by.** one. 
13f60 20 45 61 63 68 20 72 6f 77 20 65 78 74 72 61 63   Each row extrac
13f70 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 20 69  ted from Queue i
13f80 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73  s output to pDes
13f90 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73 69 6e  t.  Then the sin
13fa0 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74 65 64  gle.** extracted
13fb0 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68 65   row (now in the
13fc0 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c 65 29   iCurrent table)
13fd0 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e   becomes the con
13fe0 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72  tent of the.** r
13ff0 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 66  ecursive-table f
14000 6f 72 20 61 20 72 65 63 75 72 73 69 76 65 2d 71  or a recursive-q
14010 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65 20 6f  uery run.  The o
14020 75 74 70 75 74 20 6f 66 20 74 68 65 20 72 65 63  utput of the rec
14030 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20  ursive-query.** 
14040 69 73 20 61 64 64 65 64 20 62 61 63 6b 20 69 6e  is added back in
14050 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61 62  to the Queue tab
14060 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68 65  le.  Then anothe
14070 72 20 72 6f 77 20 69 73 20 65 78 74 72 61 63 74  r row is extract
14080 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a  ed from Queue.**
14090 20 61 6e 64 20 74 68 65 20 69 74 65 72 61 74 69   and the iterati
140a0 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74  on continues unt
140b0 69 6c 20 74 68 65 20 51 75 65 75 65 20 74 61 62  il the Queue tab
140c0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a  le is empty..**.
140d0 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 6f 75  ** If the compou
140e0 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61 74 6f  nd query operato
140f0 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20  r is UNION then 
14100 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77  no duplicate row
14110 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e  s are ever.** in
14120 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20  serted into the 
14130 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68  Queue table.  Th
14140 65 20 69 44 69 73 74 69 6e 63 74 20 74 61 62 6c  e iDistinct tabl
14150 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79 20 6f  e keeps a copy o
14160 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68  f all rows.** th
14170 61 74 20 68 61 76 65 20 65 76 65 72 20 62 65 65  at have ever bee
14180 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  n inserted into 
14190 51 75 65 75 65 20 61 6e 64 20 63 61 75 73 65 73  Queue and causes
141a0 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f 20 62   duplicates to b
141b0 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20  e.** discarded. 
141c0 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   If the operator
141d0 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74   is UNION ALL, t
141e0 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73 20 61  hen duplicates a
141f0 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a  re allowed..** .
14200 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  ** If the query 
14210 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42 59 2c  has an ORDER BY,
14220 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20 69 6e   then entries in
14230 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
14240 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20   are kept in.** 
14250 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 20 61  ORDER BY order a
14260 6e 64 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  nd the first ent
14270 72 79 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ry is extracted 
14280 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65 2e 20  for each cycle. 
14290 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f   Without.** an O
142a0 52 44 45 52 20 42 59 2c 20 74 68 65 20 51 75 65  RDER BY, the Que
142b0 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75 73 74  ue table is just
142c0 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49   a FIFO..**.** I
142d0 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  f a LIMIT clause
142e0 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20 74 68   is provided, th
142f0 65 6e 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e  en the iteration
14300 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c 49 4d   stops after LIM
14310 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20  IT rows.** have 
14320 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f 20 70  been output to p
14330 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f  Dest.  A LIMIT o
14340 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20  f zero means to 
14350 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73 20 61  output no rows a
14360 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65  nd a.** negative
14370 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20   LIMIT means to 
14380 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e  output all rows.
14390 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c    If there is al
143a0 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61  so an OFFSET cla
143b0 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f  use.** with a po
143c0 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20 74 68  sitive value, th
143d0 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f 46 46  en the first OFF
143e0 53 45 54 20 6f 75 74 70 75 74 73 20 61 72 65 20  SET outputs are 
143f0 64 69 73 63 61 72 64 65 64 20 72 61 74 68 65 72  discarded rather
14400 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67 20 73  .** than being s
14410 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54  ent to pDest.  T
14420 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64  he LIMIT count d
14430 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e  oes not begin un
14440 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53 45 54  til after OFFSET
14450 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20 62 65  .** rows have be
14460 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73  en skipped..*/.s
14470 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
14480 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76 65  ateWithRecursive
14490 51 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a  Query(.  Parse *
144a0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
144b0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
144c0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
144d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
144e0 54 68 65 20 72 65 63 75 72 73 69 76 65 20 53 45  The recursive SE
144f0 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64 65 64  LECT to be coded
14500 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
14510 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
14520 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
14530 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
14540 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
14550 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20  rc = p->pSrc;   
14560 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
14570 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72 65 63  lause of the rec
14580 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a  ursive query */.
14590 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e    int nCol = p->
145a0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20  pEList->nExpr;  
145b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
145c0 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63 75  umns in the recu
145d0 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20  rsive table */. 
145e0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
145f0 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f  e->pVdbe;      /
14600 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
14610 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63  tatement under c
14620 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
14630 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75 70 20   Select *pSetup 
14640 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f  = p->pPrior;   /
14650 2a 20 54 68 65 20 73 65 74 75 70 20 71 75 65 72  * The setup quer
14660 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  y */.  int addrT
14670 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
14680 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
14690 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  he loop */.  int
146a0 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42   addrCont, addrB
146b0 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f  reak;      /* CO
146c0 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45 41 4b  NTINUE and BREAK
146d0 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a 20 20   addresses */.  
146e0 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30  int iCurrent = 0
146f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
14700 20 54 68 65 20 43 75 72 72 65 6e 74 20 74 61 62   The Current tab
14710 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43  le */.  int regC
14720 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20  urrent;         
14730 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
14740 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e  r holding Curren
14750 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
14760 20 69 51 75 65 75 65 3b 20 20 20 20 20 20 20 20   iQueue;        
14770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
14780 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f  e Queue table */
14790 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e 63 74  .  int iDistinct
147a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
147b0 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20 75 6e   /* To ensure un
147c0 69 71 75 65 20 72 65 73 75 6c 74 73 20 69 66 20  ique results if 
147d0 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65  UNION */.  int e
147e0 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b  Dest = SRT_Fifo;
147f0 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
14800 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75 65 75  to write to Queu
14810 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  e */.  SelectDes
14820 74 20 64 65 73 74 51 75 65 75 65 3b 20 20 20 20  t destQueue;    
14830 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 44 65       /* SelectDe
14840 73 74 20 74 61 72 67 65 74 74 69 6e 67 20 74 68  st targetting th
14850 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f  e Queue table */
14860 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
14870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14880 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
14890 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
148a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148b0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
148c0 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  de */.  ExprList
148d0 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20   *pOrderBy;     
148e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44        /* The ORD
148f0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
14900 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20    Expr *pLimit; 
14910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14920 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54 20 61  /* Saved LIMIT a
14930 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69  nd OFFSET */.  i
14940 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72 65 67  nt regLimit, reg
14950 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  Offset;      /* 
14960 52 65 67 69 73 74 65 72 73 20 75 73 65 64 20 62  Registers used b
14970 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  y LIMIT and OFFS
14980 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61  ET */..  /* Obta
14990 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  in authorization
149a0 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72 73 69   to do a recursi
149b0 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 66  ve query */.  if
149c0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
149d0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
149e0 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30 2c 20  E_RECURSIVE, 0, 
149f0 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
14a00 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68  .  /* Process th
14a10 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  e LIMIT and OFFS
14a20 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66 20 74  ET clauses, if t
14a30 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 61  hey exist */.  a
14a40 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ddrBreak = sqlit
14a50 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
14a60 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74  v);.  p->nSelect
14a70 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34  Row = 320;  /* 4
14a80 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f   billion rows */
14a90 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
14aa0 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
14ab0 20 70 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a   p, addrBreak);.
14ac0 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
14ad0 69 6d 69 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74  imit;.  regLimit
14ae0 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20   = p->iLimit;.  
14af0 72 65 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69  regOffset = p->i
14b00 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69  Offset;.  p->pLi
14b10 6d 69 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c  mit = 0;.  p->iL
14b20 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  imit = p->iOffse
14b30 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72 42  t = 0;.  pOrderB
14b40 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
14b50 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
14b60 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
14b70 6f 66 20 74 68 65 20 43 75 72 72 65 6e 74 20 74  of the Current t
14b80 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  able */.  for(i=
14b90 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 53 72 63  0; ALWAYS(i<pSrc
14ba0 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a 20  ->nSrc); i++){. 
14bb0 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69     if( pSrc->a[i
14bc0 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65  ].fg.isRecursive
14bd0 20 29 7b 0a 20 20 20 20 20 20 69 43 75 72 72 65   ){.      iCurre
14be0 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e  nt = pSrc->a[i].
14bf0 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 62  iCursor;.      b
14c00 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
14c10 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63  .  /* Allocate c
14c20 75 72 73 6f 72 73 20 6e 75 6d 62 65 72 73 20 66  ursors numbers f
14c30 6f 72 20 51 75 65 75 65 20 61 6e 64 20 44 69 73  or Queue and Dis
14c40 74 69 6e 63 74 2e 20 20 54 68 65 20 63 75 72 73  tinct.  The curs
14c50 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20  or number for.  
14c60 2a 2a 20 74 68 65 20 44 69 73 74 69 6e 63 74 20  ** the Distinct 
14c70 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 65 78  table must be ex
14c80 61 63 74 6c 79 20 6f 6e 65 20 67 72 65 61 74 65  actly one greate
14c90 72 20 74 68 61 6e 20 51 75 65 75 65 20 69 6e 20  r than Queue in 
14ca0 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  order.  ** for t
14cb0 68 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 20  he SRT_DistFifo 
14cc0 61 6e 64 20 53 52 54 5f 44 69 73 74 51 75 65 75  and SRT_DistQueu
14cd0 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 20 74  e destinations t
14ce0 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51 75  o work. */.  iQu
14cf0 65 75 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  eue = pParse->nT
14d00 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6f  ab++;.  if( p->o
14d10 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
14d20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65     eDest = pOrde
14d30 72 42 79 20 3f 20 53 52 54 5f 44 69 73 74 51 75  rBy ? SRT_DistQu
14d40 65 75 65 20 3a 20 53 52 54 5f 44 69 73 74 46 69  eue : SRT_DistFi
14d50 66 6f 3b 0a 20 20 20 20 69 44 69 73 74 69 6e 63  fo;.    iDistinc
14d60 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
14d70 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
14d80 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42   eDest = pOrderB
14d90 79 20 3f 20 53 52 54 5f 51 75 65 75 65 20 3a 20  y ? SRT_Queue : 
14da0 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20 20  SRT_Fifo;.  }.  
14db0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
14dc0 74 49 6e 69 74 28 26 64 65 73 74 51 75 65 75 65  tInit(&destQueue
14dd0 2c 20 65 44 65 73 74 2c 20 69 51 75 65 75 65 29  , eDest, iQueue)
14de0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
14df0 20 63 75 72 73 6f 72 73 20 66 6f 72 20 43 75 72   cursors for Cur
14e00 72 65 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e 64  rent, Queue, and
14e10 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20 20   Distinct. */.  
14e20 72 65 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b 70  regCurrent = ++p
14e30 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73  Parse->nMem;.  s
14e40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
14e50 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
14e60 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20 72 65 67  o, iCurrent, reg
14e70 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a  Current, nCol);.
14e80 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
14e90 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  {.    KeyInfo *p
14ea0 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69 53  KeyInfo = multiS
14eb0 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49  electOrderByKeyI
14ec0 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31  nfo(pParse, p, 1
14ed0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14ee0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
14ef0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51  penEphemeral, iQ
14f00 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  ueue, pOrderBy->
14f10 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20  nExpr+2, 0,.    
14f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f30 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
14f40 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
14f50 20 20 20 20 64 65 73 74 51 75 65 75 65 2e 70 4f      destQueue.pO
14f60 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
14f70 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
14f80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14f90 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
14fa0 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 6e  meral, iQueue, n
14fb0 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62 65  Col);.  }.  Vdbe
14fc0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75 65  Comment((v, "Que
14fd0 75 65 20 74 61 62 6c 65 22 29 29 3b 0a 20 20 69  ue table"));.  i
14fe0 66 28 20 69 44 69 73 74 69 6e 63 74 20 29 7b 0a  f( iDistinct ){.
14ff0 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
15000 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  phm[0] = sqlite3
15010 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15020 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
15030 69 44 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20  iDistinct, 0);. 
15040 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c     p->selFlags |
15050 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72  = SF_UsesEphemer
15060 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65  al;.  }..  /* De
15070 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42  tach the ORDER B
15080 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68  Y clause from th
15090 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  e compound SELEC
150a0 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72  T */.  p->pOrder
150b0 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 74  By = 0;..  /* St
150c0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
150d0 6f 66 20 74 68 65 20 73 65 74 75 70 2d 71 75 65  of the setup-que
150e0 72 79 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f 0a  ry in Queue. */.
150f0 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20    pSetup->pNext 
15100 3d 20 30 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75  = 0;.  ExplainQu
15110 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
15120 20 31 2c 20 22 53 45 54 55 50 22 29 29 3b 0a 20   1, "SETUP"));. 
15130 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
15140 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 74  ect(pParse, pSet
15150 75 70 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b  up, &destQueue);
15160 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74  .  pSetup->pNext
15170 20 3d 20 70 3b 0a 20 20 69 66 28 20 72 63 20 29   = p;.  if( rc )
15180 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72 65 63   goto end_of_rec
15190 75 72 73 69 76 65 5f 71 75 65 72 79 3b 0a 0a 20  ursive_query;.. 
151a0 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78   /* Find the nex
151b0 74 20 72 6f 77 20 69 6e 20 74 68 65 20 51 75 65  t row in the Que
151c0 75 65 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68  ue and output th
151d0 61 74 20 72 6f 77 20 2a 2f 0a 20 20 61 64 64 72  at row */.  addr
151e0 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
151f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
15200 77 69 6e 64 2c 20 69 51 75 65 75 65 2c 20 61 64  wind, iQueue, ad
15210 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f  drBreak); VdbeCo
15220 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a  verage(v);..  /*
15230 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 6e 65   Transfer the ne
15240 78 74 20 72 6f 77 20 69 6e 20 51 75 65 75 65 20  xt row in Queue 
15250 6f 76 65 72 20 74 6f 20 43 75 72 72 65 6e 74 20  over to Current 
15260 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
15270 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
15280 6c 52 6f 77 2c 20 69 43 75 72 72 65 6e 74 29 3b  lRow, iCurrent);
15290 20 2f 2a 20 54 6f 20 72 65 73 65 74 20 63 6f 6c   /* To reset col
152a0 75 6d 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 69  umn cache */.  i
152b0 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
152c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
152d0 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
152e0 6e 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65  n, iQueue, pOrde
152f0 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65  rBy->nExpr+1, re
15300 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 65 6c  gCurrent);.  }el
15310 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
15320 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15330 52 6f 77 44 61 74 61 2c 20 69 51 75 65 75 65 2c  RowData, iQueue,
15340 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20   regCurrent);.  
15350 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
15360 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65  ddOp1(v, OP_Dele
15370 74 65 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20  te, iQueue);..  
15380 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 73 69  /* Output the si
15390 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72  ngle row in Curr
153a0 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 43 6f 6e  ent */.  addrCon
153b0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
153c0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63  akeLabel(v);.  c
153d0 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 72 65 67  odeOffset(v, reg
153e0 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74  Offset, addrCont
153f0 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72  );.  selectInner
15400 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
15410 69 43 75 72 72 65 6e 74 2c 0a 20 20 20 20 20 20  iCurrent,.      
15420 30 2c 20 30 2c 20 70 44 65 73 74 2c 20 61 64 64  0, 0, pDest, add
15430 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b  rCont, addrBreak
15440 29 3b 0a 20 20 69 66 28 20 72 65 67 4c 69 6d 69  );.  if( regLimi
15450 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
15460 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15470 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 72  _DecrJumpZero, r
15480 65 67 4c 69 6d 69 74 2c 20 61 64 64 72 42 72 65  egLimit, addrBre
15490 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ak);.    VdbeCov
154a0 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20  erage(v);.  }.  
154b0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
154c0 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43  veLabel(v, addrC
154d0 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45 78 65 63  ont);..  /* Exec
154e0 75 74 65 20 74 68 65 20 72 65 63 75 72 73 69 76  ute the recursiv
154f0 65 20 53 45 4c 45 43 54 20 74 61 6b 69 6e 67 20  e SELECT taking 
15500 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69  the single row i
15510 6e 20 43 75 72 72 65 6e 74 20 61 73 0a 20 20 2a  n Current as.  *
15520 2a 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  * the value for 
15530 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 74 61  the recursive-ta
15540 62 6c 65 2e 20 53 74 6f 72 65 20 74 68 65 20 72  ble. Store the r
15550 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 51 75  esults in the Qu
15560 65 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eue..  */.  if( 
15570 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
15580 5f 41 67 67 72 65 67 61 74 65 20 29 7b 0a 20 20  _Aggregate ){.  
15590 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
155a0 67 28 70 50 61 72 73 65 2c 20 22 72 65 63 75 72  g(pParse, "recur
155b0 73 69 76 65 20 61 67 67 72 65 67 61 74 65 20 71  sive aggregate q
155c0 75 65 72 69 65 73 20 6e 6f 74 20 73 75 70 70 6f  ueries not suppo
155d0 72 74 65 64 22 29 3b 0a 20 20 7d 65 6c 73 65 7b  rted");.  }else{
155e0 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
155f0 20 30 3b 0a 20 20 20 20 45 78 70 6c 61 69 6e 51   0;.    ExplainQ
15600 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
15610 2c 20 31 2c 20 22 52 45 43 55 52 53 49 56 45 20  , 1, "RECURSIVE 
15620 53 54 45 50 22 29 29 3b 0a 20 20 20 20 73 71 6c  STEP"));.    sql
15630 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
15640 65 2c 20 70 2c 20 26 64 65 73 74 51 75 65 75 65  e, p, &destQueue
15650 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
15660 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20  ->pPrior==0 );. 
15670 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
15680 53 65 74 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Setup;.  }..  /*
15690 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20 74 68   Keep running th
156a0 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68 65  e loop until the
156b0 20 51 75 65 75 65 20 69 73 20 65 6d 70 74 79 20   Queue is empty 
156c0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
156d0 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70 29  Goto(v, addrTop)
156e0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
156f0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
15700 64 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64 5f  ddrBreak);..end_
15710 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65  of_recursive_que
15720 72 79 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70  ry:.  sqlite3Exp
15730 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  rListDelete(pPar
15740 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65  se->db, p->pOrde
15750 72 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72 64 65  rBy);.  p->pOrde
15760 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
15770 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
15780 69 6d 69 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  imit;.  return;.
15790 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
157a0 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a  TE_OMIT_CTE */..
157b0 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
157c0 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20  ences */.static 
157d0 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
157e0 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
157f0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
15800 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
15810 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
15820 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
15830 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
15840 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
15850 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
15860 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
15870 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
15880 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
15890 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ts */.);../*.** 
158a0 48 61 6e 64 6c 65 20 74 68 65 20 73 70 65 63 69  Handle the speci
158b0 61 6c 20 63 61 73 65 20 6f 66 20 61 20 63 6f 6d  al case of a com
158c0 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61  pound-select tha
158d0 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f  t originates fro
158e0 6d 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c  m a.** VALUES cl
158f0 61 75 73 65 2e 20 20 42 79 20 68 61 6e 64 6c 69  ause.  By handli
15900 6e 67 20 74 68 69 73 20 61 73 20 61 20 73 70 65  ng this as a spe
15910 63 69 61 6c 20 63 61 73 65 2c 20 77 65 20 61 76  cial case, we av
15920 6f 69 64 20 64 65 65 70 0a 2a 2a 20 72 65 63 75  oid deep.** recu
15930 72 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20  rsion, and thus 
15940 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65  do not need to e
15950 6e 66 6f 72 63 65 20 74 68 65 20 53 51 4c 49 54  nforce the SQLIT
15960 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
15970 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20  _SELECT.** on a 
15980 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a  VALUES clause..*
15990 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65  *.** Because the
159a0 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f   Select object o
159b0 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61  riginates from a
159c0 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a   VALUES clause:.
159d0 2a 2a 20 20 20 28 31 29 20 54 68 65 72 65 20 69  **   (1) There i
159e0 73 20 6e 6f 20 4c 49 4d 49 54 20 6f 72 20 4f 46  s no LIMIT or OF
159f0 46 53 45 54 20 6f 72 20 65 6c 73 65 20 74 68 65  FSET or else the
15a00 72 65 20 69 73 20 61 20 4c 49 4d 49 54 20 6f 66  re is a LIMIT of
15a10 20 65 78 61 63 74 6c 79 20 31 0a 2a 2a 20 20 20   exactly 1.**   
15a20 28 32 29 20 41 6c 6c 20 74 65 72 6d 73 20 61 72  (2) All terms ar
15a30 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a 20 20  e UNION ALL.**  
15a40 20 28 33 29 20 54 68 65 72 65 20 69 73 20 6e 6f   (3) There is no
15a50 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
15a60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 4c 49 4d 49  .**.** The "LIMI
15a70 54 20 6f 66 20 65 78 61 63 74 6c 79 20 31 22 20  T of exactly 1" 
15a80 63 61 73 65 20 6f 66 20 63 6f 6e 64 69 74 69 6f  case of conditio
15a90 6e 20 28 31 29 20 63 6f 6d 65 73 20 61 62 6f 75  n (1) comes abou
15aa0 74 20 77 68 65 6e 20 61 20 56 41 4c 55 45 53 0a  t when a VALUES.
15ab0 2a 2a 20 63 6c 61 75 73 65 20 6f 63 63 75 72 73  ** clause occurs
15ac0 20 77 69 74 68 69 6e 20 73 63 61 6c 61 72 20 65   within scalar e
15ad0 78 70 72 65 73 73 69 6f 6e 20 28 65 78 3a 20 22  xpression (ex: "
15ae0 53 45 4c 45 43 54 20 28 56 41 4c 55 45 53 28 31  SELECT (VALUES(1
15af0 29 2c 28 32 29 2c 28 33 29 29 22 29 2e 0a 2a 2a  ),(2),(3))")..**
15b00 20 54 68 65 20 73 71 6c 69 74 65 33 43 6f 64 65   The sqlite3Code
15b10 53 75 62 73 65 6c 65 63 74 20 77 69 6c 6c 20 68  Subselect will h
15b20 61 76 65 20 61 64 64 65 64 20 74 68 65 20 4c 49  ave added the LI
15b30 4d 49 54 20 31 20 63 6c 61 75 73 65 20 69 6e 20  MIT 1 clause in 
15b40 74 68 74 20 63 61 73 65 2e 0a 2a 2a 20 53 69 6e  tht case..** Sin
15b50 63 65 20 74 68 65 20 6c 69 6d 69 74 20 69 73 20  ce the limit is 
15b60 65 78 61 63 74 6c 79 20 31 2c 20 77 65 20 6f 6e  exactly 1, we on
15b70 6c 79 20 6e 65 65 64 20 74 6f 20 65 76 61 6c 75  ly need to evalu
15b80 74 65 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  tes the left-mos
15b90 74 20 56 41 4c 55 45 53 2e 0a 2a 2f 0a 73 74 61  t VALUES..*/.sta
15ba0 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
15bb0 65 63 74 56 61 6c 75 65 73 28 0a 20 20 50 61 72  ectValues(.  Par
15bc0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
15bd0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
15be0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
15bf0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
15c00 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
15c10 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
15c20 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
15c30 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
15c40 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
15c50 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
15c60 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
15c70 74 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e  t nRow = 1;.  in
15c80 74 20 72 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t rc = 0;.  int 
15c90 62 53 68 6f 77 41 6c 6c 20 3d 20 70 2d 3e 70 4c  bShowAll = p->pL
15ca0 69 6d 69 74 3d 3d 30 3b 0a 20 20 61 73 73 65 72  imit==0;.  asser
15cb0 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  t( p->selFlags &
15cc0 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29   SF_MultiValue )
15cd0 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65  ;.  do{.    asse
15ce0 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
15cf0 26 20 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a 20  & SF_Values );. 
15d00 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
15d10 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e  ==TK_ALL || (p->
15d20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26  op==TK_SELECT &&
15d30 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20 29   p->pPrior==0) )
15d40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
15d50 3e 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 2d 3e  >pNext==0 || p->
15d60 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70  pEList->nExpr==p
15d70 2d 3e 70 4e 65 78 74 2d 3e 70 45 4c 69 73 74 2d  ->pNext->pEList-
15d80 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 69 66  >nExpr );.    if
15d90 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
15da0 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65   break;.    asse
15db0 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 2d 3e 70  rt( p->pPrior->p
15dc0 4e 65 78 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70  Next==p );.    p
15dd0 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
15de0 20 20 6e 52 6f 77 20 2b 3d 20 62 53 68 6f 77 41    nRow += bShowA
15df0 6c 6c 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29 3b  ll;.  }while(1);
15e00 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50  .  ExplainQueryP
15e10 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c 20  lan((pParse, 0, 
15e20 22 53 43 41 4e 20 25 64 20 43 4f 4e 53 54 41 4e  "SCAN %d CONSTAN
15e30 54 20 52 4f 57 25 73 22 2c 20 6e 52 6f 77 2c 0a  T ROW%s", nRow,.
15e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e50 20 20 20 20 6e 52 6f 77 3d 3d 31 20 3f 20 22 22      nRow==1 ? ""
15e60 20 3a 20 22 53 22 29 29 3b 0a 20 20 77 68 69 6c   : "S"));.  whil
15e70 65 28 20 70 20 29 7b 0a 20 20 20 20 73 65 6c 65  e( p ){.    sele
15e80 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
15e90 73 65 2c 20 70 2c 20 2d 31 2c 20 30 2c 20 30 2c  se, p, -1, 0, 0,
15ea0 20 70 44 65 73 74 2c 20 31 2c 20 31 29 3b 0a 20   pDest, 1, 1);. 
15eb0 20 20 20 69 66 28 20 21 62 53 68 6f 77 41 6c 6c     if( !bShowAll
15ec0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 2d   ) break;.    p-
15ed0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 52  >nSelectRow = nR
15ee0 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  ow;.    p = p->p
15ef0 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Next;.  }.  retu
15f00 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15f10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
15f20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73  called to proces
15f30 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  s a compound que
15f40 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20  ry form from.** 
15f50 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  two or more sepa
15f60 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73 69  rate queries usi
15f70 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20  ng UNION, UNION 
15f80 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a  ALL, EXCEPT, or.
15f90 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a  ** INTERSECT.**.
15fa0 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f  ** "p" points to
15fb0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
15fc0 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69  of the two queri
15fd0 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f  es.  the query o
15fe0 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73  n the.** left is
15ff0 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65   p->pPrior.  The
16000 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c   left query coul
16010 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70  d also be a comp
16020 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e  ound query.** in
16030 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73   which case this
16040 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
16050 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
16060 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ely. .**.** The 
16070 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74  results of the t
16080 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74  otal query are t
16090 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
160a0 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  o a destination.
160b0 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74  ** of type eDest
160c0 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20   with parameter 
160d0 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  iParm..**.** Exa
160e0 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65  mple 1:  Conside
160f0 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f  r a three-way co
16100 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65  mpound SQL state
16110 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment..**.**     
16120 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
16130 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20   UNION SELECT b 
16140 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45  FROM t2 UNION SE
16150 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
16160 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d  *.** This statem
16170 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70  ent is parsed up
16180 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
16190 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20  **     SELECT c 
161a0 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20  FROM t3.**      
161b0 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d  |.**      `-----
161c0 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  >  SELECT b FROM
161d0 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   t2.**          
161e0 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
161f0 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d            `-----
16200 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f  ->  SELECT a FRO
16210 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  M t1.**.** The a
16220 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61  rrows in the dia
16230 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65  gram above repre
16240 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e  sent the Select.
16250 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a  pPrior pointer..
16260 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  ** So if this ro
16270 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
16280 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20  with p equal to 
16290 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68  the t3 query, th
162a0 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c  en.** pPrior wil
162b0 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72  l be the t2 quer
162c0 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62  y.  p->op will b
162d0 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68  e TK_UNION in th
162e0 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e  is case..**.** N
162f0 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75  otice that becau
16300 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51  se of the way SQ
16310 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70  Lite parses comp
16320 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68  ound SELECTs, th
16330 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
16340 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67  selects always g
16350 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74  roup from left t
16360 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  o right..*/.stat
16370 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
16380 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
16390 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
163a0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
163b0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
163c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
163d0 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
163e0 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
163f0 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
16400 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
16410 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
16420 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
16430 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
16440 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20  SQLITE_OK;   /* 
16450 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f  Success code fro
16460 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  m a subroutine *
16470 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
16480 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
16490 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
164a0 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
164b0 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
164c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
164d0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
164e0 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
164f0 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
16500 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72  t;      /* Alter
16510 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73 74  native data dest
16520 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  ination */.  Sel
16530 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30  ect *pDelete = 0
16540 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73  ;  /* Chain of s
16550 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f  imple selects to
16560 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c   delete */.  sql
16570 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
16580 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
16590 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  onnection */..  
165a0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
165b0 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
165c0 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73  Y or LIMIT claus
165d0 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43  e on prior SELEC
165e0 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74  Ts.  Only.  ** t
165f0 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d  he last (right-m
16600 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74  ost) SELECT in t
16610 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61  he series may ha
16620 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  ve an ORDER BY o
16630 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20  r LIMIT..  */.  
16640 61 73 73 65 72 74 28 20 70 20 26 26 20 70 2d 3e  assert( p && p->
16650 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61  pPrior );  /* Ca
16660 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67  lling function g
16670 75 61 72 61 6e 74 65 65 73 20 74 68 69 73 20 6d  uarantees this m
16680 75 63 68 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  uch */.  assert(
16690 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
166a0 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d 3d 30  SF_Recursive)==0
166b0 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c   || p->op==TK_AL
166c0 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  L || p->op==TK_U
166d0 4e 49 4f 4e 20 29 3b 0a 20 20 64 62 20 3d 20 70  NION );.  db = p
166e0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72  Parse->db;.  pPr
166f0 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
16700 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74  .  dest = *pDest
16710 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  ;.  if( pPrior->
16720 70 4f 72 64 65 72 42 79 20 7c 7c 20 70 50 72 69  pOrderBy || pPri
16730 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  or->pLimit ){.  
16740 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
16750 67 28 70 50 61 72 73 65 2c 22 25 73 20 63 6c 61  g(pParse,"%s cla
16760 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20  use should come 
16770 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66  after %s not bef
16780 6f 72 65 22 2c 0a 20 20 20 20 20 20 70 50 72 69  ore",.      pPri
16790 6f 72 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20  or->pOrderBy!=0 
167a0 3f 20 22 4f 52 44 45 52 20 42 59 22 20 3a 20 22  ? "ORDER BY" : "
167b0 4c 49 4d 49 54 22 2c 20 73 65 6c 65 63 74 4f 70  LIMIT", selectOp
167c0 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
167d0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
167e0 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
167f0 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20  end;.  }..  v = 
16800 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
16810 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
16820 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68  ( v!=0 );  /* Th
16830 65 20 56 44 42 45 20 61 6c 72 65 61 64 79 20 63  e VDBE already c
16840 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69 6e  reated by callin
16850 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20  g function */.. 
16860 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 64   /* Create the d
16870 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f  estination tempo
16880 72 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65  rary table if ne
16890 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69  cessary.  */.  i
168a0 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
168b0 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20  RT_EphemTab ){. 
168c0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
168d0 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69  List );.    sqli
168e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
168f0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
16900 6c 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c  l, dest.iSDParm,
16910 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
16920 72 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65  r);.    dest.eDe
16930 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a  st = SRT_Table;.
16940 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61    }..  /* Specia
16950 6c 20 68 61 6e 64 6c 69 6e 67 20 66 6f 72 20 61  l handling for a
16960 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74   compound-select
16970 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73   that originates
16980 20 61 73 20 61 20 56 41 4c 55 45 53 20 63 6c 61   as a VALUES cla
16990 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  use..  */.  if( 
169a0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
169b0 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 7b 0a 20  _MultiValue ){. 
169c0 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c     rc = multiSel
169d0 65 63 74 56 61 6c 75 65 73 28 70 50 61 72 73 65  ectValues(pParse
169e0 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  , p, &dest);.   
169f0 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
16a00 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
16a10 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
16a20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73  SELECTs in the s
16a30 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68  tatement have th
16a40 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
16a50 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69   elements.  ** i
16a60 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73  n their result s
16a70 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ets..  */.  asse
16a80 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26  rt( p->pEList &&
16a90 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20   pPrior->pEList 
16aa0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
16ab0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70  pEList->nExpr==p
16ac0 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e  Prior->pEList->n
16ad0 45 78 70 72 20 29 3b 0a 0a 23 69 66 6e 64 65 66  Expr );..#ifndef
16ae0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
16af0 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
16b00 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
16b10 65 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  e ){.    generat
16b20 65 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75  eWithRecursiveQu
16b30 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ery(pParse, p, &
16b40 64 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  dest);.  }else.#
16b50 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70  endif..  /* Comp
16b60 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68 61  ound SELECTs tha
16b70 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  t have an ORDER 
16b80 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 68 61  BY clause are ha
16b90 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79  ndled separately
16ba0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
16bb0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
16bc0 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65  return multiSele
16bd0 63 74 4f 72 64 65 72 42 79 28 70 50 61 72 73 65  ctOrderBy(pParse
16be0 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d  , p, pDest);.  }
16bf0 65 6c 73 65 7b 0a 0a 23 69 66 6e 64 65 66 20 53  else{..#ifndef S
16c00 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
16c10 49 4e 0a 20 20 20 20 69 66 28 20 70 50 72 69 6f  IN.    if( pPrio
16c20 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a  r->pPrior==0 ){.
16c30 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65        ExplainQue
16c40 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
16c50 31 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 51 55 45  1, "COMPOUND QUE
16c60 52 59 22 29 29 3b 0a 20 20 20 20 20 20 45 78 70  RY"));.      Exp
16c70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
16c80 50 61 72 73 65 2c 20 31 2c 20 22 4c 45 46 54 2d  Parse, 1, "LEFT-
16c90 4d 4f 53 54 20 53 55 42 51 55 45 52 59 22 29 29  MOST SUBQUERY"))
16ca0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
16cb0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
16cc0 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66  code for the lef
16cd0 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45  t and right SELE
16ce0 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  CT statements.. 
16cf0 20 20 20 2a 2f 0a 20 20 20 20 73 77 69 74 63 68     */.    switch
16d00 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20  ( p->op ){.     
16d10 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a   case TK_ALL: {.
16d20 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
16d30 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
16d40 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  t nLimit;.      
16d50 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
16d60 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20  r->pLimit );.   
16d70 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69       pPrior->iLi
16d80 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b  mit = p->iLimit;
16d90 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d  .        pPrior-
16da0 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f  >iOffset = p->iO
16db0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 70  ffset;.        p
16dc0 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20  Prior->pLimit = 
16dd0 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
16de0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
16df0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
16e00 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20 20  rior, &dest);.  
16e10 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
16e20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
16e30 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
16e40 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
16e50 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
16e60 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72  }.        p->pPr
16e70 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ior = 0;.       
16e80 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72   p->iLimit = pPr
16e90 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  ior->iLimit;.   
16ea0 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
16eb0 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65  = pPrior->iOffse
16ec0 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
16ed0 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
16ee0 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
16ef0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
16f00 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 70 2d 3e 69  , OP_IfNot, p->i
16f10 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65  Limit); VdbeCove
16f20 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
16f30 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
16f40 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20 69  v, "Jump ahead i
16f50 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22  f LIMIT reached"
16f60 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ));.          if
16f70 28 20 70 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a  ( p->iOffset ){.
16f80 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
16f90 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
16fa0 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c   OP_OffsetLimit,
16fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
16fd0 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f 66  ->iLimit, p->iOf
16fe0 66 73 65 74 2b 31 2c 20 70 2d 3e 69 4f 66 66 73  fset+1, p->iOffs
16ff0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  et);.          }
17000 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17010 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50     ExplainQueryP
17020 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20  lan((pParse, 1, 
17030 22 55 4e 49 4f 4e 20 41 4c 4c 22 29 29 3b 0a 20  "UNION ALL"));. 
17040 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
17050 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
17060 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  , p, &dest);.   
17070 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
17080 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
17090 20 20 20 20 20 20 20 20 70 44 65 6c 65 74 65 20          pDelete 
170a0 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
170b0 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
170c0 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20   pPrior;.       
170d0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
170e0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
170f0 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c  d(p->nSelectRow,
17100 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
17110 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Row);.        if
17120 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  ( pPrior->pLimit
17130 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c  .         && sql
17140 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
17150 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  r(pPrior->pLimit
17160 2d 3e 70 4c 65 66 74 2c 20 26 6e 4c 69 6d 69 74  ->pLeft, &nLimit
17170 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 6e 4c  ).         && nL
17180 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53 65  imit>0 && p->nSe
17190 6c 65 63 74 52 6f 77 20 3e 20 73 71 6c 69 74 65  lectRow > sqlite
171a0 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c 69  3LogEst((u64)nLi
171b0 6d 69 74 29 20 0a 20 20 20 20 20 20 20 20 29 7b  mit) .        ){
171c0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 53  .          p->nS
171d0 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
171e0 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c  e3LogEst((u64)nL
171f0 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  imit);.        }
17200 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
17210 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  r ){.          s
17220 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
17230 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
17240 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
17250 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
17260 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
17270 50 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 54  PT:.      case T
17280 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  K_UNION: {.     
17290 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b     int unionTab;
172a0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
172b0 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70  mber of the temp
172c0 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72   table holding r
172d0 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 20  esult */.       
172e0 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20   u8 op = 0;     
172f0 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
17300 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20  SRT_ operations 
17310 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66  to apply to self
17320 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
17330 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20  priorOp;     /* 
17340 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  The SRT_ operati
17350 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  on to apply to p
17360 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a  rior selects */.
17370 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
17380 69 6d 69 74 3b 20 20 20 20 2f 2a 20 53 61 76 65  imit;    /* Save
17390 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e  d values of p->n
173a0 4c 69 6d 69 74 20 20 2a 2f 0a 20 20 20 20 20 20  Limit  */.      
173b0 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
173c0 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 75      SelectDest u
173d0 6e 69 6f 6e 64 65 73 74 3b 0a 20 20 0a 20 20 20  niondest;.  .   
173e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
173f0 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ->op==TK_EXCEPT 
17400 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
17410 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ase( p->op==TK_U
17420 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  NION );.        
17430 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e  priorOp = SRT_Un
17440 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ion;.        if(
17450 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69   dest.eDest==pri
17460 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  orOp ){.        
17470 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73    /* We can reus
17480 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  e a temporary ta
17490 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ble generated by
174a0 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72   a SELECT to our
174b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 69  .          ** ri
174c0 67 68 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ght..          *
174d0 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
174e0 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30  rt( p->pLimit==0
174f0 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20   );      /* Not 
17500 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77  allowed on leftw
17510 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ard elements */.
17520 20 20 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54            unionT
17530 61 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72  ab = dest.iSDPar
17540 6d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  m;.        }else
17550 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
17560 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  e will need to c
17570 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65  reate our own te
17580 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f  mporary table to
17590 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20   hold the.      
175a0 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69      ** intermedi
175b0 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20  ate results..   
175c0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
175d0 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70      unionTab = p
175e0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
175f0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
17600 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
17610 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  );.          add
17620 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
17630 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
17640 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e  Ephemeral, union
17650 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
17660 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
17670 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
17680 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20   -1 );.         
17690 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
176a0 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [0] = addr;.    
176b0 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d        findRightm
176c0 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73  ost(p)->selFlags
176d0 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
176e0 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  eral;.          
176f0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
17700 74 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t );.        }. 
17710 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64   .        /* Cod
17720 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
17730 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c  tements to our l
17740 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  eft.        */. 
17750 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
17760 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
17770 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
17780 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
17790 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72  t(&uniondest, pr
177a0 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29  iorOp, unionTab)
177b0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
177c0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
177d0 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e  rse, pPrior, &un
177e0 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20  iondest);.      
177f0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
17800 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
17810 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
17820 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
17830 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
17840 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61  rrent SELECT sta
17850 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  tement.        *
17860 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  /.        if( p-
17870 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29  >op==TK_EXCEPT )
17880 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 20 3d  {.          op =
17890 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20   SRT_Except;.   
178a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
178b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
178c0 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
178d0 0a 20 20 20 20 20 20 20 20 20 20 6f 70 20 3d 20  .          op = 
178e0 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20  SRT_Union;.     
178f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e     }.        p->
17900 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
17910 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e      pLimit = p->
17920 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  pLimit;.        
17930 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
17940 20 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74         uniondest
17950 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20  .eDest = op;.   
17960 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72       ExplainQuer
17970 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31  yPlan((pParse, 1
17980 2c 20 22 25 73 20 55 53 49 4e 47 20 54 45 4d 50  , "%s USING TEMP
17990 20 42 2d 54 52 45 45 22 2c 0a 20 20 20 20 20 20   B-TREE",.      
179a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179b0 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
179c0 28 70 2d 3e 6f 70 29 29 29 3b 0a 20 20 20 20 20  (p->op)));.     
179d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
179e0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
179f0 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20   &uniondest);.  
17a00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17a10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
17a20 0a 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72  .        /* Quer
17a30 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20  y flattening in 
17a40 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20  sqlite3Select() 
17a50 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e  might refill p->
17a60 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20 20  pOrderBy..      
17a70 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20    ** Be sure to 
17a80 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72  delete p->pOrder
17a90 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74  By, therefore, t
17aa0 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79  o avoid a memory
17ab0 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20   leak. */.      
17ac0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
17ad0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
17ae0 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
17af0 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
17b00 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 70  Prior;.        p
17b10 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
17b20 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4f  r;.        p->pO
17b30 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
17b40 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
17b50 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 20  K_UNION ){.     
17b60 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
17b70 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
17b80 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74  stAdd(p->nSelect
17b90 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65  Row, pPrior->nSe
17ba0 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  lectRow);.      
17bb0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
17bc0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
17bd0 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
17be0 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
17bf0 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = pLimit;.      
17c00 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b    p->iLimit = 0;
17c10 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  .        p->iOff
17c20 73 65 74 20 3d 20 30 3b 0a 20 20 0a 20 20 20 20  set = 0;.  .    
17c30 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74      /* Convert t
17c40 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  he data in the t
17c50 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
17c60 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72  nto whatever for
17c70 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  m.        ** it 
17c80 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65  is that we curre
17c90 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20  ntly need..     
17ca0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
17cb0 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d  sert( unionTab==
17cc0 64 65 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20  dest.iSDParm || 
17cd0 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f  dest.eDest!=prio
17ce0 72 4f 70 20 29 3b 0a 20 20 20 20 20 20 20 20 69  rOp );.        i
17cf0 66 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70  f( dest.eDest!=p
17d00 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20  riorOp ){.      
17d10 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
17d20 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
17d30 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
17d40 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
17d50 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d          iBreak =
17d60 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
17d70 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
17d80 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
17d90 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
17da0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  (v);.          c
17db0 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
17dc0 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
17dd0 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
17de0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17df0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
17e00 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72  d, unionTab, iBr
17e10 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
17e20 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
17e30 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
17e40 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
17e50 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  (v);.          s
17e60 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
17e70 50 61 72 73 65 2c 20 70 2c 20 75 6e 69 6f 6e 54  Parse, p, unionT
17e80 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab,.            
17e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
17ea0 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74   0, &dest, iCont
17eb0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
17ec0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17ed0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
17ee0 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  iCont);.        
17ef0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17f00 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
17f10 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74  unionTab, iStart
17f20 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
17f30 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  v);.          sq
17f40 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
17f50 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29  Label(v, iBreak)
17f60 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
17f70 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17f80 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e   OP_Close, union
17f90 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
17fa0 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
17fb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17fc0 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28  default: assert(
17fd0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52   p->op==TK_INTER
17fe0 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20  SECT ); {.      
17ff0 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32    int tab1, tab2
18000 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  ;.        int iC
18010 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
18020 61 72 74 3b 0a 20 20 20 20 20 20 20 20 45 78 70  art;.        Exp
18030 72 20 2a 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  r *pLimit;.     
18040 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
18050 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
18060 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20  intersectdest;. 
18070 20 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20         int r1;. 
18080 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 54   .        /* INT
18090 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65 72  ERSECT is differ
180a0 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68  ent from the oth
180b0 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65 71  ers since it req
180c0 75 69 72 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  uires.        **
180d0 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74   two temporary t
180e0 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74  ables.  Hence it
180f0 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73   has its own cas
18100 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20  e.  Begin.      
18110 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69    ** by allocati
18120 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65  ng the tables we
18130 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20   will need..    
18140 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 74      */.        t
18150 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab1 = pParse->nT
18160 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 74 61  ab++;.        ta
18170 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b2 = pParse->nTa
18180 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  b++;.        ass
18190 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
181a0 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20 20 20  ==0 );.  .      
181b0 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
181c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
181d0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
181e0 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
181f0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
18200 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
18210 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  -1 );.        p-
18220 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
18230 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20   = addr;.       
18240 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70   findRightmost(p
18250 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  )->selFlags |= S
18260 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
18270 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
18280 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
18290 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  .        /* Code
182a0 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20   the SELECTs to 
182b0 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65  our left into te
182c0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
182d0 61 62 31 22 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ab1"..        */
182e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
182f0 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
18300 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 53  intersectdest, S
18310 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b  RT_Union, tab1);
18320 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
18330 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
18340 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74  se, pPrior, &int
18350 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
18360 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
18370 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75           goto mu
18380 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
18390 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20          }.  .   
183a0 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
183b0 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
183c0 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
183d0 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20  able "tab2".    
183e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
183f0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
18400 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
18410 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62  enEphemeral, tab
18420 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  2, 0);.        a
18430 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
18440 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20  enEphm[1] == -1 
18450 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64  );.        p->ad
18460 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
18470 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 70 2d  addr;.        p-
18480 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
18490 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
184a0 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20  >pLimit;.       
184b0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
184c0 20 20 20 20 20 20 20 20 69 6e 74 65 72 73 65 63          intersec
184d0 74 64 65 73 74 2e 69 53 44 50 61 72 6d 20 3d 20  tdest.iSDParm = 
184e0 74 61 62 32 3b 0a 20 20 20 20 20 20 20 20 45 78  tab2;.        Ex
184f0 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
18500 70 50 61 72 73 65 2c 20 31 2c 20 22 25 73 20 55  pParse, 1, "%s U
18510 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45  SING TEMP B-TREE
18520 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
18530 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 6c               sel
18540 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
18550 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
18560 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
18570 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72  Parse, p, &inter
18580 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20  sectdest);.     
18590 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
185a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
185b0 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20        pDelete = 
185c0 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  p->pPrior;.     
185d0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
185e0 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69  Prior;.        i
185f0 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
18600 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74  >pPrior->nSelect
18610 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Row ){.         
18620 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
18630 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
18640 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Row;.        }. 
18650 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
18660 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
18670 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20  pLimit);.       
18680 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
18690 6d 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  mit;.  .        
186a0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
186b0 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74   to take the int
186c0 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  ersection of the
186d0 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20   two temporary. 
186e0 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73         ** tables
186f0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
18700 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
18710 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
18720 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
18730 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
18740 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e  v);.        iCon
18750 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
18760 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
18770 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
18780 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
18790 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20  e, p, iBreak);. 
187a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
187b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
187c0 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72  ewind, tab1, iBr
187d0 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
187e0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 72  ge(v);.        r
187f0 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
18800 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
18810 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
18820 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18830 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c  2(v, OP_RowData,
18840 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20   tab1, r1);.    
18850 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18860 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e  ddOp4Int(v, OP_N
18870 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69  otFound, tab2, i
18880 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 0a 20 20  Cont, r1, 0);.  
18890 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
188a0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
188b0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
188c0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
188d0 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74  ;.        select
188e0 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
188f0 2c 20 70 2c 20 74 61 62 31 2c 0a 20 20 20 20 20  , p, tab1,.     
18900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18910 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20     0, 0, &dest, 
18920 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a  iCont, iBreak);.
18930 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18940 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
18950 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
18960 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18970 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
18980 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 20   tab1, iStart); 
18990 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
189a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
189b0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
189c0 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
189d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
189e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
189f0 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  se, tab2, 0);.  
18a00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18a10 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
18a20 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  ose, tab1, 0);. 
18a30 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
18a40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
18a50 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
18a60 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20  OMIT_EXPLAIN.   
18a70 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30   if( p->pNext==0
18a80 20 29 7b 0a 20 20 20 20 20 20 45 78 70 6c 61 69   ){.      Explai
18a90 6e 51 75 65 72 79 50 6c 61 6e 50 6f 70 28 70 50  nQueryPlanPop(pP
18aa0 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 23  arse);.    }.  #
18ab0 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20 2f  endif.  }.  .  /
18ac0 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74  * Compute collat
18ad0 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73  ing sequences us
18ae0 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70  ed by .  ** temp
18af0 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65  orary tables nee
18b00 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ded to implement
18b10 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
18b20 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63  lect..  ** Attac
18b30 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  h the KeyInfo st
18b40 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74  ructure to all t
18b50 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
18b60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
18b70 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62  section is run b
18b80 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  y the right-most
18b90 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
18ba0 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c  t only..  ** SEL
18bb0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
18bc0 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79  o the left alway
18bd0 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  s skip this part
18be0 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  .  The right-mos
18bf0 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69  t.  ** SELECT mi
18c00 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68  ght also skip th
18c10 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68 61  is part if it ha
18c20 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
18c30 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f  ause and.  ** no
18c40 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65   temp tables are
18c50 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a   required..  */.
18c60 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
18c70 73 20 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d  s & SF_UsesEphem
18c80 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  eral ){.    int 
18c90 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
18ca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
18cb0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
18cc0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
18cd0 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fo;            /
18ce0 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
18cf0 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73  ence for the res
18d00 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53  ult set */.    S
18d10 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20  elect *pLoop;   
18d20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18d30 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  For looping thro
18d40 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65  ugh SELECT state
18d50 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c  ments */.    Col
18d60 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20  lSeq **apColl;  
18d70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
18d80 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
18d90 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  h pKeyInfo->aCol
18da0 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  l[] */.    int n
18db0 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
18dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
18dd0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
18de0 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a   result set */..
18df0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
18e00 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e  Next==0 );.    n
18e10 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  Col = p->pEList-
18e20 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79  >nExpr;.    pKey
18e30 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
18e40 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
18e50 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  Col, 1);.    if(
18e60 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20   !pKeyInfo ){.  
18e70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18e80 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
18e90 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
18ea0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
18eb0 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f     for(i=0, apCo
18ec0 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  ll=pKeyInfo->aCo
18ed0 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c  ll; i<nCol; i++,
18ee0 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20   apColl++){.    
18ef0 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74    *apColl = mult
18f00 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
18f10 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20  Parse, p, i);.  
18f20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f      if( 0==*apCo
18f30 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61  ll ){.        *a
18f40 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
18f50 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  tColl;.      }. 
18f60 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c     }..    for(pL
18f70 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c  oop=p; pLoop; pL
18f80 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f  oop=pLoop->pPrio
18f90 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  r){.      for(i=
18fa0 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<2; i++){.  
18fb0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
18fc0 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e   pLoop->addrOpen
18fd0 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Ephm[i];.       
18fe0 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20   if( addr<0 ){. 
18ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b           /* If [
19000 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68 65  0] is unused the
19010 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e  n [1] is also un
19020 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e  used.  So we can
19030 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  .          ** al
19040 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72  ways safely abor
19050 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65  t as soon as the
19060 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c   first unused sl
19070 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20  ot is found */. 
19080 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
19090 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e   pLoop->addrOpen
190a0 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20  Ephm[1]<0 );.   
190b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
190c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
190d0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
190e0 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f  eP2(v, addr, nCo
190f0 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
19100 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
19110 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29  v, addr, (char*)
19120 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
19130 66 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20 20  f(pKeyInfo),.   
19140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19150 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49           P4_KEYI
19160 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  NFO);.        pL
19170 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
19180 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20  m[i] = -1;.     
19190 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
191a0 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
191b0 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a  (pKeyInfo);.  }.
191c0 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e  .multi_select_en
191d0 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73  d:.  pDest->iSds
191e0 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a  t = dest.iSdst;.
191f0 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d    pDest->nSdst =
19200 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73   dest.nSdst;.  s
19210 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
19220 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b  te(db, pDelete);
19230 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19240 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
19250 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
19260 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ELECT */../*.** 
19270 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f  Error message fo
19280 72 20 77 68 65 6e 20 74 77 6f 20 6f 72 20 6d 6f  r when two or mo
19290 72 65 20 74 65 72 6d 73 20 6f 66 20 61 20 63 6f  re terms of a co
192a0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 68 61  mpound select ha
192b0 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ve different.** 
192c0 73 69 7a 65 20 72 65 73 75 6c 74 20 73 65 74 73  size result sets
192d0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
192e0 33 53 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54  3SelectWrongNumT
192f0 65 72 6d 73 45 72 72 6f 72 28 50 61 72 73 65 20  ermsError(Parse 
19300 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
19310 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73 65  *p){.  if( p->se
19320 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75  lFlags & SF_Valu
19330 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  es ){.    sqlite
19340 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
19350 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75  , "all VALUES mu
19360 73 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  st have the same
19370 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   number of terms
19380 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ");.  }else{.   
19390 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
193a0 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54  (pParse, "SELECT
193b0 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e  s to the left an
193c0 64 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20  d right of %s". 
193d0 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61       " do not ha
193e0 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
193f0 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
19400 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e  umns", selectOpN
19410 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d  ame(p->op));.  }
19420 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  .}../*.** Code a
19430 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  n output subrout
19440 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74  ine for a corout
19450 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ine implementati
19460 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43  on of a.** SELEC
19470 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a  T statment..**.*
19480 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65  * The data to be
19490 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61   output is conta
194a0 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64  ined in pIn->iSd
194b0 73 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a  st.  There are.*
194c0 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c  * pIn->nSdst col
194d0 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75  umns to be outpu
194e0 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68 65  t.  pDest is whe
194f0 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73 68  re the output sh
19500 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e  ould.** be sent.
19510 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e  .**.** regReturn
19520 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
19530 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20 68  f the register h
19540 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f  olding the subro
19550 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20  utine.** return 
19560 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49  address..**.** I
19570 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e  f regPrev>0 then
19580 20 69 74 20 69 73 20 74 68 65 20 66 69 72 73 74   it is the first
19590 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 76   register in a v
195a0 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65  ector that.** re
195b0 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69 6f  cords the previo
195c0 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b  us output.  mem[
195d0 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c  regPrev] is a fl
195e0 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73 65  ag that is false
195f0 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 73  .** if there has
19600 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75   been no previou
19610 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65  s output.  If re
19620 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64  gPrev>0 then cod
19630 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65  e is.** generate
19640 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64 75  d to suppress du
19650 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49  plicates.  pKeyI
19660 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20  nfo is used for 
19670 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79  comparing.** key
19680 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
19690 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70  LIMIT found in p
196a0 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63  ->iLimit is reac
196b0 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69  hed, jump immedi
196c0 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65  ately to.** iBre
196d0 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ak..*/.static in
196e0 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  t generateOutput
196f0 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61  Subroutine(.  Pa
19700 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
19710 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
19720 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
19730 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
19740 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
19750 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
19760 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
19770 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  In,        /* Co
19780 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e  routine supplyin
19790 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65  g data */.  Sele
197a0 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
197b0 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
197c0 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f  send the data */
197d0 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e  .  int regReturn
197e0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
197f0 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  e return address
19800 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
19810 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20 20  nt regPrev,     
19820 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
19830 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73 74  us result regist
19840 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65  er.  No uniquene
19850 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79  ss if 0 */.  Key
19860 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
19870 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70       /* For comp
19880 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76 69  aring with previ
19890 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69  ous entry */.  i
198a0 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20  nt iBreak       
198b0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
198c0 65 72 65 20 69 66 20 77 65 20 68 69 74 20 74 68  ere if we hit th
198d0 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20  e LIMIT */.){.  
198e0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
198f0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
19900 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20  Continue;.  int 
19910 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20  addr;..  addr = 
19920 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
19930 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f  ntAddr(v);.  iCo
19940 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
19950 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
19960 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73  ;..  /* Suppress
19970 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20   duplicates for 
19980 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61  UNION, EXCEPT, a
19990 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20  nd INTERSECT .  
199a0 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76  */.  if( regPrev
199b0 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
199c0 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 61 64  1, addr2;.    ad
199d0 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
199e0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
199f0 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 20 56  Not, regPrev); V
19a00 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19a10 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69      addr2 = sqli
19a20 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
19a30 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e   OP_Compare, pIn
19a40 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76  ->iSdst, regPrev
19a50 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a  +1, pIn->nSdst,.
19a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
19a80 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49  har*)sqlite3KeyI
19a90 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29  nfoRef(pKeyInfo)
19aa0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
19ab0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19ac0 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
19ad0 20 61 64 64 72 32 2b 32 2c 20 69 43 6f 6e 74 69   addr2+2, iConti
19ae0 6e 75 65 2c 20 61 64 64 72 32 2b 32 29 3b 20 56  nue, addr2+2); V
19af0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19b00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
19b10 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
19b20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
19b30 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
19b40 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  opy, pIn->iSdst,
19b50 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d   regPrev+1, pIn-
19b60 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20 73  >nSdst-1);.    s
19b70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19b80 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
19b90 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d  1, regPrev);.  }
19ba0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
19bb0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
19bc0 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
19bd0 2a 20 53 75 70 70 72 65 73 73 20 74 68 65 20 66  * Suppress the f
19be0 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72  irst OFFSET entr
19bf0 69 65 73 20 69 66 20 74 68 65 72 65 20 69 73 20  ies if there is 
19c00 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  an OFFSET clause
19c10 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73  .  */.  codeOffs
19c20 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
19c30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20  , iContinue);.. 
19c40 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e   assert( pDest->
19c50 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74  eDest!=SRT_Exist
19c60 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  s );.  assert( p
19c70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
19c80 5f 54 61 62 6c 65 20 29 3b 0a 20 20 73 77 69 74  _Table );.  swit
19c90 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  ch( pDest->eDest
19ca0 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65   ){.    /* Store
19cb0 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64   the result as d
19cc0 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71  ata using a uniq
19cd0 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20  ue key..    */. 
19ce0 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
19cf0 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e  mTab: {.      in
19d00 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
19d10 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
19d20 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d  ;.      int r2 =
19d30 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
19d40 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
19d50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19d60 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
19d70 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74  cord, pIn->iSdst
19d80 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31  , pIn->nSdst, r1
19d90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19da0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19db0 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74  _NewRowid, pDest
19dc0 2d 3e 69 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a  ->iSDParm, r2);.
19dd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19de0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
19df0 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44  sert, pDest->iSD
19e00 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20  Parm, r1, r2);. 
19e10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19e20 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
19e30 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
19e40 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
19e50 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
19e60 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r2);.      sqlit
19e70 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
19e80 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
19e90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19ea0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
19eb0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
19ec0 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
19ed0 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66  creating a set f
19ee0 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28  or an "expr IN (
19ef0 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a 20 20  SELECT ...)"..  
19f00 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
19f10 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69  T_Set: {.      i
19f20 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 74 65 73  nt r1;.      tes
19f30 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73  tcase( pIn->nSds
19f40 74 3e 31 20 29 3b 0a 20 20 20 20 20 20 72 31 20  t>1 );.      r1 
19f50 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
19f60 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
19f70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19f80 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
19f90 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73  ecord, pIn->iSds
19fa0 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 0a  t, pIn->nSdst, .
19fb0 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 70 44            r1, pD
19fc0 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20 70  est->zAffSdst, p
19fd0 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
19fe0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
19ff0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
1a000 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
1a010 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
1a020 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1a030 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
1a040 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44  OP_IdxInsert, pD
1a050 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31  est->iSDParm, r1
1a060 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a070 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
1a080 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
1a090 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dst);.      sqli
1a0a0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1a0b0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
1a0c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a0d0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
1a0e0 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65  s is a scalar se
1a0f0 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72  lect that is par
1a100 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
1a110 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
1a120 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
1a130 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72  s in the appropr
1a140 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iate memory cell
1a150 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20   and break out. 
1a160 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61     ** of the sca
1a170 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
1a180 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
1a190 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1a1a0 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c   pIn->nSdst==1 |
1a1b0 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  | pParse->nErr>0
1a1c0 20 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 70   );  testcase( p
1a1d0 49 6e 2d 3e 6e 53 64 73 74 21 3d 31 20 29 3b 0a  In->nSdst!=1 );.
1a1e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a1f0 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
1a200 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44  , pIn->iSdst, pD
1a210 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29  est->iSDParm, 1)
1a220 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;.      /* The L
1a230 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
1a240 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65   jump out of the
1a250 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
1a260 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a270 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   }.#endif /* #if
1a280 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a290 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20  _SUBQUERY */..  
1a2a0 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 73    /* The results
1a2b0 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61   are stored in a
1a2c0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67   sequence of reg
1a2d0 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74  isters.    ** st
1a2e0 61 72 74 69 6e 67 20 61 74 20 70 44 65 73 74 2d  arting at pDest-
1a2f0 3e 69 53 64 73 74 2e 20 20 54 68 65 6e 20 74 68  >iSdst.  Then th
1a300 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65  e co-routine yie
1a310 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lds..    */.    
1a320 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69  case SRT_Corouti
1a330 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ne: {.      if( 
1a340 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20  pDest->iSdst==0 
1a350 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74  ){.        pDest
1a360 2d 3e 69 53 64 73 74 20 3d 20 73 71 6c 69 74 65  ->iSdst = sqlite
1a370 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
1a380 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  arse, pIn->nSdst
1a390 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74  );.        pDest
1a3a0 2d 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e  ->nSdst = pIn->n
1a3b0 53 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Sdst;.      }.  
1a3c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1a3d0 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
1a3e0 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73  pIn->iSdst, pDes
1a3f0 74 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  t->iSdst, pIn->n
1a400 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Sdst);.      sql
1a410 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
1a420 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73  , OP_Yield, pDes
1a430 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  t->iSDParm);.   
1a440 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1a450 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20  .    /* If none 
1a460 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68  of the above, th
1a470 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64 65  en the result de
1a480 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62  stination must b
1a490 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74  e.    ** SRT_Out
1a4a0 70 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69  put.  This routi
1a4b0 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
1a4c0 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65  ed with any othe
1a4d0 72 0a 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61  r.    ** destina
1a4e0 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  tion other than 
1a4f0 74 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64  the ones handled
1a500 20 61 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75   above or SRT_Ou
1a510 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  tput..    **.   
1a520 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74 70   ** For SRT_Outp
1a530 75 74 2c 20 72 65 73 75 6c 74 73 20 61 72 65 20  ut, results are 
1a540 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75  stored in a sequ
1a550 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
1a560 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e  s.  .    ** Then
1a570 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f   the OP_ResultRo
1a580 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64  w opcode is used
1a590 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65   to cause sqlite
1a5a0 33 5f 73 74 65 70 28 29 20 74 6f 0a 20 20 20 20  3_step() to.    
1a5b0 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65  ** return the ne
1a5c0 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74  xt row of result
1a5d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
1a5e0 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
1a5f0 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65  sert( pDest->eDe
1a600 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
1a610 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1a620 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a630 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e  ResultRow, pIn->
1a640 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
1a650 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1a660 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
1a670 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
1a680 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
1a690 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
1a6a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1a6b0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
1a6c0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f  he end of the lo
1a6d0 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20  op if the LIMIT 
1a6e0 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f  is reached..  */
1a6f0 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
1a700 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1a710 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a720 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d  DecrJumpZero, p-
1a730 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29  >iLimit, iBreak)
1a740 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1a750 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
1a760 65 72 61 74 65 20 74 68 65 20 73 75 62 72 6f 75  erate the subrou
1a770 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f  tine return.  */
1a780 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
1a790 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
1a7a0 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69  ontinue);.  sqli
1a7b0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
1a7c0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52   OP_Return, regR
1a7d0 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72  eturn);..  retur
1a7e0 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n addr;.}../*.**
1a7f0 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d   Alternative com
1a800 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64  pound select cod
1a810 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20  e generator for 
1a820 63 61 73 65 73 20 77 68 65 6e 20 74 68 65 72 65  cases when there
1a830 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20  .** is an ORDER 
1a840 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  BY clause..**.**
1a850 20 57 65 20 61 73 73 75 6d 65 20 61 20 71 75 65   We assume a que
1a860 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ry of the follow
1a870 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  ing form:.**.** 
1a880 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20       <selectA>  
1a890 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c  <operator>  <sel
1a8a0 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20  ectB>  ORDER BY 
1a8b0 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a  <orderbylist>.**
1a8c0 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69  .** <operator> i
1a8d0 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41  s one of UNION A
1a8e0 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  LL, UNION, EXCEP
1a8f0 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e  T, or INTERSECT.
1a900 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73    The idea.** is
1a910 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73   to code both <s
1a920 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c  electA> and <sel
1a930 65 63 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f  ectB> with the O
1a940 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
1a950 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73  s.** co-routines
1a960 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20  .  Then run the 
1a970 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70  co-routines in p
1a980 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67  arallel and merg
1a990 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
1a9a0 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
1a9b0 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  .  In addition t
1a9c0 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74  o the two corout
1a9d0 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c  ines (called sel
1a9e0 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65  ectA and.** sele
1a9f0 63 74 42 29 20 74 68 65 72 65 20 61 72 65 20 37  ctB) there are 7
1aa00 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a   subroutines:.**
1aa10 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20  .**    outA:    
1aa20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20  Move the output 
1aa30 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41 20 63  of the selectA c
1aa40 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68  oroutine into th
1aa50 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20  e output.**     
1aa60 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63          of the c
1aa70 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a  ompound query..*
1aa80 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20  *.**    outB:   
1aa90 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74   Move the output
1aaa0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42 20   of the selectB 
1aab0 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74  coroutine into t
1aac0 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20  he output.**    
1aad0 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
1aae0 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20  compound query. 
1aaf0 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64   (Only generated
1ab00 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a   for UNION and.*
1ab10 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e  *             UN
1ab20 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54  ION ALL.  EXCEPT
1ab30 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20   and INSERTSECT 
1ab40 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61 20 72  never output a r
1ab50 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ow that.**      
1ab60 20 20 20 20 20 20 20 61 70 70 65 61 72 73 20 6f         appears o
1ab70 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a  nly in B.).**.**
1ab80 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c      AltB:    Cal
1ab90 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
1aba0 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
1abb0 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
1abc0 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65  A<B..**.**    Ae
1abd0 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  qB:    Called wh
1abe0 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61  en there is data
1abf0 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75   from both corou
1ac00 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a  tines and A==B..
1ac10 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20  **.**    AgtB:  
1ac20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
1ac30 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
1ac40 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
1ac50 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20   and A>B..**.** 
1ac60 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c     EofA:    Call
1ac70 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20  ed when data is 
1ac80 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73  exhausted from s
1ac90 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20  electA..**.**   
1aca0 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64   EofB:    Called
1acb0 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78   when data is ex
1acc0 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c  hausted from sel
1acd0 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ectB..**.** The 
1ace0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
1acf0 66 20 74 68 65 20 6c 61 74 74 65 72 20 66 69 76  f the latter fiv
1ad00 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65  e subroutines de
1ad10 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a  pend on which .*
1ad20 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20  * <operator> is 
1ad30 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20  used:.**.**.**  
1ad40 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e             UNION
1ad50 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49   ALL         UNI
1ad60 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 45 58  ON            EX
1ad70 43 45 50 54 20 20 20 20 20 20 20 20 20 20 49 4e  CEPT          IN
1ad80 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20  TERSECT.**      
1ad90 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
1ada0 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
1adb0 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
1adc0 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
1add0 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74  -------.**   Alt
1ade0 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41  B:   outA, nextA
1adf0 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
1ae00 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  A       outA, ne
1ae10 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74  xtA         next
1ae20 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20  A.**.**   AeqB: 
1ae30 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
1ae40 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20        nextA     
1ae50 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20          nextA   
1ae60 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
1ae70 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20  A.**.**   AgtB: 
1ae80 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
1ae90 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
1aea0 20 20 20 20 20 20 20 20 6e 65 78 74 42 20 20 20          nextB   
1aeb0 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a           nextB.*
1aec0 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f  *.**   EofA:   o
1aed0 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
1aee0 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
1aef0 20 20 20 20 20 68 61 6c 74 20 20 20 20 20 20 20       halt       
1af00 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a        halt.**.**
1af10 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c     EofB:   outA,
1af20 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41   nextA      outA
1af30 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75  , nextA       ou
1af40 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
1af50 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20    halt.**.** In 
1af60 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  the AltB, AeqB, 
1af70 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75 74  and AgtB subrout
1af80 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20  ines, an EOF on 
1af90 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  A following next
1afa0 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69  A.** causes an i
1afb0 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f  mmediate jump to
1afc0 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46   EofA and an EOF
1afd0 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20   on B following 
1afe0 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20  nextB causes.** 
1aff0 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d  an immediate jum
1b000 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68  p to EofB.  With
1b010 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42  in EofA and EofB
1b020 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74  , and EOF on ent
1b030 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  ry or.** followi
1b040 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65 73 20  ng nextX causes 
1b050 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  a jump to the en
1b060 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  d of the select 
1b070 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a  processing..**.*
1b080 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f  * Duplicate remo
1b090 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e  val in the UNION
1b0a0 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e  , EXCEPT, and IN
1b0b0 54 45 52 53 45 43 54 20 63 61 73 65 73 20 69 73  TERSECT cases is
1b0c0 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68   handled.** with
1b0d0 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73 75  in the output su
1b0e0 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72  broutine.  The r
1b0f0 65 67 50 72 65 76 20 72 65 67 69 73 74 65 72 20  egPrev register 
1b100 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72  set holds the pr
1b110 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70  eviously.** outp
1b120 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d  ut value.  A com
1b130 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20  parison is made 
1b140 61 67 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c  against this val
1b150 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75  ue and the outpu
1b160 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20  t.** is skipped 
1b170 69 66 20 74 68 65 20 6e 65 78 74 20 72 65 73 75  if the next resu
1b180 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65  lts would be the
1b190 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 72 65   same as the pre
1b1a0 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  vious..**.** The
1b1b0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1b1c0 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65  plan is to imple
1b1d0 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72  ment the two cor
1b1e0 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65  outines and seve
1b1f0 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73  n.** subroutines
1b200 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74   first, then put
1b210 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67   the control log
1b220 69 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  ic at the bottom
1b230 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  .  Like this:.**
1b240 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74  .**          got
1b250 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f  o Init.**     co
1b260 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  A: coroutine for
1b270 20 6c 65 66 74 20 71 75 65 72 79 20 28 41 29 0a   left query (A).
1b280 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f  **     coB: coro
1b290 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20  utine for right 
1b2a0 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20  query (B).**    
1b2b0 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65  outA: output one
1b2c0 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20   row of A.**    
1b2d0 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65  outB: output one
1b2e0 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e   row of B (UNION
1b2f0 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   and UNION ALL o
1b300 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a  nly).**    EofA:
1b310 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a   ....**    EofB:
1b320 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a   ....**    AltB:
1b330 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a   ....**    AeqB:
1b340 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a   ....**    AgtB:
1b350 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a   ....**    Init:
1b360 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f   initialize coro
1b370 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a  utine registers.
1b380 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c  **          yiel
1b390 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20  d coA.**        
1b3a0 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f    if eof(A) goto
1b3b0 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20   EofA.**        
1b3c0 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20    yield coB.**  
1b3d0 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 42          if eof(B
1b3e0 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20  ) goto EofB.**  
1b3f0 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20    Cmpr: Compare 
1b400 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20  A, B.**         
1b410 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42   Jump AltB, AeqB
1b420 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e  , AgtB.**     En
1b430 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  d: ....**.** We 
1b440 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c  call AltB, AeqB,
1b450 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64   AgtB, EofA, and
1b460 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e   EofB "subroutin
1b470 65 73 22 20 62 75 74 20 74 68 65 79 20 61 72 65  es" but they are
1b480 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79   not.** actually
1b490 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f   called using Go
1b4a0 73 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20  sub and they do 
1b4b0 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66  not Return.  Eof
1b4c0 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a  A and EofB loop.
1b4d0 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74  ** until all dat
1b4e0 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20 74  a is exhausted t
1b4f0 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  hen jump to the 
1b500 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74  "end" labe.  Alt
1b510 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20  B, AeqB,.** and 
1b520 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74  AgtB jump to eit
1b530 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65  her L2 or to one
1b540 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42   of EofA or EofB
1b550 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
1b560 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
1b570 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20  D_SELECT.static 
1b580 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
1b590 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
1b5a0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
1b5b0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
1b5c0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
1b5d0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
1b5e0 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
1b5f0 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
1b600 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
1b610 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
1b620 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
1b630 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
1b640 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
1b650 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
1b660 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1b670 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  s */.  Select *p
1b680 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20  Prior;       /* 
1b690 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
1b6a0 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
1b6b0 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
1b6c0 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
1b6d0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1b6e0 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20  de to this VDBE 
1b6f0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
1b700 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65  destA;     /* De
1b710 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f  stination for co
1b720 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53  routine A */.  S
1b730 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 42 3b  electDest destB;
1b740 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74       /* Destinat
1b750 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e  ion for coroutin
1b760 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  e B */.  int reg
1b770 41 64 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f  AddrA;         /
1b780 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
1b790 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
1b7a0 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
1b7b0 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20 20 20  nt regAddrB;    
1b7c0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1b7d0 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
1b7e0 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20  ect-B coroutine 
1b7f0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c  */.  int addrSel
1b800 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64  ectA;      /* Ad
1b810 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
1b820 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20  ect-A coroutine 
1b830 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c  */.  int addrSel
1b840 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64  ectB;      /* Ad
1b850 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
1b860 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20  ect-B coroutine 
1b870 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41  */.  int regOutA
1b880 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ;          /* Ad
1b890 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
1b8a0 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20  or the output-A 
1b8b0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
1b8c0 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20  int regOutB;    
1b8d0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1b8e0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68   register for th
1b8f0 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f  e output-B subro
1b900 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
1b910 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20  ddrOutA;        
1b920 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
1b930 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72  he output-A subr
1b940 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1b950 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20 20  addrOutB = 0;   
1b960 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1b970 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62  the output-B sub
1b980 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1b990 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20   addrEofA;      
1b9a0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
1b9b0 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78   the select-A-ex
1b9c0 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69  hausted subrouti
1b9d0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
1b9e0 45 6f 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a  EofA_noB;     /*
1b9f0 20 41 6c 74 65 72 6e 61 74 65 20 61 64 64 72 45   Alternate addrE
1ba00 6f 66 41 20 69 66 20 42 20 69 73 20 75 6e 69 6e  ofA if B is unin
1ba10 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69  itialized */.  i
1ba20 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20  nt addrEofB;    
1ba30 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1ba40 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d  of the select-B-
1ba50 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75  exhausted subrou
1ba60 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
1ba70 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20  drAltB;         
1ba80 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
1ba90 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65  e A<B subroutine
1baa0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65   */.  int addrAe
1bab0 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  qB;         /* A
1bac0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d  ddress of the A=
1bad0 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  =B subroutine */
1bae0 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b  .  int addrAgtB;
1baf0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1bb00 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73  ess of the A>B s
1bb10 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
1bb20 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20  nt regLimitA;   
1bb30 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65       /* Limit re
1bb40 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
1bb50 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  t-A */.  int reg
1bb60 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f  LimitB;        /
1bb70 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72  * Limit register
1bb80 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f   for select-A */
1bb90 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20  .  int regPrev; 
1bba0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61           /* A ra
1bbb0 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nge of registers
1bbc0 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75   to hold previou
1bbd0 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e  s output */.  in
1bbe0 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20  t savedLimit;   
1bbf0 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c      /* Saved val
1bc00 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20  ue of p->iLimit 
1bc10 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66  */.  int savedOf
1bc20 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61  fset;      /* Sa
1bc30 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e  ved value of p->
1bc40 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74  iOffset */.  int
1bc50 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20   labelCmpr;     
1bc60 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20     /* Label for 
1bc70 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
1bc80 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d   merge algorithm
1bc90 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45   */.  int labelE
1bca0 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  nd;         /* L
1bcb0 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64  abel for the end
1bcc0 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20   of the overall 
1bcd0 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20  SELECT stmt */. 
1bce0 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20   int addr1;     
1bcf0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69         /* Jump i
1bd00 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74  nstructions that
1bd10 20 67 65 74 20 72 65 74 61 72 67 65 74 74 65 64   get retargetted
1bd20 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
1bd30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1bd40 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b  ne of TK_ALL, TK
1bd50 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50  _UNION, TK_EXCEP
1bd60 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  T, TK_INTERSECT 
1bd70 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
1bd80 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f  eyDup = 0; /* Co
1bd90 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61  mparison informa
1bda0 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61  tion for duplica
1bdb0 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20  te removal */.  
1bdc0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72  KeyInfo *pKeyMer
1bdd0 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69  ge;   /* Compari
1bde0 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  son information 
1bdf0 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73  for merging rows
1be00 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
1be10 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  b;          /* D
1be20 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1be30 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  on */.  ExprList
1be40 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a   *pOrderBy;   /*
1be50 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
1be60 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  ause */.  int nO
1be70 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20  rderBy;         
1be80 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
1be90 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ms in the ORDER 
1bea0 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
1beb0 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20  nt *aPermute;   
1bec0 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20       /* Mapping 
1bed0 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65  from ORDER BY te
1bee0 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65  rms to result se
1bef0 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20  t columns */..  
1bf00 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
1bf10 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rBy!=0 );.  asse
1bf20 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29  rt( pKeyDup==0 )
1bf30 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63  ; /* "Managed" c
1bf40 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20  ode needs this. 
1bf50 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a   Ticket #3382. *
1bf60 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
1bf70 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73  >db;.  v = pPars
1bf80 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
1bf90 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20  rt( v!=0 );     
1bfa0 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72    /* Already thr
1bfb0 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66  own the error if
1bfc0 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c   VDBE alloc fail
1bfd0 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64  ed */.  labelEnd
1bfe0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1bff0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61  keLabel(v);.  la
1c000 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65  belCmpr = sqlite
1c010 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1c020 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20  );...  /* Patch 
1c030 75 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  up the ORDER BY 
1c040 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70  clause.  */.  op
1c050 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50   = p->op;  .  pP
1c060 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
1c070 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
1c080 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  or->pOrderBy==0 
1c090 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  );.  pOrderBy = 
1c0a0 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61  p->pOrderBy;.  a
1c0b0 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20  ssert( pOrderBy 
1c0c0 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  );.  nOrderBy = 
1c0d0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
1c0e0 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61  ..  /* For opera
1c0f0 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20  tors other than 
1c100 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76  UNION ALL we hav
1c110 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
1c120 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44  hat.  ** the ORD
1c130 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76  ER BY clause cov
1c140 65 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f  ers every term o
1c150 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
1c160 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d  .  Add.  ** term
1c170 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42  s to the ORDER B
1c180 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65  Y clause as nece
1c190 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ssary..  */.  if
1c1a0 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op!=TK_ALL ){.
1c1b0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d      for(i=1; db-
1c1c0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
1c1d0 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74   && i<=p->pEList
1c1e0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
1c1f0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
1c200 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1c210 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c  ;.      for(j=0,
1c220 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d   pItem=pOrderBy-
1c230 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20  >a; j<nOrderBy; 
1c240 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  j++, pItem++){. 
1c250 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1c260 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
1c270 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20  ByCol>0 );.     
1c280 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e     if( pItem->u.
1c290 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69  x.iOrderByCol==i
1c2a0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1c2b0 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e  }.      if( j==n
1c2c0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
1c2d0 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20     Expr *pNew = 
1c2e0 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
1c2f0 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a  TK_INTEGER, 0);.
1c300 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
1c310 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
1c320 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
1c330 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c          pNew->fl
1c340 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c  ags |= EP_IntVal
1c350 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ue;.        pNew
1c360 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a  ->u.iValue = i;.
1c370 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65          p->pOrde
1c380 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 20 3d  rBy = pOrderBy =
1c390 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1c3a0 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
1c3b0 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a  OrderBy, pNew);.
1c3c0 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 64          if( pOrd
1c3d0 65 72 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d  erBy ) pOrderBy-
1c3e0 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75  >a[nOrderBy++].u
1c3f0 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d  .x.iOrderByCol =
1c400 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d   (u16)i;.      }
1c410 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1c420 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d   Compute the com
1c430 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74  parison permutat
1c440 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20  ion and keyinfo 
1c450 74 68 61 74 20 69 73 20 75 73 65 64 20 77 69 74  that is used wit
1c460 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75  h.  ** the permu
1c470 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64  tation used to d
1c480 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
1c490 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66  next.  ** row of
1c4a0 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66   results comes f
1c4b0 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73  rom selectA or s
1c4c0 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64  electB.  Also ad
1c4d0 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20  d explicit.  ** 
1c4e0 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68  collations to th
1c4f0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1c500 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20  e terms so that 
1c510 77 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72  when the subquer
1c520 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ies.  ** to the 
1c530 72 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65  right and the le
1c540 66 74 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ft are evaluated
1c550 2c 20 74 68 65 79 20 75 73 65 20 74 68 65 20 63  , they use the c
1c560 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c  orrect.  ** coll
1c570 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50  ation..  */.  aP
1c580 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33  ermute = sqlite3
1c590 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
1c5a0 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e  , sizeof(int)*(n
1c5b0 4f 72 64 65 72 42 79 20 2b 20 31 29 29 3b 0a 20  OrderBy + 1));. 
1c5c0 20 69 66 28 20 61 50 65 72 6d 75 74 65 20 29 7b   if( aPermute ){
1c5d0 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
1c5e0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1c5f0 3b 0a 20 20 20 20 61 50 65 72 6d 75 74 65 5b 30  ;.    aPermute[0
1c600 5d 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  ] = nOrderBy;.  
1c610 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 74 65 6d    for(i=1, pItem
1c620 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c  =pOrderBy->a; i<
1c630 3d 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20  =nOrderBy; i++, 
1c640 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
1c650 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75  assert( pItem->u
1c660 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30  .x.iOrderByCol>0
1c670 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1c680 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
1c690 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c  derByCol<=p->pEL
1c6a0 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
1c6b0 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69 5d 20      aPermute[i] 
1c6c0 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  = pItem->u.x.iOr
1c6d0 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20 20  derByCol - 1;.  
1c6e0 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72 67    }.    pKeyMerg
1c6f0 65 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  e = multiSelectO
1c700 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50  rderByKeyInfo(pP
1c710 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 7d  arse, p, 1);.  }
1c720 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65  else{.    pKeyMe
1c730 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  rge = 0;.  }..  
1c740 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68 65 20  /* Reattach the 
1c750 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1c760 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  to the query..  
1c770 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  */.  p->pOrderBy
1c780 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
1c790 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
1c7a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1c7b0 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  tDup(pParse->db,
1c7c0 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a   pOrderBy, 0);..
1c7d0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
1c7e0 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72 61  range of tempora
1c7f0 72 79 20 72 65 67 69 73 74 65 72 73 20 61 6e 64  ry registers and
1c800 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65   the KeyInfo nee
1c810 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ded.  ** for the
1c820 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65 6d 6f   logic that remo
1c830 76 65 73 20 64 75 70 6c 69 63 61 74 65 20 72 65  ves duplicate re
1c840 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e 20 74  sult rows when t
1c850 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  he.  ** operator
1c860 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50   is UNION, EXCEP
1c870 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 20  T, or INTERSECT 
1c880 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41  (but not UNION A
1c890 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  LL)..  */.  if( 
1c8a0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op==TK_ALL ){.  
1c8b0 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b 0a 20    regPrev = 0;. 
1c8c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1c8d0 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  nExpr = p->pELis
1c8e0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 73  t->nExpr;.    as
1c8f0 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d  sert( nOrderBy>=
1c900 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  nExpr || db->mal
1c910 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
1c920 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72 73   regPrev = pPars
1c930 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
1c940 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
1c950 45 78 70 72 2b 31 3b 0a 20 20 20 20 73 71 6c 69  Expr+1;.    sqli
1c960 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1c970 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
1c980 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20 70 4b  regPrev);.    pK
1c990 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65 33 4b  eyDup = sqlite3K
1c9a0 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20  eyInfoAlloc(db, 
1c9b0 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20 20 69  nExpr, 1);.    i
1c9c0 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20  f( pKeyDup ){.  
1c9d0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
1c9e0 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
1c9f0 65 61 62 6c 65 28 70 4b 65 79 44 75 70 29 20 29  eable(pKeyDup) )
1ca00 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
1ca10 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a   i<nExpr; i++){.
1ca20 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d          pKeyDup-
1ca30 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74  >aColl[i] = mult
1ca40 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
1ca50 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20  Parse, p, i);.  
1ca60 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61        pKeyDup->a
1ca70 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30  SortOrder[i] = 0
1ca80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ca90 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72    }. .  /* Separ
1caa0 61 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e 64  ate the left and
1cab0 20 74 68 65 20 72 69 67 68 74 20 71 75 65 72 79   the right query
1cac0 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65   from one anothe
1cad0 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69  r.  */.  p->pPri
1cae0 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f 72  or = 0;.  pPrior
1caf0 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 73  ->pNext = 0;.  s
1cb00 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64  qlite3ResolveOrd
1cb10 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65  erGroupBy(pParse
1cb20 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  , p, p->pOrderBy
1cb30 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 69 66  , "ORDER");.  if
1cb40 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72  ( pPrior->pPrior
1cb50 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
1cb60 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  e3ResolveOrderGr
1cb70 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 50  oupBy(pParse, pP
1cb80 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f  rior, pPrior->pO
1cb90 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29  rderBy, "ORDER")
1cba0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
1cbb0 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20 72 65  ute the limit re
1cbc0 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d  gisters */.  com
1cbd0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
1cbe0 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 6c 61  rs(pParse, p, la
1cbf0 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20 70  belEnd);.  if( p
1cc00 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d  ->iLimit && op==
1cc10 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65  TK_ALL ){.    re
1cc20 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72  gLimitA = ++pPar
1cc30 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65  se->nMem;.    re
1cc40 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72  gLimitB = ++pPar
1cc50 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
1cc60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1cc70 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69  v, OP_Copy, p->i
1cc80 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66  Offset ? p->iOff
1cc90 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69  set+1 : p->iLimi
1cca0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
1ccb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccc0 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41 29 3b       regLimitA);
1ccd0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1cce0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
1ccf0 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20 72 65  y, regLimitA, re
1cd00 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73  gLimitB);.  }els
1cd10 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41  e{.    regLimitA
1cd20 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 30   = regLimitB = 0
1cd30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
1cd40 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
1cd50 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70  >pLimit);.  p->p
1cd60 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 72 65  Limit = 0;..  re
1cd70 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72 73  gAddrA = ++pPars
1cd80 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64  e->nMem;.  regAd
1cd90 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  drB = ++pParse->
1cda0 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20  nMem;.  regOutA 
1cdb0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1cdc0 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b  ;.  regOutB = ++
1cdd0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1cde0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
1cdf0 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52  tInit(&destA, SR
1ce00 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  T_Coroutine, reg
1ce10 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65  AddrA);.  sqlite
1ce20 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
1ce30 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f  &destB, SRT_Coro
1ce40 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29  utine, regAddrB)
1ce50 3b 0a 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72  ;..  ExplainQuer
1ce60 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31  yPlan((pParse, 1
1ce70 2c 20 22 4d 45 52 47 45 20 28 25 73 29 22 2c 20  , "MERGE (%s)", 
1ce80 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
1ce90 6f 70 29 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  op)));..  /* Gen
1cea0 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e  erate a coroutin
1ceb0 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
1cec0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1ced0 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c  nt to the.  ** l
1cee0 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  eft of the compo
1cef0 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74  und operator - t
1cf00 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20  he "A" select.. 
1cf10 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74   */.  addrSelect
1cf20 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  A = sqlite3VdbeC
1cf30 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
1cf40 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  1;.  addr1 = sql
1cf50 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1cf60 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
1cf70 6e 65 2c 20 72 65 67 41 64 64 72 41 2c 20 30 2c  ne, regAddrA, 0,
1cf80 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20   addrSelectA);. 
1cf90 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1cfa0 20 22 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29   "left SELECT"))
1cfb0 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d  ;.  pPrior->iLim
1cfc0 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a  it = regLimitA;.
1cfd0 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
1cfe0 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22  an((pParse, 1, "
1cff0 4c 45 46 54 22 29 29 3b 0a 20 20 73 71 6c 69 74  LEFT"));.  sqlit
1d000 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
1d010 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29   pPrior, &destA)
1d020 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 45  ;.  sqlite3VdbeE
1d030 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72  ndCoroutine(v, r
1d040 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69  egAddrA);.  sqli
1d050 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
1d060 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 2f 2a  v, addr1);..  /*
1d070 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f   Generate a coro
1d080 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74  utine to evaluat
1d090 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
1d0a0 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20  tement on .  ** 
1d0b0 74 68 65 20 72 69 67 68 74 20 2d 20 74 68 65 20  the right - the 
1d0c0 22 42 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a  "B" select.  */.
1d0d0 20 20 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20    addrSelectB = 
1d0e0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1d0f0 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20  ntAddr(v) + 1;. 
1d100 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
1d110 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1d120 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
1d130 72 65 67 41 64 64 72 42 2c 20 30 2c 20 61 64 64  regAddrB, 0, add
1d140 72 53 65 6c 65 63 74 42 29 3b 0a 20 20 56 64 62  rSelectB);.  Vdb
1d150 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 69  eComment((v, "ri
1d160 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20  ght SELECT"));. 
1d170 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d   savedLimit = p-
1d180 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65 64  >iLimit;.  saved
1d190 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66  Offset = p->iOff
1d1a0 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74  set;.  p->iLimit
1d1b0 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20   = regLimitB;.  
1d1c0 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 20  p->iOffset = 0; 
1d1d0 20 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79   .  ExplainQuery
1d1e0 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c  Plan((pParse, 1,
1d1f0 20 22 52 49 47 48 54 22 29 29 3b 0a 20 20 73 71   "RIGHT"));.  sq
1d200 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
1d210 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29 3b 0a  se, p, &destB);.
1d220 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61    p->iLimit = sa
1d230 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69  vedLimit;.  p->i
1d240 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f 66  Offset = savedOf
1d250 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 56  fset;.  sqlite3V
1d260 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28  dbeEndCoroutine(
1d270 76 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20  v, regAddrB);.. 
1d280 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
1d290 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
1d2a0 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65  utputs the curre
1d2b0 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a  nt row of the A.
1d2c0 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74    ** select as t
1d2d0 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72  he next output r
1d2e0 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ow of the compou
1d2f0 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  nd select..  */.
1d300 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1d310 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f  t((v, "Output ro
1d320 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a  utine for A"));.
1d330 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67 65 6e    addrOutA = gen
1d340 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f  erateOutputSubro
1d350 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20  utine(pParse,.  
1d360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1d370 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73 74 2c  , &destA, pDest,
1d380 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20 20 20   regOutA,.      
1d390 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72             regPr
1d3a0 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62  ev, pKeyDup, lab
1d3b0 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20  elEnd);.  .  /* 
1d3c0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
1d3d0 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
1d3e0 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ts the current r
1d3f0 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a  ow of the B.  **
1d400 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e   select as the n
1d410 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f  ext output row o
1d420 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
1d430 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  elect..  */.  if
1d440 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ( op==TK_ALL || 
1d450 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
1d460 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
1d470 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20  ent((v, "Output 
1d480 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29  routine for B"))
1d490 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d  ;.    addrOutB =
1d4a0 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
1d4b0 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65  ubroutine(pParse
1d4c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d4d0 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44     p, &destB, pD
1d4e0 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20  est, regOutB,.  
1d4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1d500 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c  egPrev, pKeyDup,
1d510 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a   labelEnd);.  }.
1d520 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
1d530 55 6e 72 65 66 28 70 4b 65 79 44 75 70 29 3b 0a  Unref(pKeyDup);.
1d540 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1d550 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72   subroutine to r
1d560 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  un when the resu
1d570 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20  lts from select 
1d580 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75  A.  ** are exhau
1d590 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61  sted and only da
1d5a0 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20 72  ta in select B r
1d5b0 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  emains..  */.  i
1d5c0 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  f( op==TK_EXCEPT
1d5d0 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52   || op==TK_INTER
1d5e0 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
1d5f0 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64 64 72 45  EofA_noB = addrE
1d600 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a  ofA = labelEnd;.
1d610 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56    }else{  .    V
1d620 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1d630 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f 75  v, "eof-A subrou
1d640 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64  tine"));.    add
1d650 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56  rEofA = sqlite3V
1d660 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1d670 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20  Gosub, regOutB, 
1d680 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 61  addrOutB);.    a
1d690 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 73 71  ddrEofA_noB = sq
1d6a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1d6b0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1d6c0 41 64 64 72 42 2c 20 6c 61 62 65 6c 45 6e 64 29  AddrB, labelEnd)
1d6d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6f0 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
1d700 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
1d710 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
1d720 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d  ddrEofA);.    p-
1d730 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71  >nSelectRow = sq
1d740 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70  lite3LogEstAdd(p
1d750 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50  ->nSelectRow, pP
1d760 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
1d770 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
1d780 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
1d790 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74  ne to run when t
1d7a0 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  he results from 
1d7b0 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72  select B.  ** ar
1d7c0 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20  e exhausted and 
1d7d0 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c  only data in sel
1d7e0 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20  ect A remains.. 
1d7f0 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
1d800 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
1d810 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64    addrEofB = add
1d820 72 45 6f 66 41 3b 0a 20 20 20 20 69 66 28 20 70  rEofA;.    if( p
1d830 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 70  ->nSelectRow > p
1d840 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
1d850 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  w ) p->nSelectRo
1d860 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  w = pPrior->nSel
1d870 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b  ectRow;.  }else{
1d880 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43    .    VdbeNoopC
1d890 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d  omment((v, "eof-
1d8a0 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
1d8b0 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20  .    addrEofB = 
1d8c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d8d0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
1d8e0 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41  egOutA, addrOutA
1d8f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1d900 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1d910 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
1d920 6c 61 62 65 6c 45 6e 64 29 3b 20 56 64 62 65 43  labelEnd); VdbeC
1d930 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1d940 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1d950 76 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20  v, addrEofB);.  
1d960 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
1d970 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
1d980 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c 42 0a  the case of A<B.
1d990 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
1d9a0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74  omment((v, "A-lt
1d9b0 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
1d9c0 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d 20 73  ;.  addrAltB = s
1d9d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1d9e0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
1d9f0 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29  gOutA, addrOutA)
1da00 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1da10 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1da20 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64  d, regAddrA, add
1da30 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65  rEofA); VdbeCove
1da40 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
1da50 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61  e3VdbeGoto(v, la
1da60 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20  belCmpr);..  /* 
1da70 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1da80 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
1da90 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20   of A==B.  */.  
1daa0 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  if( op==TK_ALL )
1dab0 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d  {.    addrAeqB =
1dac0 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c   addrAltB;.  }el
1dad0 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  se if( op==TK_IN
1dae0 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
1daf0 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c  ddrAeqB = addrAl
1db00 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42  tB;.    addrAltB
1db10 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
1db20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1db30 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62  ((v, "A-eq-B sub
1db40 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20  routine"));.    
1db50 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73  addrAeqB =.    s
1db60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1db70 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1db80 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41  gAddrA, addrEofA
1db90 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1dba0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
1dbb0 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c  dbeGoto(v, label
1dbc0 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Cmpr);.  }..  /*
1dbd0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1dbe0 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
1dbf0 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20  e of A>B.  */.  
1dc00 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1dc10 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72  (v, "A-gt-B subr
1dc20 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64  outine"));.  add
1dc30 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56  rAgtB = sqlite3V
1dc40 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1dc50 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  );.  if( op==TK_
1dc60 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e  ALL || op==TK_UN
1dc70 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ION ){.    sqlit
1dc80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1dc90 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
1dca0 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20  B, addrOutB);.  
1dcb0 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
1dcc0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1dcd0 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64  d, regAddrB, add
1dce0 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65  rEofB); VdbeCove
1dcf0 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
1dd00 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61  e3VdbeGoto(v, la
1dd10 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20  belCmpr);..  /* 
1dd20 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73 20 6f  This code runs o
1dd30 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  nce to initializ
1dd40 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20  e everything..  
1dd50 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1dd60 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
1dd70 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
1dd80 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1dd90 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61  eld, regAddrA, a
1dda0 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 20 56 64  ddrEofA_noB); Vd
1ddb0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1ddc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ddd0 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1dde0 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f  regAddrB, addrEo
1ddf0 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  fB); VdbeCoverag
1de00 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c  e(v);..  /* Impl
1de10 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d  ement the main m
1de20 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20  erge loop.  */. 
1de30 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1de40 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
1de50 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  lCmpr);.  sqlite
1de60 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1de70 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30  P_Permutation, 0
1de80 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61  , 0, 0, (char*)a
1de90 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41  Permute, P4_INTA
1dea0 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33  RRAY);.  sqlite3
1deb0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1dec0 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e  _Compare, destA.
1ded0 69 53 64 73 74 2c 20 64 65 73 74 42 2e 69 53 64  iSdst, destB.iSd
1dee0 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20  st, nOrderBy,.  
1def0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df00 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
1df10 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59 49  eyMerge, P4_KEYI
1df20 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  NFO);.  sqlite3V
1df30 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
1df40 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b 0a  PFLAG_PERMUTE);.
1df50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1df60 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
1df70 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41 65  addrAltB, addrAe
1df80 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b 20 56  qB, addrAgtB); V
1df90 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1dfa0 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
1dfb0 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  e this point in 
1dfc0 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e 61  order to termina
1dfd0 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  te the query..  
1dfe0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1dff0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1e000 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a  labelEnd);..  /*
1e010 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20   Reassembly the 
1e020 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73  compound query s
1e030 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62  o that it will b
1e040 65 20 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c  e freed correctl
1e050 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61  y.  ** by the ca
1e060 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a  lling function *
1e070 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
1e080 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
1e090 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
1e0a0 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d   p->pPrior);.  }
1e0b0 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70  .  p->pPrior = p
1e0c0 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72 2d  Prior;.  pPrior-
1e0d0 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20 2f  >pNext = p;..  /
1e0e0 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72 74  *** TBD:  Insert
1e0f0 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c   subroutine call
1e100 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f  s to close curso
1e110 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65  rs on incomplete
1e120 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69  .  **** subqueri
1e130 65 73 20 2a 2a 2a 2a 2f 0a 20 20 45 78 70 6c 61  es ****/.  Expla
1e140 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f 70 28 70  inQueryPlanPop(p
1e150 50 61 72 73 65 29 3b 0a 20 20 72 65 74 75 72 6e  Parse);.  return
1e160 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 21 3d 30   pParse->nErr!=0
1e170 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
1e180 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1e190 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
1e1a0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
1e1b0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 0a 2f 2a  E_OMIT_VIEW)../*
1e1c0 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
1e1d0 74 68 65 20 53 75 62 73 74 43 6f 6e 74 65 78 74  the SubstContext
1e1e0 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62 65   object describe
1e1f0 73 20 61 6e 20 73 75 62 73 74 69 74 75 74 69 6f  s an substitutio
1e200 6e 20 65 64 69 74 0a 2a 2a 20 74 6f 20 62 65 20  n edit.** to be 
1e210 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 61 20 70  performed on a p
1e220 61 72 73 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a  arse tree..**.**
1e230 20 41 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20   All references 
1e240 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61  to columns in ta
1e250 62 6c 65 20 69 54 61 62 6c 65 20 61 72 65 20 74  ble iTable are t
1e260 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20 62 79  o be replaced by
1e270 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
1e280 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  * expressions in
1e290 20 70 45 4c 69 73 74 2e 0a 2a 2f 0a 74 79 70 65   pEList..*/.type
1e2a0 64 65 66 20 73 74 72 75 63 74 20 53 75 62 73 74  def struct Subst
1e2b0 43 6f 6e 74 65 78 74 20 7b 0a 20 20 50 61 72 73  Context {.  Pars
1e2c0 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
1e2d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
1e2e0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1e2f0 20 20 69 6e 74 20 69 54 61 62 6c 65 3b 20 20 20    int iTable;   
1e300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1e310 65 70 6c 61 63 65 20 72 65 66 65 72 65 6e 63 65  eplace reference
1e320 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  s to this table 
1e330 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77 54 61 62  */.  int iNewTab
1e340 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  le;            /
1e350 2a 20 4e 65 77 20 74 61 62 6c 65 20 6e 75 6d 62  * New table numb
1e360 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c 65  er */.  int isLe
1e370 66 74 4a 6f 69 6e 3b 20 20 20 20 20 20 20 20 20  ftJoin;         
1e380 20 20 2f 2a 20 41 64 64 20 54 4b 5f 49 46 5f 4e    /* Add TK_IF_N
1e390 55 4c 4c 5f 52 4f 57 20 6f 70 63 6f 64 65 73 20  ULL_ROW opcodes 
1e3a0 6f 6e 20 65 61 63 68 20 72 65 70 6c 61 63 65 6d  on each replacem
1e3b0 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ent */.  ExprLis
1e3c0 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
1e3d0 20 20 20 2f 2a 20 52 65 70 6c 61 63 65 6d 65 6e     /* Replacemen
1e3e0 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f  t expressions */
1e3f0 0a 7d 20 53 75 62 73 74 43 6f 6e 74 65 78 74 3b  .} SubstContext;
1e400 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63  ../* Forward Dec
1e410 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61  larations */.sta
1e420 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
1e430 70 72 4c 69 73 74 28 53 75 62 73 74 43 6f 6e 74  prList(SubstCont
1e440 65 78 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29  ext*, ExprList*)
1e450 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  ;.static void su
1e460 62 73 74 53 65 6c 65 63 74 28 53 75 62 73 74 43  bstSelect(SubstC
1e470 6f 6e 74 65 78 74 2a 2c 20 53 65 6c 65 63 74 2a  ontext*, Select*
1e480 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53  , int);../*.** S
1e490 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  can through the 
1e4a0 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
1e4b0 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79  .  Replace every
1e4c0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a   reference to.**
1e4d0 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62   a column in tab
1e4e0 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65  le number iTable
1e4f0 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
1e500 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a  the iColumn-th.*
1e510 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73  * entry in pELis
1e520 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72  t.  (But leave r
1e530 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
1e540 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a   ROWID column .*
1e550 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a  * unchanged.).**
1e560 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1e570 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
1e580 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65  flattening proce
1e590 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72  dure.  A subquer
1e5a0 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c  y.** whose resul
1e5b0 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64  t set is defined
1e5c0 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61   by pEList appea
1e5d0 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74  rs as entry in t
1e5e0 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73  he.** FROM claus
1e5f0 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75  e of a SELECT su
1e600 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45  ch that the VDBE
1e610 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64   cursor assigned
1e620 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d   to that.** FORM
1e630 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73   clause entry is
1e640 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72   iTable.  This r
1e650 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 74 68 65  outine makes the
1e660 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63   necessary .** c
1e670 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20  hanges to pExpr 
1e680 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65 72  so that it refer
1e690 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  s directly to th
1e6a0 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a  e source table.*
1e6b0 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
1e6c0 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65 73  y rather the res
1e6d0 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 73  ult set of the s
1e6e0 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  ubquery..*/.stat
1e6f0 69 63 20 45 78 70 72 20 2a 73 75 62 73 74 45 78  ic Expr *substEx
1e700 70 72 28 0a 20 20 53 75 62 73 74 43 6f 6e 74 65  pr(.  SubstConte
1e710 78 74 20 2a 70 53 75 62 73 74 2c 20 20 2f 2a 20  xt *pSubst,  /* 
1e720 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
1e730 68 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20  he substitution 
1e740 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
1e750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
1e760 78 70 72 20 69 6e 20 77 68 69 63 68 20 73 75 62  xpr in which sub
1e770 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73  stitution occurs
1e780 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78   */.){.  if( pEx
1e790 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  pr==0 ) return 0
1e7a0 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
1e7b0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1e7c0 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 26  P_FromJoin).   &
1e7d0 26 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a  & pExpr->iRightJ
1e7e0 6f 69 6e 54 61 62 6c 65 3d 3d 70 53 75 62 73 74  oinTable==pSubst
1e7f0 2d 3e 69 54 61 62 6c 65 0a 20 20 29 7b 0a 20 20  ->iTable.  ){.  
1e800 20 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a    pExpr->iRightJ
1e810 6f 69 6e 54 61 62 6c 65 20 3d 20 70 53 75 62 73  oinTable = pSubs
1e820 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20  t->iNewTable;.  
1e830 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  }.  if( pExpr->o
1e840 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
1e850 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
1e860 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 20 29 7b  Subst->iTable ){
1e870 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
1e880 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
1e890 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
1e8a0 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73  K_NULL;.    }els
1e8b0 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
1e8c0 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20  New;.      Expr 
1e8d0 2a 70 43 6f 70 79 20 3d 20 70 53 75 62 73 74 2d  *pCopy = pSubst-
1e8e0 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72  >pEList->a[pExpr
1e8f0 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72  ->iColumn].pExpr
1e900 3b 0a 20 20 20 20 20 20 45 78 70 72 20 69 66 4e  ;.      Expr ifN
1e910 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20 61 73  ullRow;.      as
1e920 73 65 72 74 28 20 70 53 75 62 73 74 2d 3e 70 45  sert( pSubst->pE
1e930 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70 72  List!=0 && pExpr
1e940 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 53 75 62 73 74  ->iColumn<pSubst
1e950 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
1e960 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e970 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30   pExpr->pLeft==0
1e980 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68   && pExpr->pRigh
1e990 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  t==0 );.      if
1e9a0 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56  ( sqlite3ExprIsV
1e9b0 65 63 74 6f 72 28 70 43 6f 70 79 29 20 29 7b 0a  ector(pCopy) ){.
1e9c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1e9d0 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 70 53  ectorErrorMsg(pS
1e9e0 75 62 73 74 2d 3e 70 50 61 72 73 65 2c 20 70 43  ubst->pParse, pC
1e9f0 6f 70 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  opy);.      }els
1ea00 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
1ea10 65 33 20 2a 64 62 20 3d 20 70 53 75 62 73 74 2d  e3 *db = pSubst-
1ea20 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20  >pParse->db;.   
1ea30 20 20 20 20 20 69 66 28 20 70 53 75 62 73 74 2d       if( pSubst-
1ea40 3e 69 73 4c 65 66 74 4a 6f 69 6e 20 26 26 20 70  >isLeftJoin && p
1ea50 43 6f 70 79 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Copy->op!=TK_COL
1ea60 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
1ea70 20 6d 65 6d 73 65 74 28 26 69 66 4e 75 6c 6c 52   memset(&ifNullR
1ea80 6f 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 66  ow, 0, sizeof(if
1ea90 4e 75 6c 6c 52 6f 77 29 29 3b 0a 20 20 20 20 20  NullRow));.     
1eaa0 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 6f       ifNullRow.o
1eab0 70 20 3d 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52  p = TK_IF_NULL_R
1eac0 4f 57 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  OW;.          if
1ead0 4e 75 6c 6c 52 6f 77 2e 70 4c 65 66 74 20 3d 20  NullRow.pLeft = 
1eae0 70 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 20  pCopy;.         
1eaf0 20 69 66 4e 75 6c 6c 52 6f 77 2e 69 54 61 62 6c   ifNullRow.iTabl
1eb00 65 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65 77  e = pSubst->iNew
1eb10 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
1eb20 20 70 43 6f 70 79 20 3d 20 26 69 66 4e 75 6c 6c   pCopy = &ifNull
1eb30 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Row;.        }. 
1eb40 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
1eb50 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
1eb60 20 70 43 6f 70 79 2c 20 30 29 3b 0a 20 20 20 20   pCopy, 0);.    
1eb70 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20      if( pNew && 
1eb80 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74 4a 6f  pSubst->isLeftJo
1eb90 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  in ){.          
1eba0 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
1ebb0 70 4e 65 77 2c 20 45 50 5f 43 61 6e 42 65 4e 75  pNew, EP_CanBeNu
1ebc0 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ll);.        }. 
1ebd0 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20         if( pNew 
1ebe0 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
1ebf0 74 79 28 70 45 78 70 72 2c 45 50 5f 46 72 6f 6d  ty(pExpr,EP_From
1ec00 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  Join) ){.       
1ec10 20 20 20 70 4e 65 77 2d 3e 69 52 69 67 68 74 4a     pNew->iRightJ
1ec20 6f 69 6e 54 61 62 6c 65 20 3d 20 70 45 78 70 72  oinTable = pExpr
1ec30 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
1ec40 65 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  e;.          Exp
1ec50 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 4e 65  rSetProperty(pNe
1ec60 77 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  w, EP_FromJoin);
1ec70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ec80 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
1ec90 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
1eca0 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d  .        pExpr =
1ecb0 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20   pNew;.      }. 
1ecc0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1ecd0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
1ece0 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20  =TK_IF_NULL_ROW 
1ecf0 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  && pExpr->iTable
1ed00 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c 65  ==pSubst->iTable
1ed10 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
1ed20 3e 69 54 61 62 6c 65 20 3d 20 70 53 75 62 73 74  >iTable = pSubst
1ed30 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20  ->iNewTable;.   
1ed40 20 7d 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c   }.    pExpr->pL
1ed50 65 66 74 20 3d 20 73 75 62 73 74 45 78 70 72 28  eft = substExpr(
1ed60 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 70  pSubst, pExpr->p
1ed70 4c 65 66 74 29 3b 0a 20 20 20 20 70 45 78 70 72  Left);.    pExpr
1ed80 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73 74  ->pRight = subst
1ed90 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 45 78  Expr(pSubst, pEx
1eda0 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
1edb0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
1edc0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
1edd0 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
1ede0 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 70     substSelect(p
1edf0 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 78 2e  Subst, pExpr->x.
1ee00 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20 20 20  pSelect, 1);.   
1ee10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75   }else{.      su
1ee20 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62  bstExprList(pSub
1ee30 73 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  st, pExpr->x.pLi
1ee40 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  st);.    }.  }. 
1ee50 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d   return pExpr;.}
1ee60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
1ee70 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20 53 75  stExprList(.  Su
1ee80 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62  bstContext *pSub
1ee90 73 74 2c 20 2f 2a 20 44 65 73 63 72 69 70 74 69  st, /* Descripti
1eea0 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74 69  on of the substi
1eeb0 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  tution */.  Expr
1eec0 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20 20 20  List *pList     
1eed0 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63 61    /* List to sca
1eee0 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20 74  n and in which t
1eef0 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74  o make substitut
1ef00 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  es */.){.  int i
1ef10 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
1ef20 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
1ef30 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
1ef40 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1ef50 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
1ef60 72 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53  r = substExpr(pS
1ef70 75 62 73 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  ubst, pList->a[i
1ef80 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a  ].pExpr);.  }.}.
1ef90 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
1efa0 74 53 65 6c 65 63 74 28 0a 20 20 53 75 62 73 74  tSelect(.  Subst
1efb0 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74 2c  Context *pSubst,
1efc0 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1efd0 6f 66 20 74 68 65 20 73 75 62 73 74 69 74 75 74  of the substitut
1efe0 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ion */.  Select 
1eff0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
1f000 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
1f010 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d  nt in which to m
1f020 61 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  ake substitution
1f030 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 50 72 69  s */.  int doPri
1f040 6f 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or           /* 
1f050 44 6f 20 73 75 62 73 74 69 74 75 74 65 73 20 6f  Do substitutes o
1f060 6e 20 70 2d 3e 70 50 72 69 6f 72 20 74 6f 6f 20  n p->pPrior too 
1f070 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20  */.){.  SrcList 
1f080 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74 20  *pSrc;.  struct 
1f090 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1f0a0 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tem;.  int i;.  
1f0b0 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b  if( !p ) return;
1f0c0 0a 20 20 64 6f 7b 0a 20 20 20 20 73 75 62 73 74  .  do{.    subst
1f0d0 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c  ExprList(pSubst,
1f0e0 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
1f0f0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
1f100 53 75 62 73 74 2c 20 70 2d 3e 70 47 72 6f 75 70  Subst, p->pGroup
1f110 42 79 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  By);.    substEx
1f120 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70  prList(pSubst, p
1f130 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
1f140 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75   p->pHaving = su
1f150 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20  bstExpr(pSubst, 
1f160 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  p->pHaving);.   
1f170 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62   p->pWhere = sub
1f180 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70  stExpr(pSubst, p
1f190 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 70  ->pWhere);.    p
1f1a0 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
1f1b0 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21     assert( pSrc!
1f1c0 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  =0 );.    for(i=
1f1d0 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74 65  pSrc->nSrc, pIte
1f1e0 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b 20  m=pSrc->a; i>0; 
1f1f0 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i--, pItem++){. 
1f200 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74       substSelect
1f210 28 70 53 75 62 73 74 2c 20 70 49 74 65 6d 2d 3e  (pSubst, pItem->
1f220 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20 20 20  pSelect, 1);.   
1f230 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
1f240 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20  .isTabFunc ){.  
1f250 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c        substExprL
1f260 69 73 74 28 70 53 75 62 73 74 2c 20 70 49 74 65  ist(pSubst, pIte
1f270 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 29 3b  m->u1.pFuncArg);
1f280 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f290 20 7d 77 68 69 6c 65 28 20 64 6f 50 72 69 6f 72   }while( doPrior
1f2a0 20 26 26 20 28 70 20 3d 20 70 2d 3e 70 50 72 69   && (p = p->pPri
1f2b0 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a 23 65 6e 64  or)!=0 );.}.#end
1f2c0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
1f2d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1f2e0 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
1f2f0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
1f300 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  W) */..#if !defi
1f310 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1f320 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
1f330 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1f340 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68  T_VIEW)./*.** Th
1f350 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
1f360 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73  pts to flatten s
1f370 75 62 71 75 65 72 69 65 73 20 61 73 20 61 20 70  ubqueries as a p
1f380 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d  erformance optim
1f390 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ization..** This
1f3a0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1f3b0 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63   1 if it makes c
1f3c0 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20  hanges and 0 if 
1f3d0 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 63  no flattening oc
1f3e0 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75  curs..**.** To u
1f3f0 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f  nderstand the co
1f400 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e  ncept of flatten
1f410 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68  ing, consider th
1f420 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71  e following.** q
1f430 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  uery:.**.**     
1f440 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53  SELECT a FROM (S
1f450 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
1f460 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
1f470 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a  00) WHERE a>5.**
1f480 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
1f490 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74  way of implement
1f4a0 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69  ing this query i
1f4b0 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  s to execute the
1f4c0 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72  .** subquery fir
1f4d0 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  st and store the
1f4e0 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65   results in a te
1f4f0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74  mporary table, t
1f500 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f  hen.** run the o
1f510 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68  uter query on th
1f520 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  at temporary tab
1f530 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72  le.  This requir
1f540 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73  es two.** passes
1f550 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20   over the data. 
1f560 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65   Furthermore, be
1f570 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72  cause the tempor
1f580 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73  ary table.** has
1f590 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65   no indices, the
1f5a0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e   WHERE clause on
1f5b0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1f5c0 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70   cannot be.** op
1f5d0 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  timized..**.** T
1f5e0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
1f5f0 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20  mpts to rewrite 
1f600 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20  queries such as 
1f610 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a  the above into.*
1f620 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20  * a single flat 
1f630 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69  select, like thi
1f640 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
1f650 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f  ECT x+y AS a FRO
1f660 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30  M t1 WHERE z<100
1f670 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54   AND a>5.**.** T
1f680 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
1f690 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 6c  d for this simpl
1f6a0 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20  ification gives 
1f6b0 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a  the same result.
1f6c0 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20  ** but only has 
1f6d0 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61  to scan the data
1f6e0 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61   once.  And beca
1f6f0 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68  use indices migh
1f700 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74  t .** exist on t
1f710 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63  he table t1, a c
1f720 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20  omplete scan of 
1f730 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62  the data might b
1f740 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a  e.** avoided..**
1f750 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69  .** Flattening i
1f760 73 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65  s subject to the
1f770 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74   following const
1f780 72 61 69 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 28  raints:.**.**  (
1f790 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65  **)  We no longe
1f7a0 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61  r attempt to fla
1f7b0 74 74 65 6e 20 61 67 67 72 65 67 61 74 65 20 73  tten aggregate s
1f7c0 75 62 71 75 65 72 69 65 73 2e 20 57 61 73 3a 0a  ubqueries. Was:.
1f7d0 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 73 75  **        The su
1f7e0 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
1f7f0 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f  uter query canno
1f800 74 20 62 6f 74 68 20 62 65 20 61 67 67 72 65 67  t both be aggreg
1f810 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  ates..**.**  (**
1f820 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20  )  We no longer 
1f830 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74  attempt to flatt
1f840 65 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62  en aggregate sub
1f850 71 75 65 72 69 65 73 2e 20 57 61 73 3a 0a 2a 2a  queries. Was:.**
1f860 20 20 20 20 20 20 20 20 28 32 29 20 49 66 20 74          (2) If t
1f870 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61  he subquery is a
1f880 6e 20 61 67 67 72 65 67 61 74 65 20 74 68 65 6e  n aggregate then
1f890 0a 2a 2a 20 20 20 20 20 20 20 20 28 32 61 29 20  .**        (2a) 
1f8a0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1f8b0 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 20 6a 6f  must not be a jo
1f8c0 69 6e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  in and.**       
1f8d0 20 28 32 62 29 20 74 68 65 20 6f 75 74 65 72 20   (2b) the outer 
1f8e0 71 75 65 72 79 20 6d 75 73 74 20 6e 6f 74 20 75  query must not u
1f8f0 73 65 20 73 75 62 71 75 65 72 69 65 73 0a 2a 2a  se subqueries.**
1f900 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 74 68               oth
1f910 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 20  er than the one 
1f920 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
1f930 75 65 72 79 20 74 68 61 74 20 69 73 20 61 20 63  uery that is a c
1f940 61 6e 64 69 64 61 74 65 0a 2a 2a 20 20 20 20 20  andidate.**     
1f950 20 20 20 20 20 20 20 20 66 6f 72 20 66 6c 61 74          for flat
1f960 74 65 6e 69 6e 67 2e 20 20 28 54 68 69 73 20 69  tening.  (This i
1f970 73 20 64 75 65 20 74 6f 20 74 69 63 6b 65 74 20  s due to ticket 
1f980 5b 32 66 37 31 37 30 64 37 33 62 66 39 61 62 66  [2f7170d73bf9abf
1f990 38 30 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  80].**          
1f9a0 20 20 20 66 72 6f 6d 20 32 30 31 35 2d 30 32 2d     from 2015-02-
1f9b0 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29  09.).**.**   (3)
1f9c0 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1f9d0 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f  y is the right o
1f9e0 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54  perand of a LEFT
1f9f0 20 4a 4f 49 4e 20 74 68 65 6e 0a 2a 2a 20 20 20   JOIN then.**   
1fa00 20 20 20 20 20 28 33 61 29 20 74 68 65 20 73 75       (3a) the su
1fa10 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62  bquery may not b
1fa20 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a 2a 20  e a join and.** 
1fa30 20 20 20 20 20 20 20 28 33 62 29 20 74 68 65 20         (3b) the 
1fa40 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1fa50 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20  he subquery may 
1fa60 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 76 69  not contain a vi
1fa70 72 74 75 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  rtual.**        
1fa80 20 20 20 20 20 74 61 62 6c 65 20 61 6e 64 0a 2a       table and.*
1fa90 2a 20 20 20 20 20 20 20 20 28 33 63 29 20 74 68  *        (3c) th
1faa0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61  e outer query ma
1fab0 79 20 6e 6f 74 20 62 65 20 61 6e 20 61 67 67 72  y not be an aggr
1fac0 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  egate..**.**   (
1fad0 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  4)  The subquery
1fae0 20 63 61 6e 20 6e 6f 74 20 62 65 20 44 49 53 54   can not be DIST
1faf0 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  INCT..**.**  (**
1fb00 29 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  )  At one point 
1fb10 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29  restrictions (4)
1fb20 20 61 6e 64 20 28 35 29 20 64 65 66 69 6e 65 64   and (5) defined
1fb30 20 61 20 73 75 62 73 65 74 20 6f 66 20 44 49 53   a subset of DIS
1fb40 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  TINCT.**        
1fb50 73 75 62 2d 71 75 65 72 69 65 73 20 74 68 61 74  sub-queries that
1fb60 20 77 65 72 65 20 65 78 63 6c 75 64 65 64 20 66   were excluded f
1fb70 72 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  rom this optimiz
1fb80 61 74 69 6f 6e 2e 20 52 65 73 74 72 69 63 74 69  ation. Restricti
1fb90 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 28 34  on .**        (4
1fba0 29 20 68 61 73 20 73 69 6e 63 65 20 62 65 65 6e  ) has since been
1fbb0 20 65 78 70 61 6e 64 65 64 20 74 6f 20 65 78 63   expanded to exc
1fbc0 6c 75 64 65 20 61 6c 6c 20 44 49 53 54 49 4e 43  lude all DISTINC
1fbd0 54 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  T subqueries..**
1fbe0 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f  .**  (**)  We no
1fbf0 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20   longer attempt 
1fc00 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65  to flatten aggre
1fc10 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73 2e  gate subqueries.
1fc20 20 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20    Was:.**       
1fc30 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
1fc40 20 69 73 20 61 67 67 72 65 67 61 74 65 2c 20 74   is aggregate, t
1fc50 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  he outer query m
1fc60 61 79 20 6e 6f 74 20 62 65 20 44 49 53 54 49 4e  ay not be DISTIN
1fc70 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20  CT..**.**   (7) 
1fc80 20 54 68 65 20 73 75 62 71 75 65 72 79 20 6d 75   The subquery mu
1fc90 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d 20 63  st have a FROM c
1fca0 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46  lause.  TODO:  F
1fcb0 6f 72 20 73 75 62 71 75 65 72 69 65 73 20 77 69  or subqueries wi
1fcc0 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  thout.**        
1fcd0 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63  A FROM clause, c
1fce0 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 61  onsider adding a
1fcf0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 69 74   FROM clause wit
1fd00 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a  h the special.**
1fd10 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 73 71          table sq
1fd20 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74 20 63  lite_once that c
1fd30 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69 6e  onsists of a sin
1fd40 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69  gle row containi
1fd50 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 73  ng a.**        s
1fd60 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  ingle NULL..**.*
1fd70 2a 20 20 20 28 38 29 20 20 49 66 20 74 68 65 20  *   (8)  If the 
1fd80 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c 49  subquery uses LI
1fd90 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74  MIT then the out
1fda0 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  er query may not
1fdb0 20 62 65 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a   be a join..**.*
1fdc0 2a 20 20 20 28 39 29 20 20 49 66 20 74 68 65 20  *   (9)  If the 
1fdd0 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c 49  subquery uses LI
1fde0 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74  MIT then the out
1fdf0 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  er query may not
1fe00 20 62 65 20 61 67 67 72 65 67 61 74 65 2e 0a 2a   be aggregate..*
1fe10 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65 73 74  *.**  (**)  Rest
1fe20 72 69 63 74 69 6f 6e 20 28 31 30 29 20 77 61 73  riction (10) was
1fe30 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
1fe40 65 20 63 6f 64 65 20 6f 6e 20 32 30 30 35 2d 30  e code on 2005-0
1fe50 32 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a 20 20  2-05 but we.**  
1fe60 20 20 20 20 20 20 61 63 63 69 64 65 6e 74 6c 79        accidently
1fe70 20 63 61 72 72 69 65 64 20 74 68 65 20 63 6f 6d   carried the com
1fe80 6d 65 6e 74 20 66 6f 72 77 61 72 64 20 75 6e 74  ment forward unt
1fe90 69 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e 20 20  il 2014-09-15.  
1fea0 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20  Original.**     
1feb0 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 3a 20 22     constraint: "
1fec0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1fed0 69 73 20 61 67 67 72 65 67 61 74 65 20 74 68 65  is aggregate the
1fee0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1fef0 79 20 0a 2a 2a 20 20 20 20 20 20 20 20 6d 61 79  y .**        may
1ff00 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e 22   not use LIMIT."
1ff10 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68  .**.**  (11)  Th
1ff20 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
1ff30 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  he outer query m
1ff40 61 79 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65  ay not both have
1ff50 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1ff60 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  s..**.**  (**)  
1ff70 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e  Not implemented.
1ff80 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f 20    Subsumed into 
1ff90 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29 2e  restriction (3).
1ffa0 20 20 57 61 73 20 70 72 65 76 69 6f 75 73 6c 79    Was previously
1ffb0 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73 65 70  .**        a sep
1ffc0 61 72 61 74 65 20 72 65 73 74 72 69 63 74 69 6f  arate restrictio
1ffd0 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f 6d 20  n deriving from 
1ffe0 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a  ticket #350..**.
1fff0 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20 73 75  **  (13)  The su
20000 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72  bquery and outer
20010 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62   query may not b
20020 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a  oth use LIMIT..*
20030 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20  *.**  (14)  The 
20040 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
20050 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a   use OFFSET..**.
20060 2a 2a 20 20 28 31 35 29 20 20 49 66 20 74 68 65  **  (15)  If the
20070 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
20080 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75  part of a compou
20090 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20  nd select, then 
200a0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75  the.**        su
200b0 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 75  bquery may not u
200c0 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 20 20 20 20  se LIMIT..**    
200d0 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74 20      (See ticket 
200e0 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65 74  #2339 and ticket
200f0 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e 0a   [02a8e81d44])..
20100 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 49 66 20  **.**  (16)  If 
20110 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
20120 69 73 20 61 67 67 72 65 67 61 74 65 2c 20 74 68  is aggregate, th
20130 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 79 20  en the subquery 
20140 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  may not.**      
20150 20 20 75 73 65 20 4f 52 44 45 52 20 42 59 2e 20    use ORDER BY. 
20160 20 28 54 69 63 6b 65 74 20 23 32 39 34 32 29 20   (Ticket #2942) 
20170 20 54 68 69 73 20 75 73 65 64 20 74 6f 20 6e 6f   This used to no
20180 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20 20  t matter.**     
20190 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e 74 72     until we intr
201a0 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f 75 70  oduced the group
201b0 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63 74 69  _concat() functi
201c0 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37  on.  .**.**  (17
201d0 29 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  )  If the subque
201e0 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
201f0 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 0a 2a 2a   select, then.**
20200 20 20 20 20 20 20 20 20 28 31 37 61 29 20 61 6c          (17a) al
20210 6c 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61  l compound opera
20220 74 6f 72 73 20 6d 75 73 74 20 62 65 20 61 20 55  tors must be a U
20230 4e 49 4f 4e 20 41 4c 4c 2c 20 61 6e 64 0a 2a 2a  NION ALL, and.**
20240 20 20 20 20 20 20 20 20 28 31 37 62 29 20 6e 6f          (17b) no
20250 20 74 65 72 6d 73 20 77 69 74 68 69 6e 20 74 68   terms within th
20260 65 20 73 75 62 71 75 65 72 79 20 63 6f 6d 70 6f  e subquery compo
20270 75 6e 64 20 6d 61 79 20 62 65 20 61 67 67 72 65  und may be aggre
20280 67 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  gate.**         
20290 20 20 20 20 20 6f 72 20 44 49 53 54 49 4e 43 54       or DISTINCT
202a0 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  , and.**        
202b0 28 31 37 63 29 20 65 76 65 72 79 20 74 65 72 6d  (17c) every term
202c0 20 77 69 74 68 69 6e 20 74 68 65 20 73 75 62 71   within the subq
202d0 75 65 72 79 20 63 6f 6d 70 6f 75 6e 64 20 6d 75  uery compound mu
202e0 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d 20 63  st have a FROM c
202f0 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  lause.**        
20300 28 31 37 64 29 20 74 68 65 20 6f 75 74 65 72 20  (17d) the outer 
20310 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
20320 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
20330 20 28 31 37 64 31 29 20 61 67 67 72 65 67 61 74   (17d1) aggregat
20340 65 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20  e, or.**        
20350 20 20 20 20 20 20 28 31 37 64 32 29 20 44 49 53        (17d2) DIS
20360 54 49 4e 43 54 2c 20 6f 72 0a 2a 2a 20 20 20 20  TINCT, or.**    
20370 20 20 20 20 20 20 20 20 20 20 28 31 37 64 33 29            (17d3)
20380 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
20390 20 20 20 20 20 20 54 68 65 20 70 61 72 65 6e 74        The parent
203a0 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79 20 6d   and sub-query m
203b0 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45  ay contain WHERE
203c0 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a 65 63   clauses. Subjec
203d0 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72  t to.**        r
203e0 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33 29 20  ules (11), (13) 
203f0 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79 20 6d  and (14), they m
20400 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20  ay also contain 
20410 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20  ORDER BY,.**    
20420 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46      LIMIT and OF
20430 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 20 54  FSET clauses.  T
20440 68 65 20 73 75 62 71 75 65 72 79 20 63 61 6e 6e  he subquery cann
20450 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d 70 6f  ot use any compo
20460 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70  und.**        op
20470 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74 68 61  erator other tha
20480 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65 63 61  n UNION ALL beca
20490 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65  use all the othe
204a0 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20  r compound.**   
204b0 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73 20 68       operators h
204c0 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64 20 44  ave an implied D
204d0 49 53 54 49 4e 43 54 20 77 68 69 63 68 20 69 73  ISTINCT which is
204e0 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79 0a 2a   disallowed by.*
204f0 2a 20 20 20 20 20 20 20 20 72 65 73 74 72 69 63  *        restric
20500 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a 20  tion (4)..**.** 
20510 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65 61 63         Also, eac
20520 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 74  h component of t
20530 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d 75 73  he sub-query mus
20540 74 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d  t return the sam
20550 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20 20  e number.**     
20560 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c     of result col
20570 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20 61 63  umns. This is ac
20580 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69 72 65  tually a require
20590 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 6f 6d  ment for any com
205a0 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  pound.**        
205b0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
205c0 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20 63 6f  , but all the co
205d0 64 65 20 68 65 72 65 20 64 6f 65 73 20 69 73 20  de here does is 
205e0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 6e  make sure that n
205f0 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 63 68  o.**        such
20600 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62 2d 71   (illegal) sub-q
20610 75 65 72 79 20 69 73 20 66 6c 61 74 74 65 6e 65  uery is flattene
20620 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  d. The caller wi
20630 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a 2a 2a  ll detect the.**
20640 20 20 20 20 20 20 20 20 73 79 6e 74 61 78 20 65          syntax e
20650 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72 6e 20  rror and return 
20660 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73 73 61  a detailed messa
20670 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29 20  ge..**.**  (18) 
20680 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
20690 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
206a0 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c 6c  select, then all
206b0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a   terms of the.**
206c0 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 42 59          ORDER BY
206d0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 70   clause of the p
206e0 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20 73 69  arent must be si
206f0 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20  mple references 
20700 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f  to .**        co
20710 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 75 62  lumns of the sub
20720 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28  -query..**.**  (
20730 31 39 29 20 20 49 66 20 74 68 65 20 73 75 62 71  19)  If the subq
20740 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54 20  uery uses LIMIT 
20750 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71  then the outer q
20760 75 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20  uery may not.** 
20770 20 20 20 20 20 20 20 68 61 76 65 20 61 20 57 48         have a WH
20780 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ERE clause..**.*
20790 2a 20 20 28 32 30 29 20 20 49 66 20 74 68 65 20  *  (20)  If the 
207a0 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
207b0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
207c0 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74  then it must not
207d0 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
207e0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
207f0 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37 33  e.  Ticket #3773
20800 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c 61  .  We could rela
20810 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  x this constrain
20820 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d 65  t.**        some
20830 77 68 61 74 20 62 79 20 73 61 79 69 6e 67 20 74  what by saying t
20840 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f 66  hat the terms of
20850 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
20860 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20  ause must.**    
20870 20 20 20 20 61 70 70 65 61 72 20 61 73 20 75 6e      appear as un
20880 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74 20  modified result 
20890 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f  columns in the o
208a0 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 75 74  uter query.  But
208b0 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 68 61   we.**        ha
208c0 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a  ve other optimiz
208d0 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74  ations in mind t
208e0 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 61 74  o deal with that
208f0 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32   case..**.**  (2
20900 31 29 20 20 49 66 20 74 68 65 20 73 75 62 71 75  1)  If the subqu
20910 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54 20 74  ery uses LIMIT t
20920 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  hen the outer qu
20930 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a  ery may not be.*
20940 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43  *        DISTINC
20950 54 2e 20 20 28 53 65 65 20 74 69 63 6b 65 74 20  T.  (See ticket 
20960 5b 37 35 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a  [752e1646fc])..*
20970 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54 68 65 20  *.**  (22)  The 
20980 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
20990 20 62 65 20 61 20 72 65 63 75 72 73 69 76 65 20   be a recursive 
209a0 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  CTE..**.**  (**)
209b0 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f 20    Subsumed into 
209c0 72 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37 64  restriction (17d
209d0 33 29 2e 20 20 57 61 73 3a 20 49 66 20 74 68 65  3).  Was: If the
209e0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 0a   outer query is.
209f0 2a 2a 20 20 20 20 20 20 20 20 61 20 72 65 63 75  **        a recu
20a00 72 73 69 76 65 20 43 54 45 2c 20 74 68 65 6e 20  rsive CTE, then 
20a10 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d 61  the sub-query ma
20a20 79 20 6e 6f 74 20 62 65 20 61 20 63 6f 6d 70 6f  y not be a compo
20a30 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 20 20 20  und query..**   
20a40 20 20 20 20 20 54 68 69 73 20 72 65 73 74 72 69       This restri
20a50 63 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73 65  ction is because
20a60 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68   transforming th
20a70 65 0a 2a 2a 20 20 20 20 20 20 20 20 70 61 72 65  e.**        pare
20a80 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75 6e 64  nt to a compound
20a90 20 71 75 65 72 79 20 63 6f 6e 66 75 73 65 73 20   query confuses 
20aa0 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 68 61  the code that ha
20ab0 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  ndles.**        
20ac0 72 65 63 75 72 73 69 76 65 20 71 75 65 72 69 65  recursive querie
20ad0 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74  s in multiSelect
20ae0 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20  ()..**.**  (**) 
20af0 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 74   We no longer at
20b00 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74 65 6e  tempt to flatten
20b10 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71 75   aggregate subqu
20b20 65 72 69 65 73 2e 20 20 57 61 73 3a 0a 2a 2a 20  eries.  Was:.** 
20b30 20 20 20 20 20 20 20 54 68 65 20 73 75 62 71 75         The subqu
20b40 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61  ery may not be a
20b50 6e 20 61 67 67 72 65 67 61 74 65 20 74 68 61 74  n aggregate that
20b60 20 75 73 65 73 20 74 68 65 20 62 75 69 6c 74 2d   uses the built-
20b70 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a 2a 2a 20  in min() or .** 
20b80 20 20 20 20 20 20 20 6f 72 20 6d 61 78 28 29 20         or max() 
20b90 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28 57 69 74  functions.  (Wit
20ba0 68 6f 75 74 20 74 68 69 73 20 72 65 73 74 72 69  hout this restri
20bb0 63 74 69 6f 6e 2c 20 61 20 71 75 65 72 79 20 6c  ction, a query l
20bc0 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20 20 20 22  ike:.**        "
20bd0 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28 53  SELECT x FROM (S
20be0 45 4c 45 43 54 20 6d 61 78 28 79 29 2c 20 78 20  ELECT max(y), x 
20bf0 46 52 4f 4d 20 74 31 29 22 20 77 6f 75 6c 64 20  FROM t1)" would 
20c00 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 0a  not necessarily.
20c10 2a 2a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  **        return
20c20 20 74 68 65 20 76 61 6c 75 65 20 58 20 66 6f 72   the value X for
20c30 20 77 68 69 63 68 20 59 20 77 61 73 20 6d 61 78   which Y was max
20c40 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 20 20 28 32  imal.).**.**  (2
20c50 35 29 20 20 49 66 20 65 69 74 68 65 72 20 74 68  5)  If either th
20c60 65 20 73 75 62 71 75 65 72 79 20 6f 72 20 74 68  e subquery or th
20c70 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 63  e parent query c
20c80 6f 6e 74 61 69 6e 73 20 61 20 77 69 6e 64 6f 77  ontains a window
20c90 0a 2a 2a 20 20 20 20 20 20 20 20 66 75 6e 63 74  .**        funct
20ca0 69 6f 6e 20 69 6e 20 74 68 65 20 73 65 6c 65 63  ion in the selec
20cb0 74 20 6c 69 73 74 20 6f 72 20 4f 52 44 45 52 20  t list or ORDER 
20cc0 42 59 20 63 6c 61 75 73 65 2c 20 66 6c 61 74 74  BY clause, flatt
20cd0 65 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  ening.**        
20ce0 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64  is not attempted
20cf0 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  ..**.**.** In th
20d00 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20  is routine, the 
20d10 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  "p" parameter is
20d20 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
20d30 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a  e outer query..*
20d40 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69  * The subquery i
20d50 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72  s p->pSrc->a[iFr
20d60 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74  om].  isAgg is t
20d70 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72  rue if the outer
20d80 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61   query.** uses a
20d90 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
20da0 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
20db0 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c  s not attempted,
20dc0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
20dd0 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74   a no-op and ret
20de0 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c  urns 0..** If fl
20df0 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65  attening is atte
20e00 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69  mpted this routi
20e10 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a  ne returns 1..**
20e20 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65  .** All of the e
20e30 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73  xpression analys
20e40 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e  is must occur on
20e50 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20   both the outer 
20e60 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65  query and.** the
20e70 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65   subquery before
20e80 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
20e90 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
20ea0 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72  t flattenSubquer
20eb0 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
20ec0 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
20ed0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
20ee0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
20ef0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
20f00 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45  rent or outer SE
20f10 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
20f20 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20  /.  int iFrom,  
20f30 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
20f40 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  x in p->pSrc->a[
20f50 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73  ] of the inner s
20f60 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  ubquery */.  int
20f70 20 69 73 41 67 67 20 20 20 20 20 20 20 20 20 20   isAgg          
20f80 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74    /* True if out
20f90 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61  er SELECT uses a
20fa0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
20fb0 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ns */.){.  const
20fc0 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74   char *zSavedAut
20fd0 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73  hContext = pPars
20fe0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b  e->zAuthContext;
20ff0 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65  .  Select *pPare
21000 6e 74 3b 20 20 20 20 2f 2a 20 43 75 72 72 65 6e  nt;    /* Curren
21010 74 20 55 4e 49 4f 4e 20 41 4c 4c 20 74 65 72 6d  t UNION ALL term
21020 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 71 75   of the other qu
21030 65 72 79 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ery */.  Select 
21040 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20  *pSub;       /* 
21050 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  The inner query 
21060 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f  or "subquery" */
21070 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 31  .  Select *pSub1
21080 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ;      /* Pointe
21090 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d 6f  r to the rightmo
210a0 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75 62  st select in sub
210b0 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c  -query */.  SrcL
210c0 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
210d0 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
210e0 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
210f0 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69  query */.  SrcLi
21100 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f  st *pSubSrc;   /
21110 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
21120 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
21130 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65  y */.  int iPare
21140 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44  nt;        /* VD
21150 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
21160 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73   of the pSub res
21170 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62  ult set temp tab
21180 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77  le */.  int iNew
21190 50 61 72 65 6e 74 20 3d 20 2d 31 3b 2f 2a 20 52  Parent = -1;/* R
211a0 65 70 6c 61 63 65 6d 65 6e 74 20 74 61 62 6c 65  eplacement table
211b0 20 66 6f 72 20 69 50 61 72 65 6e 74 20 2a 2f 0a   for iParent */.
211c0 20 20 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e    int isLeftJoin
211d0 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66   = 0; /* True if
211e0 20 70 53 75 62 20 69 73 20 74 68 65 20 72 69 67   pSub is the rig
211f0 68 74 20 73 69 64 65 20 6f 66 20 61 20 4c 45 46  ht side of a LEF
21200 54 20 4a 4f 49 4e 20 2a 2f 20 20 20 20 0a 20 20  T JOIN */    .  
21210 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
21220 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
21230 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ter */.  Expr *p
21240 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
21250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
21260 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
21270 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
21280 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d  t_item *pSubitem
21290 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75  ;   /* The subqu
212a0 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
212b0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
212c0 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  b;..  /* Check t
212d0 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e  o see if flatten
212e0 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
212f0 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
21300 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ot..  */.  asser
21310 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
21320 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  ert( p->pPrior==
21330 30 20 29 3b 0a 20 20 69 66 28 20 4f 70 74 69 6d  0 );.  if( Optim
21340 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
21350 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72 79  db, SQLITE_Query
21360 46 6c 61 74 74 65 6e 65 72 29 20 29 20 72 65 74  Flattener) ) ret
21370 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20  urn 0;.  pSrc = 
21380 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
21390 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d  t( pSrc && iFrom
213a0 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72  >=0 && iFrom<pSr
213b0 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75  c->nSrc );.  pSu
213c0 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61  bitem = &pSrc->a
213d0 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65  [iFrom];.  iPare
213e0 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69  nt = pSubitem->i
213f0 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d  Cursor;.  pSub =
21400 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
21410 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ct;.  assert( pS
21420 75 62 21 3d 30 20 29 3b 0a 0a 23 69 66 6e 64 65  ub!=0 );..#ifnde
21430 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
21440 4e 44 4f 57 46 55 4e 43 0a 20 20 69 66 28 20 70  NDOWFUNC.  if( p
21450 2d 3e 70 57 69 6e 20 7c 7c 20 70 53 75 62 2d 3e  ->pWin || pSub->
21460 70 57 69 6e 20 29 20 72 65 74 75 72 6e 20 30 3b  pWin ) return 0;
21470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21480 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
21490 20 28 32 35 29 20 2a 2f 0a 23 65 6e 64 69 66 0a   (25) */.#endif.
214a0 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75  .  pSubSrc = pSu
214b0 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  b->pSrc;.  asser
214c0 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20  t( pSubSrc );.  
214d0 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73  /* Prior to vers
214e0 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20  ion 3.1.2, when 
214f0 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
21500 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c   had to be simpl
21510 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a  e constants,.  *
21520 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20  * not arbitrary 
21530 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20  expressions, we 
21540 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d  allowed some com
21550 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20  bining of LIMIT 
21560 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20  and OFFSET.  ** 
21570 62 65 63 61 75 73 65 20 74 68 65 79 20 63 6f 75  because they cou
21580 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61  ld be computed a
21590 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20  t compile-time. 
215a0 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20   But when LIMIT 
215b0 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20  and OFFSET.  ** 
215c0 62 65 63 61 6d 65 20 61 72 62 69 74 72 61 72 79  became arbitrary
215d0 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65   expressions, we
215e0 20 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20   were forced to 
215f0 61 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73  add restrictions
21600 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28   (13).  ** and (
21610 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53  14). */.  if( pS
21620 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d  ub->pLimit && p-
21630 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >pLimit ) return
21640 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
21650 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
21660 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (13) */.  if( pS
21670 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 53  ub->pLimit && pS
21680 75 62 2d 3e 70 4c 69 6d 69 74 2d 3e 70 52 69 67  ub->pLimit->pRig
21690 68 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ht ) return 0;  
216a0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
216b0 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 28 70  (14) */.  if( (p
216c0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
216d0 43 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26 26 20  Compound)!=0 && 
216e0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  pSub->pLimit ){.
216f0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
21700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21720 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
21730 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a  riction (15) */.
21740 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72    }.  if( pSubSr
21750 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74  c->nSrc==0 ) ret
21760 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
21770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21780 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20  Restriction (7) 
21790 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
217a0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
217b0 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20  stinct ) return 
217c0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
217d0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29 20  Restriction (4) 
217e0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
217f0 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72 63 2d  pLimit && (pSrc-
21800 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67  >nSrc>1 || isAgg
21810 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  ) ){.     return
21820 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   0;         /* R
21830 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38 29 28  estrictions (8)(
21840 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  9) */.  }.  if( 
21850 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70  p->pOrderBy && p
21860 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
21870 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
21880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
218b0 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f  triction (11) */
218c0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67  .  }.  if( isAgg
218d0 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72   && pSub->pOrder
218e0 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  By ) return 0;  
218f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21900 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 36   Restriction (16
21910 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
21920 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 57  >pLimit && p->pW
21930 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
21940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21950 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 39   Restriction (19
21960 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
21970 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d 3e 73  >pLimit && (p->s
21980 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
21990 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20 20 20  tinct)!=0 ){.   
219a0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
219b0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
219c0 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 20  on (21) */.  }. 
219d0 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c   if( pSub->selFl
219e0 61 67 73 20 26 20 28 53 46 5f 52 65 63 75 72 73  ags & (SF_Recurs
219f0 69 76 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ive) ){.    retu
21a00 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69 63  rn 0; /* Restric
21a10 74 69 6f 6e 73 20 28 32 32 29 20 2a 2f 0a 20 20  tions (22) */.  
21a20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  }..  /*.  ** If 
21a30 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
21a40 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
21a50 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  d of a LEFT JOIN
21a60 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
21a70 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
21a80 20 62 65 20 61 20 6a 6f 69 6e 20 69 74 73 65 6c   be a join itsel
21a90 66 20 28 33 61 29 2e 20 45 78 61 6d 70 6c 65 20  f (3a). Example 
21aa0 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e  of why this is n
21ab0 6f 74 0a 20 20 2a 2a 20 61 6c 6c 6f 77 65 64 3a  ot.  ** allowed:
21ac0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
21ad0 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52     t1 LEFT OUTER
21ae0 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74   JOIN (t2 JOIN t
21af0 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  3).  **.  ** If 
21b00 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61  we flatten the a
21b10 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67  bove, we would g
21b20 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  et.  **.  **    
21b30 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55       (t1 LEFT OU
21b40 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49  TER JOIN t2) JOI
21b50 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77  N t3.  **.  ** w
21b60 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61  hich is not at a
21b70 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e  ll the same thin
21b80 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  g..  **.  ** If 
21b90 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
21ba0 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
21bb0 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  d of a LEFT JOIN
21bc0 2c 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72  , then the outer
21bd0 0a 20 20 2a 2a 20 71 75 65 72 79 20 63 61 6e 6e  .  ** query cann
21be0 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65 67 61  ot be an aggrega
21bf0 74 65 2e 20 28 33 63 29 20 20 54 68 69 73 20 69  te. (3c)  This i
21c00 73 20 61 6e 20 61 72 74 69 66 61 63 74 20 6f 66  s an artifact of
21c10 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 61 67   the way.  ** ag
21c20 67 72 65 67 61 74 65 73 20 61 72 65 20 70 72 6f  gregates are pro
21c30 63 65 73 73 65 64 20 2d 20 74 68 65 72 65 20 69  cessed - there i
21c40 73 20 6e 6f 20 6d 65 63 68 61 6e 69 73 6d 20 74  s no mechanism t
21c50 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 0a 20  o determine if. 
21c60 20 2a 2a 20 74 68 65 20 4c 45 46 54 20 4a 4f 49   ** the LEFT JOI
21c70 4e 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62  N table should b
21c80 65 20 61 6c 6c 2d 4e 55 4c 4c 2e 0a 20 20 2a 2a  e all-NULL..  **
21c90 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74  .  ** See also t
21ca0 69 63 6b 65 74 73 20 23 33 30 36 2c 20 23 33 35  ickets #306, #35
21cb0 30 2c 20 61 6e 64 20 23 33 33 30 30 2e 0a 20 20  0, and #3300..  
21cc0 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69 74  */.  if( (pSubit
21cd0 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  em->fg.jointype 
21ce0 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29  & JT_OUTER)!=0 )
21cf0 7b 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f 69 6e  {.    isLeftJoin
21d00 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 53   = 1;.    if( pS
21d10 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c  ubSrc->nSrc>1 ||
21d20 20 69 73 41 67 67 20 7c 7c 20 49 73 56 69 72 74   isAgg || IsVirt
21d30 75 61 6c 28 70 53 75 62 53 72 63 2d 3e 61 5b 30  ual(pSubSrc->a[0
21d40 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ].pTab) ){.     
21d50 20 2f 2a 20 20 28 33 61 29 20 20 20 20 20 20 20   /*  (3a)       
21d60 20 20 20 20 20 20 28 33 63 29 20 20 20 20 20 28        (3c)     (
21d70 33 62 29 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  3b) */.      ret
21d80 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
21d90 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
21da0 58 54 52 41 5f 49 46 4e 55 4c 4c 52 4f 57 0a 20  XTRA_IFNULLROW. 
21db0 20 65 6c 73 65 20 69 66 28 20 69 46 72 6f 6d 3e   else if( iFrom>
21dc0 30 20 26 26 20 21 69 73 41 67 67 20 29 7b 0a 20  0 && !isAgg ){. 
21dd0 20 20 20 2f 2a 20 53 65 74 74 69 6e 67 20 69 73     /* Setting is
21de0 4c 65 66 74 4a 6f 69 6e 20 74 6f 20 2d 31 20 63  LeftJoin to -1 c
21df0 61 75 73 65 73 20 4f 50 5f 49 66 4e 75 6c 6c 52  auses OP_IfNullR
21e00 6f 77 20 6f 70 63 6f 64 65 73 20 74 6f 20 62 65  ow opcodes to be
21e10 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 0a 20   generated for. 
21e20 20 20 20 2a 2a 20 65 76 65 72 79 20 72 65 66 65     ** every refe
21e30 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 72 65 73  rence to any res
21e40 75 6c 74 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20  ult column from 
21e50 73 75 62 71 75 65 72 79 20 69 6e 20 61 20 6a 6f  subquery in a jo
21e60 69 6e 2c 20 65 76 65 6e 0a 20 20 20 20 2a 2a 20  in, even.    ** 
21e70 74 68 6f 75 67 68 20 74 68 65 79 20 61 72 65 20  though they are 
21e80 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20  not necessary.  
21e90 54 68 69 73 20 77 69 6c 6c 20 73 74 72 65 73 73  This will stress
21ea0 2d 74 65 73 74 20 74 68 65 20 4f 50 5f 49 66 4e  -test the OP_IfN
21eb0 75 6c 6c 52 6f 77 20 0a 20 20 20 20 2a 2a 20 6f  ullRow .    ** o
21ec0 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 69 73  pcode. */.    is
21ed0 4c 65 66 74 4a 6f 69 6e 20 3d 20 2d 31 3b 0a 20  LeftJoin = -1;. 
21ee0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
21ef0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37 29  Restriction (17)
21f00 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  : If the sub-que
21f10 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
21f20 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74   SELECT, then it
21f30 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f   must.  ** use o
21f40 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c  nly the UNION AL
21f50 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20  L operator. And 
21f60 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70  none of the simp
21f70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65  le select querie
21f80 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65  s.  ** that make
21f90 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   up the compound
21fa0 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f   SELECT are allo
21fb0 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67  wed to be aggreg
21fc0 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a  ate or distinct.
21fd0 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20    ** queries..  
21fe0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
21ff0 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
22000 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
22010 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
22020 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  0;  /* Restricti
22030 6f 6e 20 28 32 30 29 20 2a 2f 0a 20 20 20 20 7d  on (20) */.    }
22040 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 7c  .    if( isAgg |
22050 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  | (p->selFlags &
22060 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
22070 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d   || pSrc->nSrc!=
22080 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  1 ){.      retur
22090 6e 20 30 3b 20 2f 2a 20 28 31 37 64 31 29 2c 20  n 0; /* (17d1), 
220a0 28 31 37 64 32 29 2c 20 6f 72 20 28 31 37 64 33  (17d2), or (17d3
220b0 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 66  ) */.    }.    f
220c0 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70  or(pSub1=pSub; p
220d0 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62  Sub1; pSub1=pSub
220e0 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  1->pPrior){.    
220f0 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75    testcase( (pSu
22100 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
22110 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
22120 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
22130 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20  istinct );.     
22140 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62   testcase( (pSub
22150 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
22160 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
22170 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67  gregate))==SF_Ag
22180 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20  gregate );.     
22190 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70   assert( pSub->p
221a0 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Src!=0 );.      
221b0 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 45  assert( pSub->pE
221c0 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 53 75  List->nExpr==pSu
221d0 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  b1->pEList->nExp
221e0 72 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  r );.      if( (
221f0 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
22200 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
22210 46 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d 30  F_Aggregate))!=0
22220 20 20 20 20 2f 2a 20 28 31 37 62 29 20 2a 2f 0a      /* (17b) */.
22230 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31         || (pSub1
22240 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62  ->pPrior && pSub
22250 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 20  1->op!=TK_ALL)  
22260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22270 2a 20 28 31 37 61 29 20 2a 2f 0a 20 20 20 20 20  * (17a) */.     
22280 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63    || pSub1->pSrc
22290 2d 3e 6e 53 72 63 3c 31 20 20 20 20 20 20 20 20  ->nSrc<1        
222a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 37            /* (17
222c0 63 29 20 2a 2f 0a 20 20 20 20 20 20 29 7b 0a 20  c) */.      ){. 
222d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
222e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
222f0 65 73 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e  estcase( pSub1->
22300 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a  pSrc->nSrc>1 );.
22310 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
22320 73 74 72 69 63 74 69 6f 6e 20 28 31 38 29 2e 20  striction (18). 
22330 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f  */.    if( p->pO
22340 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
22350 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f  int ii;.      fo
22360 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f  r(ii=0; ii<p->pO
22370 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
22380 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
22390 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61  ( p->pOrderBy->a
223a0 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  [ii].u.x.iOrderB
223b0 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  yCol==0 ) return
223c0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
223d0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 2d 72  }.  }..  /* Ex-r
223e0 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33 29 3a  estriction (23):
223f0 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 77  .  ** The only w
22400 61 79 20 74 68 61 74 20 74 68 65 20 72 65 63 75  ay that the recu
22410 72 73 69 76 65 20 70 61 72 74 20 6f 66 20 61 20  rsive part of a 
22420 43 54 45 20 63 61 6e 20 63 6f 6e 74 61 69 6e 20  CTE can contain 
22430 61 20 63 6f 6d 70 6f 75 6e 64 0a 20 20 2a 2a 20  a compound.  ** 
22440 73 75 62 71 75 65 72 79 20 69 73 20 66 6f 72 20  subquery is for 
22450 74 68 65 20 73 75 62 71 75 65 72 79 20 74 6f 20  the subquery to 
22460 62 65 20 6f 6e 65 20 74 65 72 6d 20 6f 66 20 61  be one term of a
22470 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66 20 74   join.  But if t
22480 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
22490 20 69 73 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e   is a join, then
224a0 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20   the flattening 
224b0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
224c0 20 73 74 6f 70 70 65 64 20 62 79 0a 20 20 2a 2a   stopped by.  **
224d0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37   restriction (17
224e0 64 33 29 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  d3).  */.  asser
224f0 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  t( (p->selFlags 
22500 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d  & SF_Recursive)=
22510 3d 30 20 7c 7c 20 70 53 75 62 2d 3e 70 50 72 69  =0 || pSub->pPri
22520 6f 72 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 2a 2a  or==0 );..  /***
22530 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  ** If we reach t
22540 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74  his point, flatt
22550 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74  ening is permitt
22560 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45 4c  ed. *****/.  SEL
22570 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73  ECTTRACE(1,pPars
22580 65 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20 25 75  e,p,("flatten %u
22590 2e 25 70 20 66 72 6f 6d 20 74 65 72 6d 20 25 64  .%p from term %d
225a0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
225b0 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 73 65          pSub->se
225c0 6c 49 64 2c 20 70 53 75 62 2c 20 69 46 72 6f 6d  lId, pSub, iFrom
225d0 29 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72  ));..  /* Author
225e0 69 7a 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ize the subquery
225f0 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41   */.  pParse->zA
22600 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75  uthContext = pSu
22610 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  bitem->zName;.  
22620 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71  TESTONLY(i =) sq
22630 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
22640 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45  Parse, SQLITE_SE
22650 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  LECT, 0, 0, 0);.
22660 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 53    testcase( i==S
22670 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20  QLITE_DENY );.  
22680 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
22690 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74  text = zSavedAut
226a0 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20  hContext;..  /* 
226b0 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
226c0 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   is a compound S
226d0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
226e0 20 74 68 65 6e 20 28 62 79 20 72 65 73 74 72 69   then (by restri
226f0 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61  ctions.  ** 17 a
22700 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69 74 20  nd 18 above) it 
22710 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20  must be a UNION 
22720 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65  ALL and the pare
22730 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20  nt query must . 
22740 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f   ** be of the fo
22750 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  rm:.  **.  **   
22760 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c    SELECT <expr-l
22770 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d  ist> FROM (<sub-
22780 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63  query>) <where-c
22790 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a  lause> .  **.  *
227a0 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e  * followed by an
227b0 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49  y ORDER BY, LIMI
227c0 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20  T and/or OFFSET 
227d0 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c  clauses. This bl
227e0 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73  ock.  ** creates
227f0 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74   N-1 copies of t
22800 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
22810 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45  without any ORDE
22820 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a  R BY, LIMIT or .
22830 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75    ** OFFSET clau
22840 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68  ses and joins th
22850 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68  em to the left-h
22860 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20  and-side of the 
22870 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73  original.  ** us
22880 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  ing UNION ALL op
22890 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73  erators. In this
228a0 20 63 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e   case N is the n
228b0 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a  umber of simple.
228c0 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74    ** select stat
228d0 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f  ements in the co
228e0 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79  mpound sub-query
228f0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d  ..  **.  ** Exam
22900 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ple:.  **.  **  
22910 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52     SELECT a+1 FR
22920 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20  OM (.  **       
22930 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
22940 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55  ab.  **        U
22950 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
22960 20 20 20 20 20 53 45 4c 45 43 54 20 79 20 46 52       SELECT y FR
22970 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20  OM tab.  **     
22980 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
22990 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
229a0 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61  abs(z*2) FROM ta
229b0 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48  b2.  **     ) WH
229c0 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42  ERE a!=5 ORDER B
229d0 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72  Y 1.  **.  ** Tr
229e0 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a  ansformed into:.
229f0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
22a00 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61  LECT x+1 FROM ta
22a10 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20  b WHERE x+1!=5. 
22a20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c   **     UNION AL
22a30 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  L.  **     SELEC
22a40 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57  T y+1 FROM tab W
22a50 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a  HERE y+1!=5.  **
22a60 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
22a70 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
22a80 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74  bs(z*2)+1 FROM t
22a90 61 62 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a  ab2 WHERE abs(z*
22aa0 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20  2)+1!=5.  **    
22ab0 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a   ORDER BY 1.  **
22ac0 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68  .  ** We call th
22ad0 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64  is the "compound
22ae0 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65  -subquery flatte
22af0 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ning"..  */.  fo
22b00 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  r(pSub=pSub->pPr
22b10 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d  ior; pSub; pSub=
22b20 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  pSub->pPrior){. 
22b30 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b     Select *pNew;
22b40 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
22b50 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
22b60 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20  derBy;.    Expr 
22b70 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69  *pLimit = p->pLi
22b80 6d 69 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  mit;.    Select 
22b90 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72  *pPrior = p->pPr
22ba0 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  ior;.    p->pOrd
22bb0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d  erBy = 0;.    p-
22bc0 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70  >pSrc = 0;.    p
22bd0 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
22be0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
22bf0 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
22c00 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
22c10 20 70 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 70   p, 0);.    p->p
22c20 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
22c30 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
22c40 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
22c50 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  p->pSrc = pSrc;.
22c60 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41      p->op = TK_A
22c70 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  LL;.    if( pNew
22c80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
22c90 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
22ca0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22cb0 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d    pNew->pPrior =
22cc0 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69   pPrior;.      i
22cd0 66 28 20 70 50 72 69 6f 72 20 29 20 70 50 72 69  f( pPrior ) pPri
22ce0 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77  or->pNext = pNew
22cf0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e  ;.      pNew->pN
22d00 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 70  ext = p;.      p
22d10 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b  ->pPrior = pNew;
22d20 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41  .      SELECTTRA
22d30 43 45 28 32 2c 70 50 61 72 73 65 2c 70 2c 28 22  CE(2,pParse,p,("
22d40 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
22d50 79 20 66 6c 61 74 74 65 6e 65 72 22 0a 20 20 20  y flattener".   
22d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d70 20 20 20 20 20 20 20 20 20 20 20 22 20 63 72 65             " cre
22d80 61 74 65 73 20 25 75 20 61 73 20 70 65 65 72 5c  ates %u as peer\
22d90 6e 22 2c 70 4e 65 77 2d 3e 73 65 6c 49 64 29 29  n",pNew->selId))
22da0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
22db0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
22dc0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
22dd0 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61  ..  /* Begin fla
22de0 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72 6f  ttening the iFro
22df0 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68  m-th entry of th
22e00 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20  e FROM clause . 
22e10 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65 72   ** in the outer
22e20 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
22e30 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70 53  Sub = pSub1 = pS
22e40 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b  ubitem->pSelect;
22e50 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68  ..  /* Delete th
22e60 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  e transient tabl
22e70 65 20 73 74 72 75 63 74 75 72 65 20 61 73 73 6f  e structure asso
22e80 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ciated with the.
22e90 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20 20    ** subquery.  
22ea0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  */.  sqlite3DbFr
22eb0 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d  ee(db, pSubitem-
22ec0 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 73  >zDatabase);.  s
22ed0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
22ee0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
22ef0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
22f00 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d  ee(db, pSubitem-
22f10 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75 62  >zAlias);.  pSub
22f20 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  item->zDatabase 
22f30 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
22f40 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53  >zName = 0;.  pS
22f50 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d  ubitem->zAlias =
22f60 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
22f70 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20  pSelect = 0;..  
22f80 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69 6e  /* Defer deletin
22f90 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65  g the Table obje
22fa0 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ct associated wi
22fb0 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  th the.  ** subq
22fc0 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65 20  uery until code 
22fd0 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20 20  generation is.  
22fe0 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e  ** complete, sin
22ff0 63 65 20 74 68 65 72 65 20 6d 61 79 20 73 74 69  ce there may sti
23000 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70 54  ll exist Expr.pT
23010 61 62 20 65 6e 74 72 69 65 73 20 74 68 61 74 0a  ab entries that.
23020 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68    ** refer to th
23030 65 20 73 75 62 71 75 65 72 79 20 65 76 65 6e 20  e subquery even 
23040 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67  after flattening
23050 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34 36 2e  .  Ticket #3346.
23060 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69  .  **.  ** pSubi
23070 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c 77  tem->pTab is alw
23080 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20  ays non-NULL by 
23090 74 65 73 74 20 72 65 73 74 72 69 63 74 69 6f 6e  test restriction
230a0 73 20 61 6e 64 20 74 65 73 74 73 20 61 62 6f 76  s and tests abov
230b0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c  e..  */.  if( AL
230c0 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d 3e 70  WAYS(pSubitem->p
230d0 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 54  Tab!=0) ){.    T
230e0 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c 20  able *pTabToDel 
230f0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  = pSubitem->pTab
23100 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 54 6f  ;.    if( pTabTo
23110 44 65 6c 2d 3e 6e 54 61 62 52 65 66 3d 3d 31 20  Del->nTabRef==1 
23120 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20 2a  ){.      Parse *
23130 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
23140 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
23150 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
23160 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74  pTabToDel->pNext
23170 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65 76  Zombie = pToplev
23180 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a  el->pZombieTab;.
23190 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d        pToplevel-
231a0 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54  >pZombieTab = pT
231b0 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c  abToDel;.    }el
231c0 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f  se{.      pTabTo
231d0 44 65 6c 2d 3e 6e 54 61 62 52 65 66 2d 2d 3b 0a  Del->nTabRef--;.
231e0 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69 74      }.    pSubit
231f0 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20  em->pTab = 0;.  
23200 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
23210 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20  owing loop runs 
23220 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 65  once for each te
23230 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  rm in a compound
23240 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 66  -subquery.  ** f
23250 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64 65  lattening (as de
23260 73 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e 20  scribed above). 
23270 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67   If we are doing
23280 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69 6e   a different kin
23290 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65  d.  ** of flatte
232a0 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65 6e  ning - a flatten
232b0 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ing other than a
232c0 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65   compound-subque
232d0 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a  ry flattening -.
232e0 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 6c    ** then this l
232f0 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e  oop only runs on
23300 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ce..  **.  ** Th
23310 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c  is loop moves al
23320 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c  l of the FROM el
23330 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75  ements of the su
23340 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a  bquery into the.
23350 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
23360 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
23370 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65  r query.  Before
23380 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d   doing this, rem
23390 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63  ember.  ** the c
233a0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
233b0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75   the original ou
233c0 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65  ter query FROM e
233d0 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69  lement in.  ** i
233e0 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61  Parent.  The iPa
233f0 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c  rent cursor will
23400 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20   never be used. 
23410 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65   Subsequent code
23420 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20  .  ** will scan 
23430 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b  expressions look
23440 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20  ing for iParent 
23450 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72  references and r
23460 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73  eplace.  ** thos
23470 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74  e references wit
23480 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  h expressions th
23490 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68  at resolve to th
234a0 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a  e subquery FROM.
234b0 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65    ** elements we
234c0 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67   are now copying
234d0 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28   in..  */.  for(
234e0 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65  pParent=p; pPare
234f0 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72  nt; pParent=pPar
23500 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75  ent->pPrior, pSu
23510 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b  b=pSub->pPrior){
23520 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63  .    int nSubSrc
23530 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79 70  ;.    u8 jointyp
23540 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53  e = 0;.    pSubS
23550 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b  rc = pSub->pSrc;
23560 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
23570 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 20  use of subquery 
23580 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d  */.    nSubSrc =
23590 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20   pSubSrc->nSrc; 
235a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
235b0 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79 20  rms in subquery 
235c0 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
235d0 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e     pSrc = pParen
235e0 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20  t->pSrc;     /* 
235f0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
23600 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
23610 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 20  /..    if( pSrc 
23620 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
23630 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20   pParent==p );  
23640 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74 68  /* First time th
23650 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a  rough the loop *
23660 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  /.      jointype
23670 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e   = pSubitem->fg.
23680 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65  jointype;.    }e
23690 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
236a0 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b  t( pParent!=p );
236b0 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62    /* 2nd and sub
236c0 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68  sequent times th
236d0 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a  rough the loop *
236e0 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70  /.      pSrc = p
236f0 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73  Parent->pSrc = s
23700 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
23710 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29  end(db, 0, 0, 0)
23720 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63  ;.      if( pSrc
23730 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
23740 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
23750 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
23760 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
23770 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
23780 54 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  The subquery use
23790 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20  s a single slot 
237a0 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
237b0 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a  se of the outer.
237c0 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49      ** query.  I
237d0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68  f the subquery h
237e0 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  as more than one
237f0 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20   element in its 
23800 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20  FROM clause,.   
23810 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20   ** then expand 
23820 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
23830 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f  to make space fo
23840 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c  r it to hold all
23850 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a   elements.    **
23860 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
23870 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
23880 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a  Example:.    **.
23890 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54      **    SELECT
238a0 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53   * FROM tabA, (S
238b0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62  ELECT * FROM sub
238c0 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a  1, sub2), tabB;.
238d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
238e0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68 61  e outer query ha
238f0 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73  s 3 slots in its
23900 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f   FROM clause.  O
23910 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20  ne slot of the. 
23920 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72     ** outer quer
23930 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c  y (the middle sl
23940 6f 74 29 20 69 73 20 75 73 65 64 20 62 79 20 74  ot) is used by t
23950 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68  he subquery.  Th
23960 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c  e next.    ** bl
23970 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c  ock of code will
23980 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65   expand the oute
23990 72 20 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61  r query FROM cla
239a0 75 73 65 20 74 6f 20 34 20 73 6c 6f 74 73 2e 0a  use to 4 slots..
239b0 20 20 20 20 2a 2a 20 54 68 65 20 6d 69 64 64 6c      ** The middl
239c0 65 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64  e slot is expand
239d0 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20  ed to two slots 
239e0 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65  in order to make
239f0 20 73 70 61 63 65 0a 20 20 20 20 2a 2a 20 66 6f   space.    ** fo
23a00 72 20 74 68 65 20 74 77 6f 20 65 6c 65 6d 65 6e  r the two elemen
23a10 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ts in the FROM c
23a20 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62  lause of the sub
23a30 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  query..    */.  
23a40 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20    if( nSubSrc>1 
23a50 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  ){.      pParent
23a60 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d 20  ->pSrc = pSrc = 
23a70 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e  sqlite3SrcListEn
23a80 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c 20  large(db, pSrc, 
23a90 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b  nSubSrc-1,iFrom+
23aa0 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  1);.      if( db
23ab0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
23ac0 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
23ad0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
23ae0 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20      /* Transfer 
23af0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
23b00 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 73  terms from the s
23b10 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
23b20 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
23b30 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ery..    */.    
23b40 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53  for(i=0; i<nSubS
23b50 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
23b60 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
23b70 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b  ete(db, pSrc->a[
23b80 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29  i+iFrom].pUsing)
23b90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
23ba0 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d  pSrc->a[i+iFrom]
23bb0 2e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30  .fg.isTabFunc==0
23bc0 20 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e   );.      pSrc->
23bd0 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75  a[i+iFrom] = pSu
23be0 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  bSrc->a[i];.    
23bf0 20 20 69 4e 65 77 50 61 72 65 6e 74 20 3d 20 70    iNewParent = p
23c00 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75  SubSrc->a[i].iCu
23c10 72 73 6f 72 3b 0a 20 20 20 20 20 20 6d 65 6d 73  rsor;.      mems
23c20 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69  et(&pSubSrc->a[i
23c30 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75  ], 0, sizeof(pSu
23c40 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20  bSrc->a[i]));.  
23c50 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b    }.    pSrc->a[
23c60 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e 74 79  iFrom].fg.jointy
23c70 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20  pe = jointype;. 
23c80 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67   .    /* Now beg
23c90 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67 20  in substituting 
23ca0 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 20  subquery result 
23cb0 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  set expressions 
23cc0 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66 65  for .    ** refe
23cd0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50  rences to the iP
23ce0 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74  arent in the out
23cf0 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a  er query..    **
23d00 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65   .    ** Example
23d10 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
23d20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a    SELECT a+5, b*
23d30 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  10 FROM (SELECT 
23d40 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41  x*3 AS a, y+10 A
23d50 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45  S b FROM t1) WHE
23d60 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20  RE a>b;.    **  
23d70 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   \              
23d80 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f         \________
23d90 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f  _____ subquery _
23da0 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20  _________/      
23db0 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20      /.    **    
23dc0 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
23dd0 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65  ______ outer que
23de0 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ry _____________
23df0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23e00 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  _/.    **.    **
23e10 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72   We look at ever
23e20 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
23e30 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
23e40 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20  and every place 
23e50 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22 61  we see.    ** "a
23e60 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
23e70 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20  "x*3" and every 
23e80 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62 22  place we see "b"
23e90 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22   we substitute "
23ea0 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20  y+10"..    */.  
23eb0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64    if( pSub->pOrd
23ec0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a  erBy ){.      /*
23ed0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
23ee0 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72  any non-zero iOr
23ef0 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 73 20  derByCol values 
23f00 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
23f10 65 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52  e.      ** ORDER
23f20 20 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65   BY column expre
23f30 73 73 69 6f 6e 20 69 73 20 69 64 65 6e 74 69 63  ssion is identic
23f40 61 6c 20 74 6f 20 74 68 65 20 69 4f 72 64 65 72  al to the iOrder
23f50 42 79 43 6f 6c 27 74 68 0a 20 20 20 20 20 20 2a  ByCol'th.      *
23f60 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 74  * expression ret
23f70 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20  urned by SELECT 
23f80 73 74 61 74 65 6d 65 6e 74 20 70 53 75 62 2e 20  statement pSub. 
23f90 53 69 6e 63 65 20 74 68 65 73 65 20 76 61 6c 75  Since these valu
23fa0 65 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20 6e  es.      ** do n
23fb0 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 63  ot necessarily c
23fc0 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 63 6f 6c  orrespond to col
23fd0 75 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54 20 73  umns in SELECT s
23fe0 74 61 74 65 6d 65 6e 74 20 70 50 61 72 65 6e 74  tatement pParent
23ff0 2c 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20  ,.      ** zero 
24000 74 68 65 6d 20 62 65 66 6f 72 65 20 74 72 61 6e  them before tran
24010 73 66 65 72 69 6e 67 20 74 68 65 20 4f 52 44 45  sfering the ORDE
24020 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20  R BY clause..   
24030 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e     **.      ** N
24040 6f 74 20 64 6f 69 6e 67 20 74 68 69 73 20 6d 61  ot doing this ma
24050 79 20 63 61 75 73 65 20 61 6e 20 65 72 72 6f 72  y cause an error
24060 20 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74   if a subsequent
24070 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20   call to this.  
24080 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20      ** function 
24090 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74  attempts to flat
240a0 74 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73  ten a compound s
240b0 75 62 2d 71 75 65 72 79 20 69 6e 74 6f 20 70 50  ub-query into pP
240c0 61 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 28  arent.      ** (
240d0 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68 69  the only way thi
240e0 73 20 63 61 6e 20 68 61 70 70 65 6e 20 69 73 20  s can happen is 
240f0 69 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  if the compound 
24100 73 75 62 2d 71 75 65 72 79 20 69 73 0a 20 20 20  sub-query is.   
24110 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20     ** currently 
24120 70 61 72 74 20 6f 66 20 70 53 75 62 2d 3e 70 53  part of pSub->pS
24130 72 63 29 2e 20 53 65 65 20 74 69 63 6b 65 74 20  rc). See ticket 
24140 5b 64 31 31 61 36 65 39 30 38 66 5d 2e 20 20 2a  [d11a6e908f].  *
24150 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
24160 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75   *pOrderBy = pSu
24170 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  b->pOrderBy;.   
24180 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
24190 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
241a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 72  ++){.        pOr
241b0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e  derBy->a[i].u.x.
241c0 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b  iOrderByCol = 0;
241d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
241e0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
241f0 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
24200 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f       pParent->pO
24210 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
24220 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70  y;.      pSub->p
24230 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
24240 20 7d 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20   }.    pWhere = 
24250 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
24260 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c  b, pSub->pWhere,
24270 20 30 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4c   0);.    if( isL
24280 65 66 74 4a 6f 69 6e 3e 30 20 29 7b 0a 20 20 20  eftJoin>0 ){.   
24290 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70     setJoinExpr(p
242a0 57 68 65 72 65 2c 20 69 4e 65 77 50 61 72 65 6e  Where, iNewParen
242b0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  t);.    }.    pP
242c0 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20  arent->pWhere = 
242d0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
242e0 62 2c 20 70 57 68 65 72 65 2c 20 70 50 61 72 65  b, pWhere, pPare
242f0 6e 74 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  nt->pWhere);.   
24300 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
24310 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ailed==0 ){.    
24320 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 78    SubstContext x
24330 3b 0a 20 20 20 20 20 20 78 2e 70 50 61 72 73 65  ;.      x.pParse
24340 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 20   = pParse;.     
24350 20 78 2e 69 54 61 62 6c 65 20 3d 20 69 50 61 72   x.iTable = iPar
24360 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e 69 4e 65  ent;.      x.iNe
24370 77 54 61 62 6c 65 20 3d 20 69 4e 65 77 50 61 72  wTable = iNewPar
24380 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e 69 73 4c  ent;.      x.isL
24390 65 66 74 4a 6f 69 6e 20 3d 20 69 73 4c 65 66 74  eftJoin = isLeft
243a0 4a 6f 69 6e 3b 0a 20 20 20 20 20 20 78 2e 70 45  Join;.      x.pE
243b0 4c 69 73 74 20 3d 20 70 53 75 62 2d 3e 70 45 4c  List = pSub->pEL
243c0 69 73 74 3b 0a 20 20 20 20 20 20 73 75 62 73 74  ist;.      subst
243d0 53 65 6c 65 63 74 28 26 78 2c 20 70 50 61 72 65  Select(&x, pPare
243e0 6e 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  nt, 0);.    }.  
243f0 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74  .    /* The flat
24400 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64  tened query is d
24410 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65  istinct if eithe
24420 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74  r the inner or t
24430 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
24440 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63  query is distinc
24450 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  t. .    */.    p
24460 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73  Parent->selFlags
24470 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61   |= pSub->selFla
24480 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
24490 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ;.  .    /*.    
244a0 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  ** SELECT ... FR
244b0 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c  OM (SELECT ... L
244c0 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29  IMIT a OFFSET b)
244d0 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20   LIMIT x OFFSET 
244e0 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y;.    **.    **
244f0 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20   One is tempted 
24500 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61 20  to try to add a 
24510 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65  and b to combine
24520 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75   the limits.  Bu
24530 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f  t this.    ** do
24540 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65  es not work if e
24550 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e  ither limit is n
24560 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a  egative..    */.
24570 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c      if( pSub->pL
24580 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50  imit ){.      pP
24590 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20  arent->pLimit = 
245a0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20  pSub->pLimit;.  
245b0 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74      pSub->pLimit
245c0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
245d0 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20  .  /* Finially, 
245e0 64 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c  delete what is l
245f0 65 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  eft of the subqu
24600 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  ery and return. 
24610 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a   ** success..  *
24620 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  /.  sqlite3Selec
24630 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62  tDelete(db, pSub
24640 31 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54  1);..#if SELECTT
24650 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
24660 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
24670 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
24680 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
24690 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x100,pParse,p,
246a0 28 22 41 66 74 65 72 20 66 6c 61 74 74 65 6e 69  ("After flatteni
246b0 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  ng:\n"));.    sq
246c0 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
246d0 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
246e0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
246f0 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
24700 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
24710 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
24720 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
24730 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
24740 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75 63  /../*.** A struc
24750 74 75 72 65 20 74 6f 20 6b 65 65 70 20 74 72 61  ture to keep tra
24760 63 6b 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65  ck of all of the
24770 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 74   column values t
24780 68 61 74 20 6d 75 73 74 20 62 65 0a 2a 2a 20 63  hat must be.** c
24790 6f 6e 73 74 61 6e 74 20 69 6e 20 61 20 57 48 45  onstant in a WHE
247a0 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 74 79  RE clause..*/.ty
247b0 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65  pedef struct Whe
247c0 72 65 43 6f 6e 73 74 20 57 68 65 72 65 43 6f 6e  reConst WhereCon
247d0 73 74 3b 0a 73 74 72 75 63 74 20 57 68 65 72 65  st;.struct Where
247e0 43 6f 6e 73 74 20 7b 0a 20 20 73 71 6c 69 74 65  Const {.  sqlite
247f0 33 20 2a 64 62 3b 20 20 20 20 20 2f 2a 20 44 61  3 *db;     /* Da
24800 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 2c 20  tabase pointer, 
24810 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 44  used by sqlite3D
24820 62 52 65 61 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20  bRealloc() */.  
24830 69 6e 74 20 6e 43 6f 6e 73 74 3b 20 20 20 20 20  int nConst;     
24840 20 2f 2a 20 4e 75 6d 62 65 72 20 66 6f 72 20 43   /* Number for C
24850 4f 4c 55 4d 4e 3d 43 4f 4e 53 54 41 4e 54 20 74  OLUMN=CONSTANT t
24860 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  erms */.  int nC
24870 68 6e 67 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  hng;       /* Nu
24880 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 61 20  mber of times a 
24890 63 6f 6e 73 74 61 6e 74 20 69 73 20 70 72 6f 70  constant is prop
248a0 61 67 61 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  agated */.  Expr
248b0 20 2a 2a 61 70 45 78 70 72 3b 20 20 20 2f 2a 20   **apExpr;   /* 
248c0 5b 69 2a 32 5d 20 69 73 20 43 4f 4c 55 4d 4e 20  [i*2] is COLUMN 
248d0 61 6e 64 20 5b 69 2a 32 2b 31 5d 20 69 73 20 43  and [i*2+1] is C
248e0 4f 4e 53 54 41 4e 54 20 2a 2f 0a 7d 3b 0a 0a 2f  ONSTANT */.};../
248f0 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
24900 6e 74 72 79 20 74 6f 20 74 68 65 20 70 43 6f 6e  ntry to the pCon
24910 73 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61  st object.*/.sta
24920 74 69 63 20 76 6f 69 64 20 63 6f 6e 73 74 49 6e  tic void constIn
24930 73 65 72 74 28 0a 20 20 57 68 65 72 65 43 6f 6e  sert(.  WhereCon
24940 73 74 20 2a 70 43 6f 6e 73 74 2c 0a 20 20 45 78  st *pConst,.  Ex
24950 70 72 20 2a 70 43 6f 6c 75 6d 6e 2c 0a 20 20 45  pr *pColumn,.  E
24960 78 70 72 20 2a 70 56 61 6c 75 65 0a 29 7b 0a 20  xpr *pValue.){. 
24970 20 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2b   pConst->nConst+
24980 2b 3b 0a 20 20 70 43 6f 6e 73 74 2d 3e 61 70 45  +;.  pConst->apE
24990 78 70 72 20 3d 20 73 71 6c 69 74 65 33 44 62 52  xpr = sqlite3DbR
249a0 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 43 6f  eallocOrFree(pCo
249b0 6e 73 74 2d 3e 64 62 2c 20 70 43 6f 6e 73 74 2d  nst->db, pConst-
249c0 3e 61 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20  >apExpr,.       
249d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249e0 20 20 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74    pConst->nConst
249f0 2a 32 2a 73 69 7a 65 6f 66 28 45 78 70 72 2a 29  *2*sizeof(Expr*)
24a00 29 3b 0a 20 20 69 66 28 20 70 43 6f 6e 73 74 2d  );.  if( pConst-
24a10 3e 61 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  >apExpr==0 ){.  
24a20 20 20 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74    pConst->nConst
24a30 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
24a40 20 20 20 77 68 69 6c 65 28 20 70 56 61 6c 75 65     while( pValue
24a50 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29  ->op==TK_UPLUS )
24a60 20 70 56 61 6c 75 65 20 3d 20 70 56 61 6c 75 65   pValue = pValue
24a70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 70 43 6f  ->pLeft;.    pCo
24a80 6e 73 74 2d 3e 61 70 45 78 70 72 5b 70 43 6f 6e  nst->apExpr[pCon
24a90 73 74 2d 3e 6e 43 6f 6e 73 74 2a 32 2d 32 5d 20  st->nConst*2-2] 
24aa0 3d 20 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70  = pColumn;.    p
24ab0 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b 70 43  Const->apExpr[pC
24ac0 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2a 32 2d 31  onst->nConst*2-1
24ad0 5d 20 3d 20 70 56 61 6c 75 65 3b 0a 20 20 7d 0a  ] = pValue;.  }.
24ae0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 6c  }../*.** Find al
24af0 6c 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 43  l instances of C
24b00 4f 4c 55 4d 4e 3d 43 4f 4e 53 54 41 4e 54 20 6f  OLUMN=CONSTANT o
24b10 72 20 43 4f 4e 53 54 41 4e 54 3d 43 4f 4c 55 4d  r CONSTANT=COLUM
24b20 4e 20 69 6e 20 70 45 78 70 72 20 74 68 61 74 0a  N in pExpr that.
24b30 2a 2a 20 6d 75 73 74 20 62 65 20 74 72 75 65 20  ** must be true 
24b40 28 74 68 61 74 20 61 72 65 20 70 61 72 74 20 6f  (that are part o
24b50 66 20 74 68 65 20 41 4e 44 2d 63 6f 6e 6e 65 63  f the AND-connec
24b60 74 65 64 20 74 65 72 6d 73 29 20 61 6e 64 20 61  ted terms) and a
24b70 64 64 20 65 61 63 68 0a 2a 2a 20 74 6f 20 70 43  dd each.** to pC
24b80 6f 6e 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  onst..*/.static 
24b90 76 6f 69 64 20 66 69 6e 64 43 6f 6e 73 74 49 6e  void findConstIn
24ba0 57 68 65 72 65 28 57 68 65 72 65 43 6f 6e 73 74  Where(WhereConst
24bb0 20 2a 70 43 6f 6e 73 74 2c 20 45 78 70 72 20 2a   *pConst, Expr *
24bc0 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45  pExpr){.  if( pE
24bd0 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
24be0 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
24bf0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
24c00 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74  _FromJoin) ) ret
24c10 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72  urn;.  if( pExpr
24c20 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a  ->op==TK_AND ){.
24c30 20 20 20 20 66 69 6e 64 43 6f 6e 73 74 49 6e 57      findConstInW
24c40 68 65 72 65 28 70 43 6f 6e 73 74 2c 20 70 45 78  here(pConst, pEx
24c50 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
24c60 20 66 69 6e 64 43 6f 6e 73 74 49 6e 57 68 65 72   findConstInWher
24c70 65 28 70 43 6f 6e 73 74 2c 20 70 45 78 70 72 2d  e(pConst, pExpr-
24c80 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 72 65 74  >pLeft);.    ret
24c90 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  urn;.  }.  if( p
24ca0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20  Expr->op!=TK_EQ 
24cb0 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
24cc0 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  rt( pExpr->pRigh
24cd0 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
24ce0 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 21 3d  ( pExpr->pLeft!=
24cf0 30 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  0 );.  if( pExpr
24d00 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ->pRight->op==TK
24d10 5f 43 4f 4c 55 4d 4e 20 26 26 20 73 71 6c 69 74  _COLUMN && sqlit
24d20 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
24d30 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29  (pExpr->pLeft) )
24d40 7b 0a 20 20 20 20 63 6f 6e 73 74 49 6e 73 65 72  {.    constInser
24d50 74 28 70 43 6f 6e 73 74 2c 20 70 45 78 70 72 2d  t(pConst, pExpr-
24d60 3e 70 52 69 67 68 74 2c 20 70 45 78 70 72 2d 3e  >pRight, pExpr->
24d70 70 4c 65 66 74 29 3b 0a 20 20 7d 65 6c 73 65 0a  pLeft);.  }else.
24d80 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65    if( pExpr->pLe
24d90 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ft->op==TK_COLUM
24da0 4e 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  N && sqlite3Expr
24db0 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72  IsConstant(pExpr
24dc0 2d 3e 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20  ->pRight) ){.   
24dd0 20 63 6f 6e 73 74 49 6e 73 65 72 74 28 70 43 6f   constInsert(pCo
24de0 6e 73 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  nst, pExpr->pLef
24df0 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
24e00 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
24e10 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72  This is a Walker
24e20 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6c 6c   expression call
24e30 62 61 63 6b 2e 20 20 70 45 78 70 72 20 69 73 20  back.  pExpr is 
24e40 61 20 63 61 6e 64 69 64 61 74 65 20 65 78 70 72  a candidate expr
24e50 65 73 73 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20  ession.** to be 
24e60 72 65 70 6c 61 63 65 64 20 62 79 20 61 20 76 61  replaced by a va
24e70 6c 75 65 2e 20 20 49 66 20 70 45 78 70 72 20 69  lue.  If pExpr i
24e80 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
24e90 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f  one of the.** co
24ea0 6c 75 6d 6e 73 20 6e 61 6d 65 64 20 69 6e 20 70  lumns named in p
24eb0 57 61 6c 6b 65 72 2d 3e 75 2e 70 43 6f 6e 73 74  Walker->u.pConst
24ec0 2c 20 74 68 65 6e 20 6f 76 65 72 77 72 69 74 65  , then overwrite
24ed0 20 69 74 20 77 69 74 68 20 69 74 73 0a 2a 2a 20   it with its.** 
24ee0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 76 61  corresponding va
24ef0 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lue..*/.static i
24f00 6e 74 20 70 72 6f 70 61 67 61 74 65 43 6f 6e 73  nt propagateCons
24f10 74 61 6e 74 45 78 70 72 52 65 77 72 69 74 65 28  tantExprRewrite(
24f20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
24f30 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
24f40 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 43   int i;.  WhereC
24f50 6f 6e 73 74 20 2a 70 43 6f 6e 73 74 3b 0a 20 20  onst *pConst;.  
24f60 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
24f70 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72  K_COLUMN ) retur
24f80 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
24f90 20 20 70 43 6f 6e 73 74 20 3d 20 70 57 61 6c 6b    pConst = pWalk
24fa0 65 72 2d 3e 75 2e 70 43 6f 6e 73 74 3b 0a 20 20  er->u.pConst;.  
24fb0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 73  for(i=0; i<pCons
24fc0 74 2d 3e 6e 43 6f 6e 73 74 3b 20 69 2b 2b 29 7b  t->nConst; i++){
24fd0 0a 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 75  .    Expr *pColu
24fe0 6d 6e 20 3d 20 70 43 6f 6e 73 74 2d 3e 61 70 45  mn = pConst->apE
24ff0 78 70 72 5b 69 2a 32 5d 3b 0a 20 20 20 20 69 66  xpr[i*2];.    if
25000 28 20 70 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72  ( pColumn==pExpr
25010 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
25020 20 69 66 28 20 70 43 6f 6c 75 6d 6e 2d 3e 69 54   if( pColumn->iT
25030 61 62 6c 65 21 3d 70 45 78 70 72 2d 3e 69 54 61  able!=pExpr->iTa
25040 62 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ble ) continue;.
25050 20 20 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e 2d      if( pColumn-
25060 3e 69 43 6f 6c 75 6d 6e 21 3d 70 45 78 70 72 2d  >iColumn!=pExpr-
25070 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69  >iColumn ) conti
25080 6e 75 65 3b 0a 20 20 20 20 2f 2a 20 41 20 6d 61  nue;.    /* A ma
25090 74 63 68 20 69 73 20 66 6f 75 6e 64 2e 20 20 54  tch is found.  T
250a0 72 61 6e 73 66 6f 72 6d 20 74 68 65 20 43 4f 4c  ransform the COL
250b0 55 4d 4e 20 69 6e 74 6f 20 61 20 43 4f 4e 53 54  UMN into a CONST
250c0 41 4e 54 20 2a 2f 0a 20 20 20 20 70 43 6f 6e 73  ANT */.    pCons
250d0 74 2d 3e 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20 20  t->nChng++;.    
250e0 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74  ExprClearPropert
250f0 79 28 70 45 78 70 72 2c 20 45 50 5f 4c 65 61 66  y(pExpr, EP_Leaf
25100 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  );.    pExpr->op
25110 20 3d 20 54 4b 5f 55 50 4c 55 53 3b 0a 20 20 20   = TK_UPLUS;.   
25120 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
25130 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
25140 43 6f 6e 73 74 2d 3e 64 62 2c 20 70 43 6f 6e 73  Const->db, pCons
25150 74 2d 3e 61 70 45 78 70 72 5b 69 2a 32 2b 31 5d  t->apExpr[i*2+1]
25160 2c 20 30 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  , 0);.    break;
25170 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
25180 43 5f 50 72 75 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  C_Prune;.}../*.*
25190 2a 20 54 68 65 20 57 48 45 52 45 2d 63 6c 61 75  * The WHERE-clau
251a0 73 65 20 63 6f 6e 73 74 61 6e 74 20 70 72 6f 70  se constant prop
251b0 61 67 61 74 69 6f 6e 20 6f 70 74 69 6d 69 7a 61  agation optimiza
251c0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
251d0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
251e0 63 6f 6e 74 61 69 6e 73 20 74 65 72 6d 73 20 6f  contains terms o
251f0 66 20 74 68 65 20 66 6f 72 6d 20 43 4f 4c 55 4d  f the form COLUM
25200 4e 3d 43 4f 4e 53 54 41 4e 54 20 6f 72 0a 2a 2a  N=CONSTANT or.**
25210 20 43 4f 4e 53 54 41 4e 54 3d 43 4f 4c 55 4d 4e   CONSTANT=COLUMN
25220 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 74 72   that must be tr
25230 65 65 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72  ee (in other wor
25240 64 73 2c 20 69 66 20 74 68 65 20 74 65 72 6d 73  ds, if the terms
25250 20 74 6f 70 2d 6c 65 76 65 6c 0a 2a 2a 20 41 4e   top-level.** AN
25260 44 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d  D-connected term
25270 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 70  s that are not p
25280 61 72 74 20 6f 66 20 61 20 4f 4e 20 63 6c 61 75  art of a ON clau
25290 73 65 20 66 72 6f 6d 20 61 20 4c 45 46 54 20 4a  se from a LEFT J
252a0 4f 49 4e 29 0a 2a 2a 20 74 68 65 6e 20 74 68 72  OIN).** then thr
252b0 6f 75 67 68 6f 75 74 20 74 68 65 20 71 75 65 72  oughout the quer
252c0 79 20 72 65 70 6c 61 63 65 20 61 6c 6c 20 6f 74  y replace all ot
252d0 68 65 72 20 6f 63 63 75 72 72 65 6e 63 65 73 20  her occurrences 
252e0 6f 66 20 43 4f 4c 55 4d 4e 0a 2a 2a 20 77 69 74  of COLUMN.** wit
252f0 68 20 43 4f 4e 53 54 41 4e 54 2e 0a 2a 2a 0a 2a  h CONSTANT..**.*
25300 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  * For example, t
25310 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  he query:.**.** 
25320 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
25330 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48  OM t1, t2, t3 WH
25340 45 52 45 20 74 31 2e 61 3d 33 39 20 41 4e 44 20  ERE t1.a=39 AND 
25350 74 32 2e 62 3d 74 31 2e 61 20 41 4e 44 20 74 33  t2.b=t1.a AND t3
25360 2e 63 3d 74 32 2e 62 0a 2a 2a 0a 2a 2a 20 49 73  .c=t2.b.**.** Is
25370 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   transformed int
25380 6f 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 53 45 4c  o.**.**      SEL
25390 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
253a0 32 2c 20 74 33 20 57 48 45 52 45 20 74 31 2e 61  2, t3 WHERE t1.a
253b0 3d 33 39 20 41 4e 44 20 74 32 2e 62 3d 33 39 20  =39 AND t2.b=39 
253c0 41 4e 44 20 74 33 2e 63 3d 33 39 0a 2a 2a 0a 2a  AND t3.c=39.**.*
253d0 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
253e0 20 61 6e 79 20 74 72 61 6e 73 66 6f 72 6d 61 74   any transformat
253f0 69 6f 6e 73 20 77 68 65 72 65 20 6d 61 64 65 20  ions where made 
25400 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  and false if not
25410 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25420 70 72 6f 70 61 67 61 74 65 43 6f 6e 73 74 61 6e  propagateConstan
25430 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ts(.  Parse *pPa
25440 72 73 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61  rse,   /* The pa
25450 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
25460 0a 20 20 53 65 6c 65 63 74 20 2a 70 20 20 20 20  .  Select *p    
25470 20 20 20 20 2f 2a 20 54 68 65 20 71 75 65 72 79      /* The query
25480 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70 72 6f   in which to pro
25490 70 61 67 61 74 65 20 63 6f 6e 73 74 61 6e 74 73  pagate constants
254a0 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 43 6f   */.){.  WhereCo
254b0 6e 73 74 20 78 3b 0a 20 20 57 61 6c 6b 65 72 20  nst x;.  Walker 
254c0 77 3b 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20 3d  w;.  int nChng =
254d0 20 30 3b 0a 20 20 78 2e 64 62 20 3d 20 70 50 61   0;.  x.db = pPa
254e0 72 73 65 2d 3e 64 62 3b 0a 20 20 64 6f 7b 0a 20  rse->db;.  do{. 
254f0 20 20 20 78 2e 6e 43 6f 6e 73 74 20 3d 20 30 3b     x.nConst = 0;
25500 0a 20 20 20 20 78 2e 6e 43 68 6e 67 20 3d 20 30  .    x.nChng = 0
25510 3b 0a 20 20 20 20 78 2e 61 70 45 78 70 72 20 3d  ;.    x.apExpr =
25520 20 30 3b 0a 20 20 20 20 66 69 6e 64 43 6f 6e 73   0;.    findCons
25530 74 49 6e 57 68 65 72 65 28 26 78 2c 20 70 2d 3e  tInWhere(&x, p->
25540 70 57 68 65 72 65 29 3b 0a 20 20 20 20 69 66 28  pWhere);.    if(
25550 20 78 2e 6e 43 6f 6e 73 74 20 29 7b 0a 20 20 20   x.nConst ){.   
25560 20 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c     memset(&w, 0,
25570 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 20   sizeof(w));.   
25580 20 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50     w.pParse = pP
25590 61 72 73 65 3b 0a 20 20 20 20 20 20 77 2e 78 45  arse;.      w.xE
255a0 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 70 72  xprCallback = pr
255b0 6f 70 61 67 61 74 65 43 6f 6e 73 74 61 6e 74 45  opagateConstantE
255c0 78 70 72 52 65 77 72 69 74 65 3b 0a 20 20 20 20  xprRewrite;.    
255d0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
255e0 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ack = sqlite3Sel
255f0 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 20  ectWalkNoop;.   
25600 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c     w.xSelectCall
25610 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 20  back2 = 0;.     
25620 20 77 2e 77 61 6c 6b 65 72 44 65 70 74 68 20 3d   w.walkerDepth =
25630 20 30 3b 0a 20 20 20 20 20 20 77 2e 75 2e 70 43   0;.      w.u.pC
25640 6f 6e 73 74 20 3d 20 26 78 3b 0a 20 20 20 20 20  onst = &x;.     
25650 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
25660 63 74 28 26 77 2c 20 70 29 3b 0a 20 20 20 20 20  ct(&w, p);.     
25670 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 78   sqlite3DbFree(x
25680 2e 64 62 2c 20 78 2e 61 70 45 78 70 72 29 3b 0a  .db, x.apExpr);.
25690 20 20 20 20 20 20 6e 43 68 6e 67 20 2b 3d 20 78        nChng += x
256a0 2e 6e 43 68 6e 67 3b 0a 20 20 20 20 7d 0a 20 20  .nChng;.    }.  
256b0 7d 77 68 69 6c 65 28 20 78 2e 6e 43 68 6e 67 20  }while( x.nChng 
256c0 29 3b 20 20 0a 20 20 72 65 74 75 72 6e 20 6e 43  );  .  return nC
256d0 68 6e 67 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  hng;.}..#if !def
256e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
256f0 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
25700 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
25710 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 4d  IT_VIEW)./*.** M
25720 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 72 65  ake copies of re
25730 6c 65 76 61 6e 74 20 57 48 45 52 45 20 63 6c 61  levant WHERE cla
25740 75 73 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  use terms of the
25750 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 6e 74   outer query int
25760 6f 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  o.** the WHERE c
25770 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72  lause of subquer
25780 79 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  y.  Example:.**.
25790 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
257a0 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53  ROM (SELECT a AS
257b0 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f   x, c-d AS y FRO
257c0 4d 20 74 31 29 20 57 48 45 52 45 20 78 3d 35 20  M t1) WHERE x=5 
257d0 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20  AND y=10;.**.** 
257e0 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  Transformed into
257f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
25800 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T * FROM (SELECT
25810 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20   a AS x, c-d AS 
25820 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  y FROM t1 WHERE 
25830 61 3d 35 20 41 4e 44 20 63 2d 64 3d 31 30 29 0a  a=5 AND c-d=10).
25840 2a 2a 20 20 20 20 20 57 48 45 52 45 20 78 3d 35  **     WHERE x=5
25850 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a   AND y=10;.**.**
25860 20 54 68 65 20 68 6f 70 65 20 69 73 20 74 68 61   The hope is tha
25870 74 20 74 68 65 20 74 65 72 6d 73 20 61 64 64 65  t the terms adde
25880 64 20 74 6f 20 74 68 65 20 69 6e 6e 65 72 20 71  d to the inner q
25890 75 65 72 79 20 77 69 6c 6c 20 6d 61 6b 65 20 69  uery will make i
258a0 74 20 6d 6f 72 65 0a 2a 2a 20 65 66 66 69 63 69  t more.** effici
258b0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f  ent..**.** Do no
258c0 74 20 61 74 74 65 6d 70 74 20 74 68 69 73 20 6f  t attempt this o
258d0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 3a 0a  ptimization if:.
258e0 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 28 2a 2a 20  **.**   (1) (** 
258f0 54 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  This restriction
25900 20 77 61 73 20 72 65 6d 6f 76 65 64 20 6f 6e 20   was removed on 
25910 32 30 31 37 2d 30 39 2d 32 39 2e 20 20 57 65 20  2017-09-29.  We 
25920 75 73 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20  used to.**      
25930 20 20 20 20 20 64 69 73 61 6c 6c 6f 77 20 74 68       disallow th
25940 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
25950 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 73 75  for aggregate su
25960 62 71 75 65 72 69 65 73 2c 20 62 75 74 20 6e 6f  bqueries, but no
25970 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 69  w.**           i
25980 74 20 69 73 20 61 6c 6c 6f 77 65 64 20 62 79 20  t is allowed by 
25990 70 75 74 74 69 6e 67 20 74 68 65 20 65 78 74 72  putting the extr
259a0 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 48  a terms on the H
259b0 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a  AVING clause..**
259c0 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20 61             The a
259d0 64 64 65 64 20 48 41 56 49 4e 47 20 63 6c 61 75  dded HAVING clau
259e0 73 65 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 20  se is pointless 
259f0 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
25a00 6c 61 63 6b 73 0a 2a 2a 20 20 20 20 20 20 20 20  lacks.**        
25a10 20 20 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c     a GROUP BY cl
25a20 61 75 73 65 2e 20 20 42 75 74 20 73 75 63 68 20  ause.  But such 
25a30 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  a HAVING clause 
25a40 69 73 20 61 6c 73 6f 20 68 61 72 6d 6c 65 73 73  is also harmless
25a50 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 73 6f  .**           so
25a60 20 74 68 65 72 65 20 64 6f 65 73 20 6e 6f 74 20   there does not 
25a70 61 70 70 65 61 72 20 74 6f 20 62 65 20 61 6e 79  appear to be any
25a80 20 72 65 61 73 6f 6e 20 74 6f 20 61 64 64 20 65   reason to add e
25a90 78 74 72 61 20 6c 6f 67 69 63 0a 2a 2a 20 20 20  xtra logic.**   
25aa0 20 20 20 20 20 20 20 20 74 6f 20 73 75 70 70 72          to suppr
25ab0 65 73 73 20 69 74 2e 20 2a 2a 29 0a 2a 2a 0a 2a  ess it. **).**.*
25ac0 2a 20 20 20 28 32 29 20 54 68 65 20 69 6e 6e 65  *   (2) The inne
25ad0 72 20 71 75 65 72 79 20 69 73 20 74 68 65 20 72  r query is the r
25ae0 65 63 75 72 73 69 76 65 20 70 61 72 74 20 6f 66  ecursive part of
25af0 20 61 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20   a common table 
25b00 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
25b10 2a 20 20 20 28 33 29 20 54 68 65 20 69 6e 6e 65  *   (3) The inne
25b20 72 20 71 75 65 72 79 20 68 61 73 20 61 20 4c 49  r query has a LI
25b30 4d 49 54 20 63 6c 61 75 73 65 20 28 73 69 6e 63  MIT clause (sinc
25b40 65 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f  e the changes to
25b50 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 20 20   the WHERE.**   
25b60 20 20 20 20 63 6c 61 75 73 65 20 77 6f 75 6c 64      clause would
25b70 20 63 68 61 6e 67 65 20 74 68 65 20 6d 65 61 6e   change the mean
25b80 69 6e 67 20 6f 66 20 74 68 65 20 4c 49 4d 49 54  ing of the LIMIT
25b90 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 54  )..**.**   (4) T
25ba0 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69  he inner query i
25bb0 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
25bc0 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  and of a LEFT JO
25bd0 49 4e 20 61 6e 64 20 74 68 65 0a 2a 2a 20 20 20  IN and the.**   
25be0 20 20 20 20 65 78 70 72 65 73 73 69 6f 6e 20 74      expression t
25bf0 6f 20 62 65 20 70 75 73 68 65 64 20 64 6f 77 6e  o be pushed down
25c00 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 66   does not come f
25c10 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73  rom the ON claus
25c20 65 0a 2a 2a 20 20 20 20 20 20 20 6f 6e 20 74 68  e.**       on th
25c30 61 74 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 2a 2a  at LEFT JOIN..**
25c40 0a 2a 2a 20 20 20 28 35 29 20 54 68 65 20 57 48  .**   (5) The WH
25c50 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65  ERE clause expre
25c60 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 73  ssion originates
25c70 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
25c80 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20  ING clause.**   
25c90 20 20 20 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f      of a LEFT JO
25ca0 49 4e 20 77 68 65 72 65 20 69 43 75 72 73 6f 72  IN where iCursor
25cb0 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68   is not the righ
25cc0 74 2d 68 61 6e 64 20 74 61 62 6c 65 20 6f 66 20  t-hand table of 
25cd0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 6c 65  that.**       le
25ce0 66 74 20 6a 6f 69 6e 2e 20 20 41 6e 20 65 78 61  ft join.  An exa
25cf0 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
25d00 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 0a 2a        SELECT *.*
25d10 2a 20 20 20 20 20 20 20 20 20 20 20 46 52 4f 4d  *           FROM
25d20 20 28 53 45 4c 45 43 54 20 31 20 41 53 20 61 31   (SELECT 1 AS a1
25d30 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
25d40 54 20 32 29 20 41 53 20 61 61 0a 2a 2a 20 20 20  T 2) AS aa.**   
25d50 20 20 20 20 20 20 20 20 4a 4f 49 4e 20 28 53 45          JOIN (SE
25d60 4c 45 43 54 20 31 20 41 53 20 62 32 20 55 4e 49  LECT 1 AS b2 UNI
25d70 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 32 29  ON ALL SELECT 2)
25d80 20 41 53 20 62 62 20 4f 4e 20 28 61 31 3d 62 32   AS bb ON (a1=b2
25d90 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4c  ).**           L
25da0 45 46 54 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54  EFT JOIN (SELECT
25db0 20 38 20 41 53 20 63 33 20 55 4e 49 4f 4e 20 41   8 AS c3 UNION A
25dc0 4c 4c 20 53 45 4c 45 43 54 20 39 29 20 41 53 20  LL SELECT 9) AS 
25dd0 63 63 20 4f 4e 20 28 62 32 3d 32 29 3b 0a 2a 2a  cc ON (b2=2);.**
25de0 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20 63 6f  .**       The co
25df0 72 72 65 63 74 20 61 6e 73 77 65 72 20 69 73 20  rrect answer is 
25e00 74 68 72 65 65 20 72 6f 77 73 3a 20 20 28 31 2c  three rows:  (1,
25e10 31 2c 4e 55 4c 4c 29 2c 28 32 2c 32 2c 38 29 2c  1,NULL),(2,2,8),
25e20 28 32 2c 32 2c 39 29 2e 0a 2a 2a 20 20 20 20 20  (2,2,9)..**     
25e30 20 20 42 75 74 20 69 66 20 74 68 65 20 28 62 32    But if the (b2
25e40 3d 32 29 20 74 65 72 6d 20 77 65 72 65 20 74 6f  =2) term were to
25e50 20 62 65 20 70 75 73 68 65 64 20 64 6f 77 6e 20   be pushed down 
25e60 69 6e 74 6f 20 74 68 65 20 62 62 20 73 75 62 71  into the bb subq
25e70 75 65 72 79 2c 0a 2a 2a 20 20 20 20 20 20 20 74  uery,.**       t
25e80 68 65 6e 20 74 68 65 20 28 31 2c 31 2c 4e 55 4c  hen the (1,1,NUL
25e90 4c 29 20 72 6f 77 20 77 6f 75 6c 64 20 62 65 20  L) row would be 
25ea0 73 75 70 70 72 65 73 73 65 64 2e 0a 2a 2a 0a 2a  suppressed..**.*
25eb0 2a 20 20 20 28 36 29 20 54 68 65 20 69 6e 6e 65  *   (6) The inne
25ec0 72 20 71 75 65 72 79 20 66 65 61 74 75 72 65 73  r query features
25ed0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 77 69 6e   one or more win
25ee0 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 73 20 28 73  dow-functions (s
25ef0 69 6e 63 65 20 0a 2a 2a 20 20 20 20 20 20 20 63  ince .**       c
25f00 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 57 48  hanges to the WH
25f10 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ERE clause of th
25f20 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 63 6f  e inner query co
25f30 75 6c 64 20 63 68 61 6e 67 65 20 74 68 65 20 0a  uld change the .
25f40 2a 2a 20 20 20 20 20 20 20 77 69 6e 64 6f 77 20  **       window 
25f50 6f 76 65 72 20 77 68 69 63 68 20 77 69 6e 64 6f  over which windo
25f60 77 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20  w functions are 
25f70 63 61 6c 63 75 6c 61 74 65 64 29 2e 0a 2a 2a 0a  calculated)..**.
25f80 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  ** Return 0 if n
25f90 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
25fa0 64 65 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20  de and non-zero 
25fb0 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57  if one or more W
25fc0 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 74  HERE clause.** t
25fd0 65 72 6d 73 20 61 72 65 20 64 75 70 6c 69 63 61  erms are duplica
25fe0 74 65 64 20 69 6e 74 6f 20 74 68 65 20 73 75 62  ted into the sub
25ff0 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  query..*/.static
26000 20 69 6e 74 20 70 75 73 68 44 6f 77 6e 57 68 65   int pushDownWhe
26010 72 65 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65  reTerms(.  Parse
26020 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
26030 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
26040 74 20 28 66 6f 72 20 6d 61 6c 6c 6f 63 28 29 20  t (for malloc() 
26050 61 6e 64 20 65 72 72 6f 72 20 72 65 70 6f 72 74  and error report
26060 69 6e 67 29 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ing) */.  Select
26070 20 2a 70 53 75 62 71 2c 20 20 20 20 20 20 20 20   *pSubq,        
26080 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  /* The subquery 
26090 77 68 6f 73 65 20 57 48 45 52 45 20 63 6c 61 75  whose WHERE clau
260a0 73 65 20 69 73 20 74 6f 20 62 65 20 61 75 67 6d  se is to be augm
260b0 65 6e 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 20  ented */.  Expr 
260c0 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
260d0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
260e0 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
260f0 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  r query */.  int
26100 20 69 43 75 72 73 6f 72 2c 20 20 20 20 20 20 20   iCursor,       
26110 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
26120 62 65 72 20 6f 66 20 74 68 65 20 73 75 62 71 75  ber of the subqu
26130 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c  ery */.  int isL
26140 65 66 74 4a 6f 69 6e 20 20 20 20 20 20 20 20 2f  eftJoin        /
26150 2a 20 54 72 75 65 20 69 66 20 70 53 75 62 71 20  * True if pSubq 
26160 69 73 20 74 68 65 20 72 69 67 68 74 20 74 65 72  is the right ter
26170 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  m of a LEFT JOIN
26180 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
26190 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 43 68 6e 67  New;.  int nChng
261a0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 57 68 65   = 0;.  if( pWhe
261b0 72 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  re==0 ) return 0
261c0 3b 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e 73  ;.  if( pSubq->s
261d0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
261e0 75 72 73 69 76 65 20 29 20 72 65 74 75 72 6e 20  ursive ) return 
261f0 30 3b 20 20 2f 2a 20 72 65 73 74 72 69 63 74 69  0;  /* restricti
26200 6f 6e 20 28 32 29 20 2a 2f 0a 0a 23 69 66 6e 64  on (2) */..#ifnd
26210 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
26220 49 4e 44 4f 57 46 55 4e 43 0a 20 20 69 66 28 20  INDOWFUNC.  if( 
26230 70 53 75 62 71 2d 3e 70 57 69 6e 20 29 20 72 65  pSubq->pWin ) re
26240 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 72 65  turn 0;    /* re
26250 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20 2a 2f  striction (6) */
26260 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
26270 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
26280 2a 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74  * Only the first
26290 20 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70 6f   term of a compo
262a0 75 6e 64 20 63 61 6e 20 68 61 76 65 20 61 20 57  und can have a W
262b0 49 54 48 20 63 6c 61 75 73 65 2e 20 20 42 75 74  ITH clause.  But
262c0 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20   make.  ** sure 
262d0 6e 6f 20 6f 74 68 65 72 20 74 65 72 6d 73 20 61  no other terms a
262e0 72 65 20 6d 61 72 6b 65 64 20 53 46 5f 52 65 63  re marked SF_Rec
262f0 75 72 73 69 76 65 20 69 6e 20 63 61 73 65 20 73  ursive in case s
26300 6f 6d 65 74 68 69 6e 67 20 63 68 61 6e 67 65 73  omething changes
26310 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66 75 74  .  ** in the fut
26320 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20  ure..  */.  {.  
26330 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 20 20 0a    Select *pX;  .
26340 20 20 20 20 66 6f 72 28 70 58 3d 70 53 75 62 71      for(pX=pSubq
26350 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 50 72  ; pX; pX=pX->pPr
26360 69 6f 72 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ior){.      asse
26370 72 74 28 20 28 70 58 2d 3e 73 65 6c 46 6c 61 67  rt( (pX->selFlag
26380 73 20 26 20 28 53 46 5f 52 65 63 75 72 73 69 76  s & (SF_Recursiv
26390 65 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  e))==0 );.    }.
263a0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
263b0 28 20 70 53 75 62 71 2d 3e 70 4c 69 6d 69 74 21  ( pSubq->pLimit!
263c0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
263d0 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69   0; /* restricti
263e0 6f 6e 20 28 33 29 20 2a 2f 0a 20 20 7d 0a 20 20  on (3) */.  }.  
263f0 77 68 69 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f  while( pWhere->o
26400 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20  p==TK_AND ){.   
26410 20 6e 43 68 6e 67 20 2b 3d 20 70 75 73 68 44 6f   nChng += pushDo
26420 77 6e 57 68 65 72 65 54 65 72 6d 73 28 70 50 61  wnWhereTerms(pPa
26430 72 73 65 2c 20 70 53 75 62 71 2c 20 70 57 68 65  rse, pSubq, pWhe
26440 72 65 2d 3e 70 52 69 67 68 74 2c 0a 20 20 20 20  re->pRight,.    
26450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26460 20 20 20 20 20 20 20 20 20 20 20 20 69 43 75 72              iCur
26470 73 6f 72 2c 20 69 73 4c 65 66 74 4a 6f 69 6e 29  sor, isLeftJoin)
26480 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 70  ;.    pWhere = p
26490 57 68 65 72 65 2d 3e 70 4c 65 66 74 3b 0a 20 20  Where->pLeft;.  
264a0 7d 0a 20 20 69 66 28 20 69 73 4c 65 66 74 4a 6f  }.  if( isLeftJo
264b0 69 6e 0a 20 20 20 26 26 20 28 45 78 70 72 48 61  in.   && (ExprHa
264c0 73 50 72 6f 70 65 72 74 79 28 70 57 68 65 72 65  sProperty(pWhere
264d0 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3d 3d 30  ,EP_FromJoin)==0
264e0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57 68  .         || pWh
264f0 65 72 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  ere->iRightJoinT
26500 61 62 6c 65 21 3d 69 43 75 72 73 6f 72 29 0a 20  able!=iCursor). 
26510 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
26520 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e  ; /* restriction
26530 20 28 34 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66   (4) */.  }.  if
26540 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
26550 79 28 70 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d  y(pWhere,EP_From
26560 4a 6f 69 6e 29 20 26 26 20 70 57 68 65 72 65 2d  Join) && pWhere-
26570 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
26580 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  !=iCursor ){.   
26590 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65   return 0; /* re
265a0 73 74 72 69 63 74 69 6f 6e 20 28 35 29 20 2a 2f  striction (5) */
265b0 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
265c0 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e  e3ExprIsTableCon
265d0 73 74 61 6e 74 28 70 57 68 65 72 65 2c 20 69 43  stant(pWhere, iC
265e0 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 6e 43  ursor) ){.    nC
265f0 68 6e 67 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65  hng++;.    while
26600 28 20 70 53 75 62 71 20 29 7b 0a 20 20 20 20 20  ( pSubq ){.     
26610 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 78 3b   SubstContext x;
26620 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71  .      pNew = sq
26630 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
26640 72 73 65 2d 3e 64 62 2c 20 70 57 68 65 72 65 2c  rse->db, pWhere,
26650 20 30 29 3b 0a 20 20 20 20 20 20 75 6e 73 65 74   0);.      unset
26660 4a 6f 69 6e 45 78 70 72 28 70 4e 65 77 2c 20 2d  JoinExpr(pNew, -
26670 31 29 3b 0a 20 20 20 20 20 20 78 2e 70 50 61 72  1);.      x.pPar
26680 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20  se = pParse;.   
26690 20 20 20 78 2e 69 54 61 62 6c 65 20 3d 20 69 43     x.iTable = iC
266a0 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69  ursor;.      x.i
266b0 4e 65 77 54 61 62 6c 65 20 3d 20 69 43 75 72 73  NewTable = iCurs
266c0 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69 73 4c 65  or;.      x.isLe
266d0 66 74 4a 6f 69 6e 20 3d 20 30 3b 0a 20 20 20 20  ftJoin = 0;.    
266e0 20 20 78 2e 70 45 4c 69 73 74 20 3d 20 70 53 75    x.pEList = pSu
266f0 62 71 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  bq->pEList;.    
26700 20 20 70 4e 65 77 20 3d 20 73 75 62 73 74 45 78    pNew = substEx
26710 70 72 28 26 78 2c 20 70 4e 65 77 29 3b 0a 20 20  pr(&x, pNew);.  
26720 20 20 20 20 69 66 28 20 70 53 75 62 71 2d 3e 73      if( pSubq->s
26730 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
26740 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20 20 20  regate ){.      
26750 20 20 70 53 75 62 71 2d 3e 70 48 61 76 69 6e 67    pSubq->pHaving
26760 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
26770 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  d(pParse->db, pS
26780 75 62 71 2d 3e 70 48 61 76 69 6e 67 2c 20 70 4e  ubq->pHaving, pN
26790 65 77 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ew);.      }else
267a0 7b 0a 20 20 20 20 20 20 20 20 70 53 75 62 71 2d  {.        pSubq-
267b0 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
267c0 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
267d0 3e 64 62 2c 20 70 53 75 62 71 2d 3e 70 57 68 65  >db, pSubq->pWhe
267e0 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  re, pNew);.     
267f0 20 7d 0a 20 20 20 20 20 20 70 53 75 62 71 20 3d   }.      pSubq =
26800 20 70 53 75 62 71 2d 3e 70 50 72 69 6f 72 3b 0a   pSubq->pPrior;.
26810 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
26820 72 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 23 65 6e 64  rn nChng;.}.#end
26830 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
26840 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
26850 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
26860 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
26870 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  W) */../*.** The
26880 20 70 46 75 6e 63 20 69 73 20 74 68 65 20 6f 6e   pFunc is the on
26890 6c 79 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ly aggregate fun
268a0 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 71 75 65  ction in the que
268b0 72 79 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65  ry.  Check to se
268c0 65 0a 2a 2a 20 69 66 20 74 68 65 20 71 75 65 72  e.** if the quer
268d0 79 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  y is a candidate
268e0 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78   for the min/max
268f0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 0a   optimization. .
26900 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65  **.** If the que
26910 72 79 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  ry is a candidat
26920 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d 61  e for the min/ma
26930 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  x optimization, 
26940 74 68 65 6e 20 73 65 74 0a 2a 2a 20 2a 70 70 4d  then set.** *ppM
26950 69 6e 4d 61 78 20 74 6f 20 62 65 20 61 6e 20 4f  inMax to be an O
26960 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
26970 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  o be used for th
26980 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a  e optimization.*
26990 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 65 69 74  * and return eit
269a0 68 65 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42  her WHERE_ORDERB
269b0 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f  Y_MIN or WHERE_O
269c0 52 44 45 52 42 59 5f 4d 41 58 20 64 65 70 65 6e  RDERBY_MAX depen
269d0 64 69 6e 67 20 6f 6e 0a 2a 2a 20 77 68 65 74 68  ding on.** wheth
269e0 65 72 20 70 46 75 6e 63 20 69 73 20 61 20 6d 69  er pFunc is a mi
269f0 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e  n() or max() fun
26a00 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
26a10 74 68 65 20 71 75 65 72 79 20 69 73 20 6e 6f 74  the query is not
26a20 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
26a30 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70 74   the min/max opt
26a40 69 6d 69 7a 61 74 69 6f 6e 2c 20 72 65 74 75 72  imization, retur
26a50 6e 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45 52  n.** WHERE_ORDER
26a60 42 59 5f 4e 4f 52 4d 41 4c 20 28 77 68 69 63 68  BY_NORMAL (which
26a70 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 29 2e 0a   must be zero)..
26a80 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
26a90 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  ne must be calle
26aa0 64 20 61 66 74 65 72 20 61 67 67 72 65 67 61 74  d after aggregat
26ab0 65 20 66 75 6e 63 74 69 6f 6e 73 20 68 61 76 65  e functions have
26ac0 20 62 65 65 6e 0a 2a 2a 20 6c 6f 63 61 74 65 64   been.** located
26ad0 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 65 69   but before thei
26ae0 72 20 61 72 67 75 6d 65 6e 74 73 20 68 61 76 65  r arguments have
26af0 20 62 65 65 6e 20 73 75 62 6a 65 63 74 65 64 20   been subjected 
26b00 74 6f 20 61 67 67 72 65 67 61 74 65 0a 2a 2a 20  to aggregate.** 
26b10 61 6e 61 6c 79 73 69 73 2e 0a 2a 2f 0a 73 74 61  analysis..*/.sta
26b20 74 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65  tic u8 minMaxQue
26b30 72 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ry(sqlite3 *db, 
26b40 45 78 70 72 20 2a 70 46 75 6e 63 2c 20 45 78 70  Expr *pFunc, Exp
26b50 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78  rList **ppMinMax
26b60 29 7b 0a 20 20 69 6e 74 20 65 52 65 74 20 3d 20  ){.  int eRet = 
26b70 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f  WHERE_ORDERBY_NO
26b80 52 4d 41 4c 3b 20 20 20 20 20 20 2f 2a 20 52 65  RMAL;      /* Re
26b90 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20  turn value */.  
26ba0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
26bb0 20 3d 20 70 46 75 6e 63 2d 3e 78 2e 70 4c 69 73   = pFunc->x.pLis
26bc0 74 3b 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e  t;    /* Argumen
26bd0 74 73 20 74 6f 20 61 67 67 20 66 75 6e 63 74 69  ts to agg functi
26be0 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  on */.  const ch
26bf0 61 72 20 2a 7a 46 75 6e 63 3b 20 20 20 20 20 20  ar *zFunc;      
26c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26c10 20 4e 61 6d 65 20 6f 66 20 61 67 67 72 65 67 61   Name of aggrega
26c20 74 65 20 66 75 6e 63 74 69 6f 6e 20 70 46 75 6e  te function pFun
26c30 63 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  c */.  ExprList 
26c40 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20 75 38 20  *pOrderBy;.  u8 
26c50 73 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20 61 73  sortOrder;..  as
26c60 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78 3d  sert( *ppMinMax=
26c70 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
26c80 70 46 75 6e 63 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pFunc->op==TK_AG
26c90 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
26ca0 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 7c 7c  if( pEList==0 ||
26cb0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d   pEList->nExpr!=
26cc0 31 20 29 20 72 65 74 75 72 6e 20 65 52 65 74 3b  1 ) return eRet;
26cd0 0a 20 20 7a 46 75 6e 63 20 3d 20 70 46 75 6e 63  .  zFunc = pFunc
26ce0 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 69 66  ->u.zToken;.  if
26cf0 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
26d00 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d  (zFunc, "min")==
26d10 30 20 29 7b 0a 20 20 20 20 65 52 65 74 20 3d 20  0 ){.    eRet = 
26d20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
26d30 4e 3b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72  N;.    sortOrder
26d40 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43   = SQLITE_SO_ASC
26d50 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
26d60 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75  lite3StrICmp(zFu
26d70 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b  nc, "max")==0 ){
26d80 0a 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52  .    eRet = WHER
26d90 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20  E_ORDERBY_MAX;. 
26da0 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 53     sortOrder = S
26db0 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3b 0a 20  QLITE_SO_DESC;. 
26dc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
26dd0 72 6e 20 65 52 65 74 3b 0a 20 20 7d 0a 20 20 2a  rn eRet;.  }.  *
26de0 70 70 4d 69 6e 4d 61 78 20 3d 20 70 4f 72 64 65  ppMinMax = pOrde
26df0 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
26e00 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 45 4c  rListDup(db, pEL
26e10 69 73 74 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  ist, 0);.  asser
26e20 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 7c  t( pOrderBy!=0 |
26e30 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
26e40 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4f 72 64  ed );.  if( pOrd
26e50 65 72 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d  erBy ) pOrderBy-
26e60 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[0].sortOrder 
26e70 3d 20 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 72  = sortOrder;.  r
26e80 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f  eturn eRet;.}../
26e90 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20  *.** The select 
26ea0 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
26eb0 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
26ec0 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67  gument is an agg
26ed0 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a  regate query..**
26ee0 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
26ef0 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f  ment is the asso
26f00 63 69 61 74 65 64 20 61 67 67 72 65 67 61 74 65  ciated aggregate
26f10 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68  -info object. Th
26f20 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
26f30 74 65 73 74 73 20 69 66 20 74 68 65 20 53 45 4c  tests if the SEL
26f40 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ECT is of the fo
26f50 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  rm:.**.**   SELE
26f60 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
26f70 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65   <tbl>.**.** whe
26f80 72 65 20 74 61 62 6c 65 20 69 73 20 61 20 64 61  re table is a da
26f90 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f  tabase table, no
26fa0 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  t a sub-select o
26fb0 72 20 76 69 65 77 2e 20 49 66 20 74 68 65 20 71  r view. If the q
26fc0 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74  uery.** does mat
26fd0 63 68 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c  ch this pattern,
26fe0 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20   then a pointer 
26ff0 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  to the Table obj
27000 65 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67  ect representing
27010 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74  .** <tbl> is ret
27020 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
27030 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e  , 0 is returned.
27040 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65  .*/.static Table
27050 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28   *isSimpleCount(
27060 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e  Select *p, AggIn
27070 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
27080 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
27090 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20  Expr *pExpr;..  
270a0 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f  assert( !p->pGro
270b0 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70  upBy );..  if( p
270c0 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70  ->pWhere || p->p
270d0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
270e0 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e  .   || p->pSrc->
270f0 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53  nSrc!=1 || p->pS
27100 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
27110 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
27120 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d   0;.  }.  pTab =
27130 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
27140 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70  Tab;.  pExpr = p
27150 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
27160 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20  Expr;.  assert( 
27170 70 54 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70  pTab && !pTab->p
27180 53 65 6c 65 63 74 20 26 26 20 70 45 78 70 72 20  Select && pExpr 
27190 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74  );..  if( IsVirt
271a0 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75  ual(pTab) ) retu
271b0 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
271c0 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55  r->op!=TK_AGG_FU
271d0 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20  NCTION ) return 
271e0 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  0;.  if( NEVER(p
271f0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d  AggInfo->nFunc==
27200 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  0) ) return 0;. 
27210 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e   if( (pAggInfo->
27220 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e  aFunc[0].pFunc->
27230 66 75 6e 63 46 6c 61 67 73 26 53 51 4c 49 54 45  funcFlags&SQLITE
27240 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20  _FUNC_COUNT)==0 
27250 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
27260 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45  ( pExpr->flags&E
27270 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65 74  P_Distinct ) ret
27280 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e  urn 0;..  return
27290 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pTab;.}../*.** 
272a0 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69  If the source-li
272b0 73 74 20 69 74 65 6d 20 70 61 73 73 65 64 20 61  st item passed a
272c0 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61  s an argument wa
272d0 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68  s augmented with
272e0 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42   an.** INDEXED B
272f0 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74  Y clause, then t
27300 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  ry to locate the
27310 20 73 70 65 63 69 66 69 65 64 20 69 6e 64 65 78   specified index
27320 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61  . If there.** wa
27330 73 20 73 75 63 68 20 61 20 63 6c 61 75 73 65 20  s such a clause 
27340 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e  and the named in
27350 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  dex cannot be fo
27360 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  und, return .** 
27370 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64  SQLITE_ERROR and
27380 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
27390 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72  in pParse. Other
273a0 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a  wise, populate .
273b0 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78  ** pFrom->pIndex
273c0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
273d0 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
273e0 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f  lite3IndexedByLo
273f0 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50 61 72  okup(Parse *pPar
27400 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69  se, struct SrcLi
27410 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b  st_item *pFrom){
27420 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54  .  if( pFrom->pT
27430 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 66 67 2e  ab && pFrom->fg.
27440 69 73 49 6e 64 65 78 65 64 42 79 20 29 7b 0a 20  isIndexedBy ){. 
27450 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
27460 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
27470 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 65 64    char *zIndexed
27480 42 79 20 3d 20 70 46 72 6f 6d 2d 3e 75 31 2e 7a  By = pFrom->u1.z
27490 49 6e 64 65 78 65 64 42 79 3b 0a 20 20 20 20 49  IndexedBy;.    I
274a0 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
274b0 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
274c0 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20  Index; .        
274d0 70 49 64 78 20 26 26 20 73 71 6c 69 74 65 33 53  pIdx && sqlite3S
274e0 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61  trICmp(pIdx->zNa
274f0 6d 65 2c 20 7a 49 6e 64 65 78 65 64 42 79 29 3b  me, zIndexedBy);
27500 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 3d 70   .        pIdx=p
27510 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29  Idx->pNext.    )
27520 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64 78 20  ;.    if( !pIdx 
27530 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
27540 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
27550 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a   "no such index:
27560 20 25 73 22 2c 20 7a 49 6e 64 65 78 65 64 42 79   %s", zIndexedBy
27570 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
27580 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
27590 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 1;.      retur
275a0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
275b0 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d      }.    pFrom-
275c0 3e 70 49 42 49 6e 64 65 78 20 3d 20 70 49 64 78  >pIBIndex = pIdx
275d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
275e0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a  QLITE_OK;.}./*.*
275f0 2a 20 44 65 74 65 63 74 20 63 6f 6d 70 6f 75 6e  * Detect compoun
27600 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
27610 6e 74 73 20 74 68 61 74 20 75 73 65 20 61 6e 20  nts that use an 
27620 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
27630 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74 65  with .** an alte
27640 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e  rnative collatin
27650 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  g sequence..**.*
27660 2a 20 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20  *    SELECT ... 
27670 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53  FROM t1 EXCEPT S
27680 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
27690 32 20 4f 52 44 45 52 20 42 59 20 2e 2e 20 43 4f  2 ORDER BY .. CO
276a0 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  LLATE ....**.** 
276b0 54 68 65 73 65 20 61 72 65 20 72 65 77 72 69 74  These are rewrit
276c0 74 65 6e 20 61 73 20 61 20 73 75 62 71 75 65 72  ten as a subquer
276d0 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  y:.**.**    SELE
276e0 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT * FROM (SELEC
276f0 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58  T ... FROM t1 EX
27700 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20  CEPT SELECT ... 
27710 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20 20  FROM t2).**     
27720 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f 4c  ORDER BY ... COL
27730 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54  LATE ....**.** T
27740 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  his transformati
27750 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  on is necessary 
27760 62 65 63 61 75 73 65 20 74 68 65 20 6d 75 6c 74  because the mult
27770 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29  iSelectOrderBy()
27780 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f 76   routine.** abov
27790 65 20 74 68 61 74 20 67 65 6e 65 72 61 74 65 73  e that generates
277a0 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20   the code for a 
277b0 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
277c0 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  with an ORDER BY
277d0 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73 20   clause.** uses 
277e0 61 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68  a merge algorith
277f0 6d 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  m that requires 
27800 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69  the same collati
27810 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 6e 20 74  ng sequence on t
27820 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c  he.** result col
27830 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68 65 20 4f  umns as on the O
27840 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
27850 20 53 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20 68   See ticket.** h
27860 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65  ttp://www.sqlite
27870 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36 37  .org/src/info/67
27880 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54  09574d2a.**.** T
27890 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  his transformati
278a0 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65  on is only neede
278b0 64 20 66 6f 72 20 45 58 43 45 50 54 2c 20 49 4e  d for EXCEPT, IN
278c0 54 45 52 53 45 43 54 2c 20 61 6e 64 20 55 4e 49  TERSECT, and UNI
278d0 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f 4e  ON..** The UNION
278e0 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77 6f   ALL operator wo
278f0 72 6b 73 20 66 69 6e 65 20 77 69 74 68 20 6d 75  rks fine with mu
27900 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
27910 28 29 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20  () even when.** 
27920 74 68 65 72 65 20 61 72 65 20 43 4f 4c 4c 41 54  there are COLLAT
27930 45 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  E terms in the O
27940 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61 74  RDER BY..*/.stat
27950 69 63 20 69 6e 74 20 63 6f 6e 76 65 72 74 43 6f  ic int convertCo
27960 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75  mpoundSelectToSu
27970 62 71 75 65 72 79 28 57 61 6c 6b 65 72 20 2a 70  bquery(Walker *p
27980 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
27990 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53  p){.  int i;.  S
279a0 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53  elect *pNew;.  S
279b0 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20 73 71 6c  elect *pX;.  sql
279c0 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74 72 75  ite3 *db;.  stru
279d0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
279e0 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a   *a;.  SrcList *
279f0 70 4e 65 77 53 72 63 3b 0a 20 20 50 61 72 73 65  pNewSrc;.  Parse
27a00 20 2a 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b 65   *pParse;.  Toke
27a10 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28 20  n dummy;..  if( 
27a20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72  p->pPrior==0 ) r
27a30 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
27a40 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72  ue;.  if( p->pOr
27a50 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72  derBy==0 ) retur
27a60 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
27a70 20 20 66 6f 72 28 70 58 3d 70 3b 20 70 58 20 26    for(pX=p; pX &
27a80 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  & (pX->op==TK_AL
27a90 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  L || pX->op==TK_
27aa0 53 45 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d 3e  SELECT); pX=pX->
27ab0 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28 20  pPrior){}.  if( 
27ac0 70 58 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  pX==0 ) return W
27ad0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 61  RC_Continue;.  a
27ae0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e   = p->pOrderBy->
27af0 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70 4f  a;.  for(i=p->pO
27b00 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 3b  rderBy->nExpr-1;
27b10 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
27b20 20 69 66 28 20 61 5b 69 5d 2e 70 45 78 70 72 2d   if( a[i].pExpr-
27b30 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
27b40 61 74 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ate ) break;.  }
27b50 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74  .  if( i<0 ) ret
27b60 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
27b70 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  ;..  /* If we re
27b80 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
27b90 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 74  that means the t
27ba0 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73  ransformation is
27bb0 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a 20   required. */.. 
27bc0 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65   pParse = pWalke
27bd0 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20  r->pParse;.  db 
27be0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
27bf0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
27c00 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
27c10 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
27c20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
27c30 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
27c40 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d  ;.  memset(&dumm
27c50 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d  y, 0, sizeof(dum
27c60 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53 72 63 20  my));.  pNewSrc 
27c70 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
27c80 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70  AppendFromTerm(p
27c90 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75 6d  Parse,0,0,0,&dum
27ca0 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20 20  my,pNew,0,0);.  
27cb0 69 66 28 20 70 4e 65 77 53 72 63 3d 3d 30 20 29  if( pNewSrc==0 )
27cc0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
27cd0 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70 3b  t;.  *pNew = *p;
27ce0 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e 65  .  p->pSrc = pNe
27cf0 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69 73  wSrc;.  p->pELis
27d00 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
27d10 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
27d20 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72  , 0, sqlite3Expr
27d30 28 64 62 2c 20 54 4b 5f 41 53 54 45 52 49 53 4b  (db, TK_ASTERISK
27d40 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d  , 0));.  p->op =
27d50 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 2d   TK_SELECT;.  p-
27d60 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 70  >pWhere = 0;.  p
27d70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
27d80 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  0;.  pNew->pHavi
27d90 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  ng = 0;.  pNew->
27da0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
27db0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
27dc0 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20   p->pNext = 0;. 
27dd0 20 70 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20   p->pWith = 0;. 
27de0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
27df0 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20  ~SF_Compound;.  
27e00 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
27e10 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76 65 72  lags & SF_Conver
27e20 74 65 64 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e  ted)==0 );.  p->
27e30 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43  selFlags |= SF_C
27e40 6f 6e 76 65 72 74 65 64 3b 0a 20 20 61 73 73 65  onverted;.  asse
27e50 72 74 28 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  rt( pNew->pPrior
27e60 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  !=0 );.  pNew->p
27e70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Prior->pNext = p
27e80 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  New;.  pNew->pLi
27e90 6d 69 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  mit = 0;.  retur
27ea0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
27eb0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
27ec0 6f 20 73 65 65 20 69 66 20 74 68 65 20 46 52 4f  o see if the FRO
27ed0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70 46  M clause term pF
27ee0 72 6f 6d 20 68 61 73 20 74 61 62 6c 65 2d 76 61  rom has table-va
27ef0 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  lued function.**
27f00 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 49 66 20   arguments.  If 
27f10 69 74 20 64 6f 65 73 2c 20 6c 65 61 76 65 20 61  it does, leave a
27f20 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
27f30 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
27f40 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  turn.** non-zero
27f50 2c 20 73 69 6e 63 65 20 70 46 72 6f 6d 20 69 73  , since pFrom is
27f60 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20   not allowed to 
27f70 62 65 20 61 20 74 61 62 6c 65 2d 76 61 6c 75 65  be a table-value
27f80 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  d function..*/.s
27f90 74 61 74 69 63 20 69 6e 74 20 63 61 6e 6e 6f 74  tatic int cannot
27fa0 42 65 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65  BeFunction(Parse
27fb0 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74   *pParse, struct
27fc0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
27fd0 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72  From){.  if( pFr
27fe0 6f 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  om->fg.isTabFunc
27ff0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
28000 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
28010 22 27 25 73 27 20 69 73 20 6e 6f 74 20 61 20 66  "'%s' is not a f
28020 75 6e 63 74 69 6f 6e 22 2c 20 70 46 72 6f 6d 2d  unction", pFrom-
28030 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
28040 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
28050 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65  urn 0;.}..#ifnde
28060 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
28070 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  E./*.** Argument
28080 20 70 57 69 74 68 20 28 77 68 69 63 68 20 6d 61   pWith (which ma
28090 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74  y be NULL) point
280a0 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69  s to a linked li
280b0 73 74 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a  st of nested .**
280c0 20 57 49 54 48 20 63 6f 6e 74 65 78 74 73 2c 20   WITH contexts, 
280d0 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75  from inner to ou
280e0 74 65 72 6d 6f 73 74 2e 20 49 66 20 74 68 65 20  termost. If the 
280f0 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64  table identified
28100 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61   by .** FROM cla
28110 75 73 65 20 65 6c 65 6d 65 6e 74 20 70 49 74 65  use element pIte
28120 6d 20 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f  m is really a co
28130 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65  mmon-table-expre
28140 73 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20  ssion (CTE) .** 
28150 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f  then return a po
28160 69 6e 74 65 72 20 74 6f 20 74 68 65 20 43 54 45  inter to the CTE
28170 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20   definition for 
28180 74 68 61 74 20 74 61 62 6c 65 2e 20 4f 74 68 65  that table. Othe
28190 72 77 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20  rwise.** return 
281a0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  NULL..**.** If a
281b0 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20   non-NULL value 
281c0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 73 65 74  is returned, set
281d0 20 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f 20 70   *ppContext to p
281e0 6f 69 6e 74 20 74 6f 20 74 68 65 20 57 69 74 68  oint to the With
281f0 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20  .** object that 
28200 74 68 65 20 72 65 74 75 72 6e 65 64 20 43 54 45  the returned CTE
28210 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a   belongs to..*/.
28220 73 74 61 74 69 63 20 73 74 72 75 63 74 20 43 74  static struct Ct
28230 65 20 2a 73 65 61 72 63 68 57 69 74 68 28 0a 20  e *searchWith(. 
28240 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20   With *pWith,   
28250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28260 20 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 6e 65   /* Current inne
28270 72 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73  rmost WITH claus
28280 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
28290 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
282a0 6d 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  m,     /* FROM c
282b0 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f  lause element to
282c0 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69   resolve */.  Wi
282d0 74 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20  th **ppContext  
282e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
282f0 20 4f 55 54 3a 20 57 49 54 48 20 63 6c 61 75 73   OUT: WITH claus
28300 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 62  e return value b
28310 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a  elongs to */.){.
28320 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
28330 61 6d 65 3b 0a 20 20 69 66 28 20 70 49 74 65 6d  ame;.  if( pItem
28340 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 26  ->zDatabase==0 &
28350 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d  & (zName = pItem
28360 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  ->zName)!=0 ){. 
28370 20 20 20 57 69 74 68 20 2a 70 3b 0a 20 20 20 20     With *p;.    
28380 66 6f 72 28 70 3d 70 57 69 74 68 3b 20 70 3b 20  for(p=pWith; p; 
28390 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20  p=p->pOuter){.  
283a0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
283b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
283c0 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Cte; i++){.     
283d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
283e0 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e  rICmp(zName, p->
283f0 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  a[i].zName)==0 )
28400 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70 43  {.          *ppC
28410 6f 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  ontext = p;.    
28420 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d        return &p-
28430 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d  >a[i];.        }
28440 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
28450 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
28460 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65  ../* The code ge
28470 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e  nerator maintain
28480 73 20 61 20 73 74 61 63 6b 20 6f 66 20 61 63 74  s a stack of act
28490 69 76 65 20 57 49 54 48 20 63 6c 61 75 73 65 73  ive WITH clauses
284a0 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 6e  .** with the inn
284b0 65 72 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c 61  er-most WITH cla
284c0 75 73 65 20 62 65 69 6e 67 20 61 74 20 74 68 65  use being at the
284d0 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
284e0 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
284f0 75 74 69 6e 65 20 70 75 73 68 65 73 20 74 68 65  utine pushes the
28500 20 57 49 54 48 20 63 6c 61 75 73 65 20 70 61 73   WITH clause pas
28510 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
28520 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e  d argument.** on
28530 74 6f 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  to the top of th
28540 65 20 73 74 61 63 6b 2e 20 49 66 20 61 72 67 75  e stack. If argu
28550 6d 65 6e 74 20 62 46 72 65 65 20 69 73 20 74 72  ment bFree is tr
28560 75 65 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a  ue, then this.**
28570 20 57 49 54 48 20 63 6c 61 75 73 65 20 77 69 6c   WITH clause wil
28580 6c 20 6e 65 76 65 72 20 62 65 20 70 6f 70 70 65  l never be poppe
28590 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  d from the stack
285a0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
285b0 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 66  t.** should be f
285c0 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  reed along with 
285d0 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
285e0 2e 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73  . In other cases
285f0 2c 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d  , when.** bFree=
28600 3d 30 2c 20 74 68 65 20 57 69 74 68 20 6f 62 6a  =0, the With obj
28610 65 63 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65  ect will be free
28620 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
28630 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74   SELECT .** stat
28640 65 6d 65 6e 74 20 77 69 74 68 20 77 68 69 63 68  ement with which
28650 20 69 74 20 69 73 20 61 73 73 6f 63 69 61 74 65   it is associate
28660 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
28670 65 33 57 69 74 68 50 75 73 68 28 50 61 72 73 65  e3WithPush(Parse
28680 20 2a 70 50 61 72 73 65 2c 20 57 69 74 68 20 2a   *pParse, With *
28690 70 57 69 74 68 2c 20 75 38 20 62 46 72 65 65 29  pWith, u8 bFree)
286a0 7b 0a 20 20 61 73 73 65 72 74 28 20 62 46 72 65  {.  assert( bFre
286b0 65 3d 3d 30 20 7c 7c 20 28 70 50 61 72 73 65 2d  e==0 || (pParse-
286c0 3e 70 57 69 74 68 3d 3d 30 20 26 26 20 70 50 61  >pWith==0 && pPa
286d0 72 73 65 2d 3e 70 57 69 74 68 54 6f 46 72 65 65  rse->pWithToFree
286e0 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70 57  ==0) );.  if( pW
286f0 69 74 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ith ){.    asser
28700 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68  t( pParse->pWith
28710 21 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20 70  !=pWith );.    p
28720 57 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70  With->pOuter = p
28730 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20  Parse->pWith;.  
28740 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
28750 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28  = pWith;.    if(
28760 20 62 46 72 65 65 20 29 20 70 50 61 72 73 65 2d   bFree ) pParse-
28770 3e 70 57 69 74 68 54 6f 46 72 65 65 20 3d 20 70  >pWithToFree = p
28780 57 69 74 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  With;.  }.}../*.
28790 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
287a0 20 63 68 65 63 6b 73 20 69 66 20 61 72 67 75 6d   checks if argum
287b0 65 6e 74 20 70 46 72 6f 6d 20 72 65 66 65 72 73  ent pFrom refers
287c0 20 74 6f 20 61 20 43 54 45 20 64 65 63 6c 61 72   to a CTE declar
287d0 65 64 20 62 79 20 0a 2a 2a 20 61 20 57 49 54 48  ed by .** a WITH
287e0 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 73   clause on the s
287f0 74 61 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 6d  tack currently m
28800 61 69 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65  aintained by the
28810 20 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a   parser. And,.**
28820 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 70 72   if currently pr
28830 6f 63 65 73 73 69 6e 67 20 61 20 43 54 45 20 65  ocessing a CTE e
28840 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 20 69 74  xpression, if it
28850 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65 0a   is a recursive.
28860 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ** reference to 
28870 74 68 65 20 63 75 72 72 65 6e 74 20 43 54 45 2e  the current CTE.
28880 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20  .**.** If pFrom 
28890 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68 65  falls into eithe
288a0 72 20 6f 66 20 74 68 65 20 74 77 6f 20 63 61 74  r of the two cat
288b0 65 67 6f 72 69 65 73 20 61 62 6f 76 65 2c 20 70  egories above, p
288c0 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e  From->pTab.** an
288d0 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61  d other fields a
288e0 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61 63 63  re populated acc
288f0 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65 20 63 61  ordingly. The ca
28900 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 68 65 63  ller should chec
28910 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54 61  k.** (pFrom->pTa
28920 62 21 3d 30 29 20 74 6f 20 64 65 74 65 72 6d 69  b!=0) to determi
28930 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
28940 74 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 6d  t a successful m
28950 61 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75 6e  atch.** was foun
28960 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  d..**.** Whether
28970 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63 68 20   or not a match 
28980 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54 45  is found, SQLITE
28990 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
289a0 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f  if no error.** o
289b0 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72  ccurs. If an err
289c0 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 61  or does occur, a
289d0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
289e0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
289f0 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e 64 20 73  .** parser and s
28a00 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  ome error code o
28a10 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
28a20 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
28a30 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 74 68  .static int with
28a40 45 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65 72  Expand(.  Walker
28a50 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73 74   *pWalker, .  st
28a60 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
28a70 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50 61  m *pFrom.){.  Pa
28a80 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
28a90 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
28aa0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
28ab0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74 72  Parse->db;.  str
28ac0 75 63 74 20 43 74 65 20 2a 70 43 74 65 3b 20 20  uct Cte *pCte;  
28ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28ae0 4d 61 74 63 68 65 64 20 43 54 45 20 28 6f 72 20  Matched CTE (or 
28af0 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63 68  NULL if no match
28b00 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69  ) */.  With *pWi
28b10 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
28b20 20 20 20 20 20 20 20 2f 2a 20 57 49 54 48 20 63         /* WITH c
28b30 6c 61 75 73 65 20 74 68 61 74 20 70 43 74 65 20  lause that pCte 
28b40 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20  belongs to */.. 
28b50 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
28b60 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70 43  pTab==0 );..  pC
28b70 74 65 20 3d 20 73 65 61 72 63 68 57 69 74 68 28  te = searchWith(
28b80 70 50 61 72 73 65 2d 3e 70 57 69 74 68 2c 20 70  pParse->pWith, p
28b90 46 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a 20  From, &pWith);. 
28ba0 20 69 66 28 20 70 43 74 65 20 29 7b 0a 20 20 20   if( pCte ){.   
28bb0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
28bc0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
28bd0 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  st;.    Select *
28be0 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63 74  pSel;.    Select
28bf0 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20   *pLeft;        
28c00 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d          /* Left-
28c10 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74  most SELECT stat
28c20 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ement */.    int
28c30 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 3b 20   bMayRecursive; 
28c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
28c50 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20 6a  ue if compound j
28c60 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20 5b  oined by UNION [
28c70 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74 68  ALL] */.    With
28c80 20 2a 70 53 61 76 65 64 57 69 74 68 3b 20 20 20   *pSavedWith;   
28c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
28ca0 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 50  tial value of pP
28cb0 61 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a  arse->pWith */..
28cc0 20 20 20 20 2f 2a 20 49 66 20 70 43 74 65 2d 3e      /* If pCte->
28cd0 7a 43 74 65 45 72 72 20 69 73 20 6e 6f 6e 2d 4e  zCteErr is non-N
28ce0 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ULL at this poin
28cf0 74 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  t, then this is 
28d00 61 6e 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a  an illegal.    *
28d10 2a 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65  * recursive refe
28d20 72 65 6e 63 65 20 74 6f 20 43 54 45 20 70 43 74  rence to CTE pCt
28d30 65 2e 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f  e. Leave an erro
28d40 72 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  r in pParse and 
28d50 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61  return.    ** ea
28d60 72 6c 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a 43  rly. If pCte->zC
28d70 74 65 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20 74  teErr is NULL, t
28d80 68 65 6e 20 74 68 69 73 20 69 73 20 6e 6f 74 20  hen this is not 
28d90 61 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65  a recursive refe
28da0 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49 6e  rence..    ** In
28db0 20 74 68 69 73 20 63 61 73 65 2c 20 70 72 6f 63   this case, proc
28dc0 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  eed.  */.    if(
28dd0 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 29   pCte->zCteErr )
28de0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
28df0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
28e00 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 2c 20 70  pCte->zCteErr, p
28e10 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Cte->zName);.   
28e20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28e30 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
28e40 20 20 69 66 28 20 63 61 6e 6e 6f 74 42 65 46 75    if( cannotBeFu
28e50 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  nction(pParse, p
28e60 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 53  From) ) return S
28e70 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20  QLITE_ERROR;..  
28e80 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
28e90 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  >pTab==0 );.    
28ea0 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
28eb0 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ab = sqlite3DbMa
28ec0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
28ed0 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20  eof(Table));.   
28ee0 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
28ef0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
28f00 0a 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52  .    pTab->nTabR
28f10 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 54 61 62  ef = 1;.    pTab
28f20 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
28f30 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 43  3DbStrDup(db, pC
28f40 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  te->zName);.    
28f50 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
28f60 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77  ;.    pTab->nRow
28f70 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73  LogEst = 200; as
28f80 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74  sert( 200==sqlit
28f90 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36  e3LogEst(1048576
28fa0 29 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74  ) );.    pTab->t
28fb0 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70  abFlags |= TF_Ep
28fc0 68 65 6d 65 72 61 6c 20 7c 20 54 46 5f 4e 6f 56  hemeral | TF_NoV
28fd0 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20  isibleRowid;.   
28fe0 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20   pFrom->pSelect 
28ff0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
29000 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65  up(db, pCte->pSe
29010 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  lect, 0);.    if
29020 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
29030 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ed ) return SQLI
29040 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
29050 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
29060 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20  ->pSelect );..  
29070 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
29080 69 73 20 69 73 20 61 20 72 65 63 75 72 73 69 76  is is a recursiv
29090 65 20 43 54 45 2e 20 2a 2f 0a 20 20 20 20 70 53  e CTE. */.    pS
290a0 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  el = pFrom->pSel
290b0 65 63 74 3b 0a 20 20 20 20 62 4d 61 79 52 65 63  ect;.    bMayRec
290c0 75 72 73 69 76 65 20 3d 20 28 20 70 53 65 6c 2d  ursive = ( pSel-
290d0 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70  >op==TK_ALL || p
290e0 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  Sel->op==TK_UNIO
290f0 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61  N );.    if( bMa
29100 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  yRecursive ){.  
29110 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
29120 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d   SrcList *pSrc =
29130 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d   pFrom->pSelect-
29140 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72  >pSrc;.      for
29150 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53  (i=0; i<pSrc->nS
29160 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
29170 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
29180 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
29190 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pSrc->a[i];.    
291a0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
291b0 44 61 74 61 62 61 73 65 3d 3d 30 20 0a 20 20 20  Database==0 .   
291c0 20 20 20 20 20 20 26 26 20 70 49 74 65 6d 2d 3e        && pItem->
291d0 7a 4e 61 6d 65 21 3d 30 20 0a 20 20 20 20 20 20  zName!=0 .      
291e0 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33     && 0==sqlite3
291f0 53 74 72 49 43 6d 70 28 70 49 74 65 6d 2d 3e 7a  StrICmp(pItem->z
29200 4e 61 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d  Name, pCte->zNam
29210 65 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  e).          ){.
29220 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
29230 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20  >pTab = pTab;.  
29240 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66          pItem->f
29250 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 3d 20  g.isRecursive = 
29260 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  1;.          pTa
29270 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20  b->nTabRef++;.  
29280 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e 73 65          pSel->se
29290 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65 63  lFlags |= SF_Rec
292a0 75 72 73 69 76 65 3b 0a 20 20 20 20 20 20 20 20  ursive;.        
292b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
292c0 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65  .    /* Only one
292d0 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72   recursive refer
292e0 65 6e 63 65 20 69 73 20 70 65 72 6d 69 74 74 65  ence is permitte
292f0 64 2e 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 70  d. */ .    if( p
29300 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e 32 20 29  Tab->nTabRef>2 )
29310 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
29320 72 72 6f 72 4d 73 67 28 0a 20 20 20 20 20 20 20  rrorMsg(.       
29330 20 20 20 70 50 61 72 73 65 2c 20 22 6d 75 6c 74     pParse, "mult
29340 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20  iple references 
29350 74 6f 20 72 65 63 75 72 73 69 76 65 20 74 61 62  to recursive tab
29360 6c 65 3a 20 25 73 22 2c 20 70 43 74 65 2d 3e 7a  le: %s", pCte->z
29370 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  Name.      );.  
29380 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29390 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
293a0 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d     assert( pTab-
293b0 3e 6e 54 61 62 52 65 66 3d 3d 31 20 7c 7c 20 0a  >nTabRef==1 || .
293c0 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70 53              ((pS
293d0 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f  el->selFlags&SF_
293e0 52 65 63 75 72 73 69 76 65 29 20 26 26 20 70 54  Recursive) && pT
293f0 61 62 2d 3e 6e 54 61 62 52 65 66 3d 3d 32 20 29  ab->nTabRef==2 )
29400 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43  );..    pCte->zC
29410 74 65 45 72 72 20 3d 20 22 63 69 72 63 75 6c 61  teErr = "circula
29420 72 20 72 65 66 65 72 65 6e 63 65 3a 20 25 73 22  r reference: %s"
29430 3b 0a 20 20 20 20 70 53 61 76 65 64 57 69 74 68  ;.    pSavedWith
29440 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68   = pParse->pWith
29450 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57  ;.    pParse->pW
29460 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20  ith = pWith;.   
29470 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69   if( bMayRecursi
29480 76 65 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65  ve ){.      Sele
29490 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 53 65  ct *pPrior = pSe
294a0 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  l->pPrior;.     
294b0 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
294c0 3e 70 57 69 74 68 3d 3d 30 20 29 3b 0a 20 20 20  >pWith==0 );.   
294d0 20 20 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68     pPrior->pWith
294e0 20 3d 20 70 53 65 6c 2d 3e 70 57 69 74 68 3b 0a   = pSel->pWith;.
294f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
29500 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
29510 20 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 20 20   pPrior);.      
29520 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d 20  pPrior->pWith = 
29530 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
29540 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
29550 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
29560 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sel);.    }.    
29570 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
29580 70 57 69 74 68 3b 0a 0a 20 20 20 20 66 6f 72 28  pWith;..    for(
29590 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65 66  pLeft=pSel; pLef
295a0 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66 74  t->pPrior; pLeft
295b0 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29 3b  =pLeft->pPrior);
295c0 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 4c  .    pEList = pL
295d0 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  eft->pEList;.   
295e0 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c 73   if( pCte->pCols
295f0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45   ){.      if( pE
29600 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
29610 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e 70 43 6f  nExpr!=pCte->pCo
29620 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  ls->nExpr ){.   
29630 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
29640 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
29650 62 6c 65 20 25 73 20 68 61 73 20 25 64 20 76 61  ble %s has %d va
29660 6c 75 65 73 20 66 6f 72 20 25 64 20 63 6f 6c 75  lues for %d colu
29670 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  mns",.          
29680 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70    pCte->zName, p
29690 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 43  EList->nExpr, pC
296a0 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72  te->pCols->nExpr
296b0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
296c0 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
296d0 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a  h = pSavedWith;.
296e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
296f0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
29700 20 20 20 7d 0a 20 20 20 20 20 20 70 45 4c 69 73     }.      pELis
29710 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73 3b  t = pCte->pCols;
29720 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69  .    }..    sqli
29730 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
29740 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
29750 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43  EList, &pTab->nC
29760 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29  ol, &pTab->aCol)
29770 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65  ;.    if( bMayRe
29780 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
29790 20 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c 46 6c   if( pSel->selFl
297a0 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
297b0 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ve ){.        pC
297c0 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 6d  te->zCteErr = "m
297d0 75 6c 74 69 70 6c 65 20 72 65 63 75 72 73 69 76  ultiple recursiv
297e0 65 20 72 65 66 65 72 65 6e 63 65 73 3a 20 25 73  e references: %s
297f0 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
29800 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 43          pCte->zC
29810 74 65 45 72 72 20 3d 20 22 72 65 63 75 72 73 69  teErr = "recursi
29820 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 6e 20  ve reference in 
29830 61 20 73 75 62 71 75 65 72 79 3a 20 25 73 22 3b  a subquery: %s";
29840 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
29850 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
29860 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b  (pWalker, pSel);
29870 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 74 65 2d  .    }.    pCte-
29880 3e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a 20 20  >zCteErr = 0;.  
29890 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
298a0 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20  = pSavedWith;.  
298b0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
298c0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
298d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
298e0 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49  OMIT_CTE./*.** I
298f0 66 20 74 68 65 20 53 45 4c 45 43 54 20 70 61 73  f the SELECT pas
29900 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
29910 64 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61  d argument has a
29920 6e 20 61 73 73 6f 63 69 61 74 65 64 20 57 49 54  n associated WIT
29930 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 70 6f  H .** clause, po
29940 70 20 69 74 20 66 72 6f 6d 20 74 68 65 20 73 74  p it from the st
29950 61 63 6b 20 73 74 6f 72 65 64 20 61 73 20 70 61  ack stored as pa
29960 72 74 20 6f 66 20 74 68 65 20 50 61 72 73 65 20  rt of the Parse 
29970 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
29980 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
29990 73 65 64 20 61 73 20 74 68 65 20 78 53 65 6c 65  sed as the xSele
299a0 63 74 43 61 6c 6c 62 61 63 6b 32 28 29 20 63 61  ctCallback2() ca
299b0 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73 71 6c  llback by.** sql
299c0 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
299d0 28 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e 67 20  () when walking 
299e0 61 20 53 45 4c 45 43 54 20 74 72 65 65 20 74 6f  a SELECT tree to
299f0 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65 0a 2a   resolve table.*
29a00 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74 68 65  * names and othe
29a10 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c  r FROM clause el
29a20 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61 74  ements. .*/.stat
29a30 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 50 6f  ic void selectPo
29a40 70 57 69 74 68 28 57 61 6c 6b 65 72 20 2a 70 57  pWith(Walker *pW
29a50 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
29a60 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
29a70 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
29a80 61 72 73 65 3b 0a 20 20 69 66 28 20 4f 4b 5f 49  arse;.  if( OK_I
29a90 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70 50  F_ALWAYS_TRUE(pP
29aa0 61 72 73 65 2d 3e 70 57 69 74 68 29 20 26 26 20  arse->pWith) && 
29ab0 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a  p->pPrior==0 ){.
29ac0 20 20 20 20 57 69 74 68 20 2a 70 57 69 74 68 20      With *pWith 
29ad0 3d 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28  = findRightmost(
29ae0 70 29 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 69  p)->pWith;.    i
29af0 66 28 20 70 57 69 74 68 21 3d 30 20 29 7b 0a 20  f( pWith!=0 ){. 
29b00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
29b10 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57 69 74  rse->pWith==pWit
29b20 68 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  h );.      pPars
29b30 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
29b40 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20 7d 0a  ->pOuter;.    }.
29b50 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66    }.}.#else.#def
29b60 69 6e 65 20 73 65 6c 65 63 74 50 6f 70 57 69 74  ine selectPopWit
29b70 68 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  h 0.#endif../*.*
29b80 2a 20 54 68 65 20 53 72 63 4c 69 73 74 5f 69 74  * The SrcList_it
29b90 65 6d 20 73 74 72 75 63 74 75 72 65 20 70 61 73  em structure pas
29ba0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
29bb0 64 20 61 72 67 75 6d 65 6e 74 20 72 65 70 72 65  d argument repre
29bc0 73 65 6e 74 73 20 61 0a 2a 2a 20 73 75 62 2d 71  sents a.** sub-q
29bd0 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d  uery in the FROM
29be0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
29bf0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  ECT statement. T
29c00 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
29c10 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 70 6f  allocates and po
29c20 70 75 6c 61 74 65 73 20 74 68 65 20 53 72 63 4c  pulates the SrcL
29c30 69 73 74 5f 69 74 65 6d 2e 70 54 61 62 20 6f 62  ist_item.pTab ob
29c40 6a 65 63 74 2e 20 49 66 20 73 75 63 63 65 73 73  ject. If success
29c50 66 75 6c 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ful,.** SQLITE_O
29c60 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
29c70 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20  therwise, if an 
29c80 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63  OOM error is enc
29c90 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 53 51 4c  ountered,.** SQL
29ca0 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 69 6e  ITE_NOMEM..*/.in
29cb0 74 20 73 71 6c 69 74 65 33 45 78 70 61 6e 64 53  t sqlite3ExpandS
29cc0 75 62 71 75 65 72 79 28 50 61 72 73 65 20 2a 70  ubquery(Parse *p
29cd0 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72  Parse, struct Sr
29ce0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
29cf0 6d 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53  m){.  Select *pS
29d00 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  el = pFrom->pSel
29d10 65 63 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ect;.  Table *pT
29d20 61 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ab;..  assert( p
29d30 53 65 6c 20 29 3b 0a 20 20 70 46 72 6f 6d 2d 3e  Sel );.  pFrom->
29d40 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71  pTab = pTab = sq
29d50 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
29d60 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  o(pParse->db, si
29d70 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20  zeof(Table));.  
29d80 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
29d90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
29da0 4d 3b 0a 20 20 70 54 61 62 2d 3e 6e 54 61 62 52  M;.  pTab->nTabR
29db0 65 66 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 46  ef = 1;.  if( pF
29dc0 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20  rom->zAlias ){. 
29dd0 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d     pTab->zName =
29de0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
29df0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 46 72  (pParse->db, pFr
29e00 6f 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 7d  om->zAlias);.  }
29e10 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 62 2d 3e  else{.    pTab->
29e20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
29e30 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
29e40 62 2c 20 22 73 75 62 71 75 65 72 79 5f 25 75 22  b, "subquery_%u"
29e50 2c 20 70 53 65 6c 2d 3e 73 65 6c 49 64 29 3b 0a  , pSel->selId);.
29e60 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 53 65    }.  while( pSe
29e70 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65  l->pPrior ){ pSe
29e80 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
29e90 3b 20 7d 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c  ; }.  sqlite3Col
29ea0 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
29eb0 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70  (pParse, pSel->p
29ec0 45 4c 69 73 74 2c 26 70 54 61 62 2d 3e 6e 43 6f  EList,&pTab->nCo
29ed0 6c 2c 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  l,&pTab->aCol);.
29ee0 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
29ef0 2d 31 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77  -1;.  pTab->nRow
29f00 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73  LogEst = 200; as
29f10 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74  sert( 200==sqlit
29f20 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36  e3LogEst(1048576
29f30 29 20 29 3b 0a 20 20 70 54 61 62 2d 3e 74 61 62  ) );.  pTab->tab
29f40 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65  Flags |= TF_Ephe
29f50 6d 65 72 61 6c 3b 0a 0a 20 20 72 65 74 75 72 6e  meral;..  return
29f60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
29f70 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
29f80 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61  e is a Walker ca
29f90 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61  llback for "expa
29fa0 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20  nding" a SELECT 
29fb0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45  statement..** "E
29fc0 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20  xpanding" means 
29fd0 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  to do the follow
29fe0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  ing:.**.**    (1
29ff0 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42  )  Make sure VDB
2a000 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
2a010 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67   have been assig
2a020 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20  ned to every.** 
2a030 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20          element 
2a040 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
2a050 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  se..**.**    (2)
2a060 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54    Fill in the pT
2a070 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62  abList->a[].pTab
2a080 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53   fields in the S
2a090 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20  rcList that .** 
2a0a0 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20          defines 
2a0b0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68  FROM clause.  Wh
2a0c0 65 6e 20 76 69 65 77 73 20 61 70 70 65 61 72 20  en views appear 
2a0d0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2a0e0 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  se,.**         f
2a0f0 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ill pTabList->a[
2a100 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20 61  ].pSelect with a
2a110 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   copy of the SEL
2a120 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  ECT statement.**
2a130 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69 6d           that im
2a140 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65  plements the vie
2a150 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61  w.  A copy is ma
2a160 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27 73  de of the view's
2a170 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20   SELECT.**      
2a180 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20     statement so 
2a190 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65 65  that we can free
2a1a0 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c  ly modify or del
2a1b0 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ete that stateme
2a1c0 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69  nt.**         wi
2a1d0 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61  thout worrying a
2a1e0 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20  bout messing up 
2a1f0 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 72  the persistent r
2a200 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a  epresentation.**
2a210 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
2a220 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  view..**.**    (
2a230 33 29 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f  3)  Add terms to
2a240 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2a250 65 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65  e to accommodate
2a260 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
2a270 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  word.**         
2a280 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65  on joins and the
2a290 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
2a2a0 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a  ause of joins..*
2a2b0 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61  *.**    (4)  Sca
2a2c0 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f  n the list of co
2a2d0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
2a2e0 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74 29  ult set (pEList)
2a2f0 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   looking.**     
2a300 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65      for instance
2a310 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65  s of the "*" ope
2a320 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42  rator or the TAB
2a330 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  LE.* operator..*
2a340 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f 75  *         If fou
2a350 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20  nd, expand each 
2a360 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79 20  "*" to be every 
2a370 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20  column in every 
2a380 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20  table.**        
2a390 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20   and TABLE.* to 
2a3a0 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
2a3b0 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a  in TABLE..**.*/.
2a3c0 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
2a3d0 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b 65 72  tExpander(Walker
2a3e0 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
2a3f0 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a  t *p){.  Parse *
2a400 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
2a410 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20  ->pParse;.  int 
2a420 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69  i, j, k;.  SrcLi
2a430 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20  st *pTabList;.  
2a440 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
2a450 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
2a460 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a  st_item *pFrom;.
2a470 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
2a480 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78  pParse->db;.  Ex
2a490 70 72 20 2a 70 45 2c 20 2a 70 52 69 67 68 74 2c  pr *pE, *pRight,
2a4a0 20 2a 70 45 78 70 72 3b 0a 20 20 75 31 36 20 73   *pExpr;.  u16 s
2a4b0 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c  elFlags = p->sel
2a4c0 46 6c 61 67 73 3b 0a 20 20 75 33 32 20 65 6c 69  Flags;.  u32 eli
2a4d0 73 74 46 6c 61 67 73 20 3d 20 30 3b 0a 0a 20 20  stFlags = 0;..  
2a4e0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
2a4f0 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 69 66  F_Expanded;.  if
2a500 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
2a510 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ed  ){.    retur
2a520 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
2a530 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53  .  assert( p->pS
2a540 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28  rc!=0 );.  if( (
2a550 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78  selFlags & SF_Ex
2a560 70 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20  panded)!=0 ){.  
2a570 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
2a580 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69  ne;.  }.  pTabLi
2a590 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
2a5a0 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
2a5b0 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 57 69 74  st;.  sqlite3Wit
2a5c0 68 50 75 73 68 28 70 50 61 72 73 65 2c 20 70 2d  hPush(pParse, p-
2a5d0 3e 70 57 69 74 68 2c 20 30 29 3b 0a 0a 20 20 2f  >pWith, 0);..  /
2a5e0 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73  * Make sure curs
2a5f0 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20  or numbers have 
2a600 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f  been assigned to
2a610 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a   all entries in.
2a620 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
2a630 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45  ause of the SELE
2a640 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  CT statement..  
2a650 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  */.  sqlite3SrcL
2a660 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
2a670 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
2a680 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75  t);..  /* Look u
2a690 70 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61  p every table na
2a6a0 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  med in the FROM 
2a6b0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 65  clause of the se
2a6c0 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61  lect.  If.  ** a
2a6d0 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46  n entry of the F
2a6e0 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20  ROM clause is a 
2a6f0 73 75 62 71 75 65 72 79 20 69 6e 73 74 65 61 64  subquery instead
2a700 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76   of a table or v
2a710 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63  iew,.  ** then c
2a720 72 65 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e  reate a transien
2a730 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  t table structur
2a740 65 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68  e to describe th
2a750 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f  e subquery..  */
2a760 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f  .  for(i=0, pFro
2a770 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
2a780 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
2a790 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a   i++, pFrom++){.
2a7a0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
2a7b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
2a7c0 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69  om->fg.isRecursi
2a7d0 76 65 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e  ve==0 || pFrom->
2a7e0 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69  pTab!=0 );.    i
2a7f0 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52  f( pFrom->fg.isR
2a800 65 63 75 72 73 69 76 65 20 29 20 63 6f 6e 74 69  ecursive ) conti
2a810 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
2a820 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
2a830 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2a840 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 69  E_OMIT_CTE.    i
2a850 66 28 20 77 69 74 68 45 78 70 61 6e 64 28 70 57  f( withExpand(pW
2a860 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29 20 29 20  alker, pFrom) ) 
2a870 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
2a880 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  ;.    if( pFrom-
2a890 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c 73 65 0a  >pTab ) {} else.
2a8a0 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70  #endif.    if( p
2a8b0 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29  From->zName==0 )
2a8c0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
2a8d0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
2a8e0 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
2a8f0 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  l = pFrom->pSele
2a900 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73  ct;.      /* A s
2a910 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20  ub-query in the 
2a920 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
2a930 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20   SELECT */.     
2a940 20 61 73 73 65 72 74 28 20 70 53 65 6c 21 3d 30   assert( pSel!=0
2a950 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2a960 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
2a970 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   );.      if( sq
2a980 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
2a990 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 20 29  pWalker, pSel) )
2a9a0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
2a9b0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  t;.      if( sql
2a9c0 69 74 65 33 45 78 70 61 6e 64 53 75 62 71 75 65  ite3ExpandSubque
2a9d0 72 79 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d  ry(pParse, pFrom
2a9e0 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
2a9f0 62 6f 72 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20  bort;.#endif.   
2aa00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
2aa10 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62   An ordinary tab
2aa20 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20  le or view name 
2aa30 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2aa40 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  se */.      asse
2aa50 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
2aa60 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f  =0 );.      pFro
2aa70 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
2aa80 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
2aa90 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20  bleItem(pParse, 
2aaa0 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20  0, pFrom);.     
2aab0 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
2aac0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
2aad0 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d  .      if( pTab-
2aae0 3e 6e 54 61 62 52 65 66 3e 3d 30 78 66 66 66 66  >nTabRef>=0xffff
2aaf0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2ab00 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2ab10 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65  se, "too many re
2ab20 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25 73  ferences to \"%s
2ab30 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c 0a  \": max 65535",.
2ab40 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
2ab50 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
2ab60 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30   pFrom->pTab = 0
2ab70 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2ab80 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
2ab90 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e    }.      pTab->
2aba0 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20  nTabRef++;.     
2abb0 20 69 66 28 20 21 49 73 56 69 72 74 75 61 6c 28   if( !IsVirtual(
2abc0 70 54 61 62 29 20 26 26 20 63 61 6e 6e 6f 74 42  pTab) && cannotB
2abd0 65 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  eFunction(pParse
2abe0 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20  , pFrom) ){.    
2abf0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
2ac00 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 23 69  bort;.      }.#i
2ac10 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
2ac20 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
2ac30 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45  !defined (SQLITE
2ac40 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2ac50 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 49 73  LE).      if( Is
2ac60 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 7c 7c  Virtual(pTab) ||
2ac70 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
2ac80 7b 0a 20 20 20 20 20 20 20 20 69 31 36 20 6e 43  {.        i16 nC
2ac90 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ol;.        if( 
2aca0 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
2acb0 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
2acc0 2c 20 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  , pTab) ) return
2acd0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
2ace0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
2acf0 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b  m->pSelect==0 );
2ad00 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  .        pFrom->
2ad10 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
2ad20 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
2ad30 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29  Tab->pSelect, 0)
2ad40 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d  ;.        nCol =
2ad50 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20   pTab->nCol;.   
2ad60 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20       pTab->nCol 
2ad70 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 73 71  = -1;.        sq
2ad80 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
2ad90 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e  pWalker, pFrom->
2ada0 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
2adb0 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e    pTab->nCol = n
2adc0 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  Col;.      }.#en
2add0 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  dif.    }..    /
2ade0 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64  * Locate the ind
2adf0 65 78 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20  ex named by the 
2ae00 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
2ae10 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20  e, if any. */.  
2ae20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64    if( sqlite3Ind
2ae30 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61  exedByLookup(pPa
2ae40 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20  rse, pFrom) ){. 
2ae50 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
2ae60 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  Abort;.    }.  }
2ae70 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e  ..  /* Process N
2ae80 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c  ATURAL keywords,
2ae90 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e   and ON and USIN
2aea0 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69  G clauses of joi
2aeb0 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ns..  */.  if( d
2aec0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2aed0 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  || sqliteProcess
2aee0 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20  Join(pParse, p) 
2aef0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
2af00 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20  C_Abort;.  }..  
2af10 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22  /* For every "*"
2af20 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
2af30 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c  the column list,
2af40 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65   insert the name
2af50 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f  s of.  ** all co
2af60 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62  lumns in all tab
2af70 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76  les.  And for ev
2af80 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65  ery TABLE.* inse
2af90 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a  rt the names.  *
2afa0 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  * of all columns
2afb0 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20   in TABLE.  The 
2afc0 70 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20  parser inserted 
2afd0 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73  a special expres
2afe0 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74  sion.  ** with t
2aff0 68 65 20 54 4b 5f 41 53 54 45 52 49 53 4b 20 6f  he TK_ASTERISK o
2b000 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68  perator for each
2b010 20 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75   "*" that it fou
2b020 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  nd in the column
2b030 0a 20 20 2a 2a 20 6c 69 73 74 2e 20 20 54 68 65  .  ** list.  The
2b040 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
2b050 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61  just has to loca
2b060 74 65 20 74 68 65 20 54 4b 5f 41 53 54 45 52 49  te the TK_ASTERI
2b070 53 4b 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69  SK.  ** expressi
2b080 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 20 65  ons and expand e
2b090 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c  ach one to the l
2b0a0 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d  ist of all colum
2b0b0 6e 73 20 69 6e 0a 20 20 2a 2a 20 61 6c 6c 20 74  ns in.  ** all t
2b0c0 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ables..  **.  **
2b0d0 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20   The first loop 
2b0e0 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73  just checks to s
2b0f0 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ee if there are 
2b100 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72  any "*" operator
2b110 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64  s.  ** that need
2b120 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f   expanding..  */
2b130 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45  .  for(k=0; k<pE
2b140 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
2b150 29 7b 0a 20 20 20 20 70 45 20 3d 20 70 45 4c 69  ){.    pE = pELi
2b160 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  st->a[k].pExpr;.
2b170 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
2b180 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72  TK_ASTERISK ) br
2b190 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  eak;.    assert(
2b1a0 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20   pE->op!=TK_DOT 
2b1b0 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30  || pE->pRight!=0
2b1c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2b1d0 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
2b1e0 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20  | (pE->pLeft!=0 
2b1f0 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70  && pE->pLeft->op
2b200 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20  ==TK_ID) );.    
2b210 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
2b220 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74  OT && pE->pRight
2b230 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53  ->op==TK_ASTERIS
2b240 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 65  K ) break;.    e
2b250 6c 69 73 74 46 6c 61 67 73 20 7c 3d 20 70 45 2d  listFlags |= pE-
2b260 3e 66 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 69 66  >flags;.  }.  if
2b270 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ( k<pEList->nExp
2b280 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  r ){.    /*.    
2b290 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65 72  ** If we get her
2b2a0 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72  e it means the r
2b2b0 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69  esult set contai
2b2c0 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22  ns one or more "
2b2d0 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  *".    ** operat
2b2e0 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ors that need to
2b2f0 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c   be expanded.  L
2b300 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68  oop through each
2b310 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
2b320 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
2b330 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20   set and expand 
2b340 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  them one by one.
2b350 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75  .    */.    stru
2b360 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
2b370 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b   *a = pEList->a;
2b380 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
2b390 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  New = 0;.    int
2b3a0 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d   flags = pParse-
2b3b0 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20  >db->flags;.    
2b3c0 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20  int longNames = 
2b3d0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
2b3e0 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  FullColNames)!=0
2b3f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b400 20 20 20 20 20 20 20 26 26 20 28 66 6c 61 67 73         && (flags
2b410 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43   & SQLITE_ShortC
2b420 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20  olNames)==0;..  
2b430 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
2b440 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
2b450 7b 0a 20 20 20 20 20 20 70 45 20 3d 20 61 5b 6b  {.      pE = a[k
2b460 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 65  ].pExpr;.      e
2b470 6c 69 73 74 46 6c 61 67 73 20 7c 3d 20 70 45 2d  listFlags |= pE-
2b480 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 70 52  >flags;.      pR
2b490 69 67 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68  ight = pE->pRigh
2b4a0 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
2b4b0 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20   pE->op!=TK_DOT 
2b4c0 7c 7c 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a  || pRight!=0 );.
2b4d0 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
2b4e0 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20  !=TK_ASTERISK.  
2b4f0 20 20 20 20 20 26 26 20 28 70 45 2d 3e 6f 70 21       && (pE->op!
2b500 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68  =TK_DOT || pRigh
2b510 74 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49  t->op!=TK_ASTERI
2b520 53 4b 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  SK).      ){.   
2b530 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72       /* This par
2b540 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69  ticular expressi
2b550 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  on does not need
2b560 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e   to be expanded.
2b570 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2b580 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
2b590 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
2b5a0 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61  (pParse, pNew, a
2b5b0 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [k].pExpr);.    
2b5c0 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
2b5d0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
2b5e0 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
2b5f0 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e  .zName = a[k].zN
2b600 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ame;.          p
2b610 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78  New->a[pNew->nEx
2b620 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b  pr-1].zSpan = a[
2b630 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20  k].zSpan;.      
2b640 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d      a[k].zName =
2b650 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b   0;.          a[
2b660 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20  k].zSpan = 0;.  
2b670 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b680 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a  a[k].pExpr = 0;.
2b690 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2b6a0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70       /* This exp
2b6b0 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22  ression is a "*"
2b6c0 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20   or a "TABLE.*" 
2b6d0 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  and needs to be.
2b6e0 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e          ** expan
2b6f0 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ded. */.        
2b700 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20  int tableSeen = 
2b710 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  0;      /* Set t
2b720 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d  o 1 when TABLE m
2b730 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20  atches */.      
2b740 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d    char *zTName =
2b750 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 74 65 78   0;       /* tex
2b760 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42  t of name of TAB
2b770 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  LE */.        if
2b780 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ( pE->op==TK_DOT
2b790 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
2b7a0 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21  sert( pE->pLeft!
2b7b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
2b7c0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2b7d0 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65  Property(pE->pLe
2b7e0 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  ft, EP_IntValue)
2b7f0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   );.          zT
2b800 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74  Name = pE->pLeft
2b810 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
2b820 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
2b830 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
2b840 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
2b850 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
2b860 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
2b870 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
2b880 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
2b890 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74            Select
2b8a0 20 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pSub = pFrom->
2b8b0 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20  pSelect;.       
2b8c0 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d     char *zTabNam
2b8d0 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61  e = pFrom->zAlia
2b8e0 73 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  s;.          con
2b8f0 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61  st char *zSchema
2b900 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
2b910 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
2b920 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
2b930 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
2b940 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d        zTabName =
2b950 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
2b960 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b970 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
2b980 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b  ocFailed ) break
2b990 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2b9a0 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62  pSub==0 || (pSub
2b9b0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2b9c0 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29  NestedFrom)==0 )
2b9d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  {.            pS
2b9e0 75 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ub = 0;.        
2b9f0 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26      if( zTName &
2ba00 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
2ba10 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d  (zTName, zTabNam
2ba20 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)!=0 ){.       
2ba30 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2ba40 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2ba50 20 20 20 20 20 20 20 20 20 20 20 69 44 62 20 3d             iDb =
2ba60 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
2ba70 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
2ba80 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
2ba90 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d        zSchemaNam
2baa0 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d  e = iDb>=0 ? db-
2bab0 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
2bac0 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20  me : "*";.      
2bad0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2bae0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
2baf0 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
2bb00 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
2bb10 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Name = pTab->aCo
2bb20 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  l[j].zName;.    
2bb30 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43          char *zC
2bb40 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20  olname;  /* The 
2bb50 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20  computed column 
2bb60 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
2bb70 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65      char *zToFre
2bb80 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64  e;   /* Malloced
2bb90 20 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65   string that nee
2bba0 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a  ds to be freed *
2bbb0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6f  /.            To
2bbc0 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f  ken sColname;  /
2bbd0 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d  * Computed colum
2bbe0 6e 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65  n name as a toke
2bbf0 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20  n */..          
2bc00 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20    assert( zName 
2bc10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2bc20 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75  f( zTName && pSu
2bc30 62 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  b.             &
2bc40 26 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70  & sqlite3MatchSp
2bc50 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c  anName(pSub->pEL
2bc60 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c  ist->a[j].zSpan,
2bc70 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d   0, zTName, 0)==
2bc80 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b  0.            ){
2bc90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
2bca0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2bcb0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
2bcc0 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75      /* If a colu
2bcd0 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  mn is marked as 
2bce0 27 68 69 64 64 65 6e 27 2c 20 6f 6d 69 74 20 69  'hidden', omit i
2bcf0 74 20 66 72 6f 6d 20 74 68 65 20 65 78 70 61 6e  t from the expan
2bd00 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ded.            
2bd10 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69  ** result-set li
2bd20 73 74 20 75 6e 6c 65 73 73 20 74 68 65 20 53 45  st unless the SE
2bd30 4c 45 43 54 20 68 61 73 20 74 68 65 20 53 46 5f  LECT has the SF_
2bd40 49 6e 63 6c 75 64 65 48 69 64 64 65 6e 0a 20 20  IncludeHidden.  
2bd50 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 69 74            ** bit
2bd60 20 73 65 74 2e 0a 20 20 20 20 20 20 20 20 20 20   set..          
2bd70 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
2bd80 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
2bd90 73 20 26 20 53 46 5f 49 6e 63 6c 75 64 65 48 69  s & SF_IncludeHi
2bda0 64 64 65 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20  dden)==0.       
2bdb0 20 20 20 20 20 20 26 26 20 49 73 48 69 64 64 65        && IsHidde
2bdc0 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61  nColumn(&pTab->a
2bdd0 43 6f 6c 5b 6a 5d 29 20 0a 20 20 20 20 20 20 20  Col[j]) .       
2bde0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2bdf0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
2be00 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2be10 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53            tableS
2be20 65 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20  een = 1;..      
2be30 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26        if( i>0 &&
2be40 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20   zTName==0 ){.  
2be50 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2be60 28 70 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  (pFrom->fg.joint
2be70 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
2be80 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
2be90 20 20 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64       && tableAnd
2bea0 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62  ColumnIndex(pTab
2beb0 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20  List, i, zName, 
2bec0 30 2c 20 30 29 0a 20 20 20 20 20 20 20 20 20 20  0, 0).          
2bed0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2bee0 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e         /* In a N
2bef0 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69  ATURAL join, omi
2bf00 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d  t the join colum
2bf10 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20  ns from the .   
2bf20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
2bf30 74 61 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67  table to the rig
2bf40 68 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a  ht of the join *
2bf50 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
2bf60 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2bf70 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2bf80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
2bf90 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78  lite3IdListIndex
2bfa0 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20  (pFrom->pUsing, 
2bfb0 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20  zName)>=0 ){.   
2bfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bfd0 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61  In a join with a
2bfe0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f   USING clause, o
2bff0 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  mit columns in t
2c000 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  he.             
2c010 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75     ** using clau
2c020 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  se from the tabl
2c030 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20  e on the right. 
2c040 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
2c050 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2c060 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2c070 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c080 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20         pRight = 
2c090 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
2c0a0 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20  TK_ID, zName);. 
2c0b0 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e             zColn
2c0c0 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
2c0d0 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65           zToFree
2c0e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2c0f0 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20    if( longNames 
2c100 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  || pTabList->nSr
2c110 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c>1 ){.         
2c120 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
2c130 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2c140 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
2c150 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a  xpr(db, TK_ID, z
2c160 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  TabName);.      
2c170 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
2c180 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
2c190 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65  rse, TK_DOT, pLe
2c1a0 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  ft, pRight);.   
2c1b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
2c1c0 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20  SchemaName ){.  
2c1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
2c1e0 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
2c1f0 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63  r(db, TK_ID, zSc
2c200 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20  hemaName);.     
2c210 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
2c220 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
2c230 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20  pParse, TK_DOT, 
2c240 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 20  pLeft, pExpr);. 
2c250 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2c260 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2c270 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20   longNames ){.  
2c280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43                zC
2c290 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  olname = sqlite3
2c2a0 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
2c2b0 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a  %s", zTabName, z
2c2c0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
2c2d0 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d         zToFree =
2c2e0 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20   zColname;.     
2c2f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c300 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2c310 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2c320 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  r = pRight;.    
2c330 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c340 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
2c350 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
2c360 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  nd(pParse, pNew,
2c370 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
2c380 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65       sqlite3Toke
2c390 6e 49 6e 69 74 28 26 73 43 6f 6c 6e 61 6d 65 2c  nInit(&sColname,
2c3a0 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20   zColname);.    
2c3b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2c3c0 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70  xprListSetName(p
2c3d0 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43  Parse, pNew, &sC
2c3e0 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  olname, 0);.    
2c3f0 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
2c400 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   && (p->selFlags
2c410 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d   & SF_NestedFrom
2c420 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2c430 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
2c440 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d  rList_item *pX =
2c450 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e   &pNew->a[pNew->
2c460 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20  nExpr-1];.      
2c470 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
2c480 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c490 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20      pX->zSpan = 
2c4a0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
2c4b0 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  db, pSub->pEList
2c4c0 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20  ->a[j].zSpan);. 
2c4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
2c4e0 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70  estcase( pX->zSp
2c4f0 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  an==0 );.       
2c500 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2c510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58                pX
2c520 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
2c530 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
2c540 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20  .%s.%s",.       
2c550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c570 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c      zSchemaName,
2c580 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e   zTabName, zColn
2c590 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
2c5a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2c5b0 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a  pX->zSpan==0 );.
2c5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2c5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58                pX
2c5e0 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31  ->bSpanIsTab = 1
2c5f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2c600 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2c610 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54  te3DbFree(db, zT
2c620 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20  oFree);.        
2c630 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2c640 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65        if( !table
2c650 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Seen ){.        
2c660 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a    if( zTName ){.
2c670 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2c680 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2c690 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  se, "no such tab
2c6a0 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29  le: %s", zTName)
2c6b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2c6c0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
2c6d0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2c6e0 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65  Parse, "no table
2c6f0 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20  s specified");. 
2c700 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c710 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2c720 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
2c730 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
2c740 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d   pEList);.    p-
2c750 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a  >pEList = pNew;.
2c760 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c    }.  if( p->pEL
2c770 69 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ist ){.    if( p
2c780 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  ->pEList->nExpr>
2c790 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
2c7a0 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
2c7b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2c7c0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2c7d0 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d   "too many colum
2c7e0 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  ns in result set
2c7f0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
2c800 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
2c810 7d 0a 20 20 20 20 69 66 28 20 28 65 6c 69 73 74  }.    if( (elist
2c820 46 6c 61 67 73 20 26 20 28 45 50 5f 48 61 73 46  Flags & (EP_HasF
2c830 75 6e 63 7c 45 50 5f 53 75 62 71 75 65 72 79 29  unc|EP_Subquery)
2c840 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )!=0 ){.      p-
2c850 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
2c860 43 6f 6d 70 6c 65 78 52 65 73 75 6c 74 3b 0a 20  ComplexResult;. 
2c870 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2c880 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
2c890 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72  }../*.** No-op r
2c8a0 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70  outine for the p
2c8b0 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72  arse-tree walker
2c8c0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
2c8d0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
2c8e0 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c   Walker.xExprCal
2c8f0 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65  lback then expre
2c900 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61  ssion trees.** a
2c910 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75  re walked withou
2c920 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65  t any actions be
2c930 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63  ing taken at eac
2c940 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61  h node.  Presuma
2c950 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69  bly,.** when thi
2c960 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
2c970 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78  d for Walker.xEx
2c980 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20  prCallback then 
2c990 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65  .** Walker.xSele
2c9a0 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65  ctCallback is se
2c9b0 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e  t to do somethin
2c9c0 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65  g useful for eve
2c9d0 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  ry .** subquery 
2c9e0 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 74 72  in the parser tr
2c9f0 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ee..*/.int sqlit
2ca00 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57  e3ExprWalkNoop(W
2ca10 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20  alker *NotUsed, 
2ca20 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b  Expr *NotUsed2){
2ca30 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2ca40 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
2ca50 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72  tUsed2);.  retur
2ca60 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
2ca70 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72  }../*.** No-op r
2ca80 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70  outine for the p
2ca90 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72  arse-tree walker
2caa0 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
2cab0 65 6d 65 6e 74 73 2e 0a 2a 2a 20 73 75 62 71 75  ements..** subqu
2cac0 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73 65  ery in the parse
2cad0 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73  r tree..*/.int s
2cae0 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b  qlite3SelectWalk
2caf0 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74  Noop(Walker *Not
2cb00 55 73 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e 6f  Used, Select *No
2cb10 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
2cb20 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
2cb30 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
2cb40 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
2cb50 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 20 53  ntinue;.}..#if S
2cb60 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
2cb70 2a 20 41 6c 77 61 79 73 20 61 73 73 65 72 74 2e  * Always assert.
2cb80 20 20 54 68 69 73 20 78 53 65 6c 65 63 74 43 61    This xSelectCa
2cb90 6c 6c 62 61 63 6b 32 20 69 6d 70 6c 65 6d 65 6e  llback2 implemen
2cba0 74 61 74 69 6f 6e 20 70 72 6f 76 65 73 20 74 68  tation proves th
2cbb0 61 74 20 74 68 65 0a 2a 2a 20 78 53 65 6c 65 63  at the.** xSelec
2cbc0 74 43 61 6c 6c 62 61 63 6b 32 20 69 73 20 6e 65  tCallback2 is ne
2cbd0 76 65 72 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a  ver invoked..*/.
2cbe0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
2cbf0 63 74 57 61 6c 6b 41 73 73 65 72 74 32 28 57 61  ctWalkAssert2(Wa
2cc00 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 53  lker *NotUsed, S
2cc10 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 32 29  elect *NotUsed2)
2cc20 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
2cc30 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
2cc40 6f 74 55 73 65 64 32 29 3b 0a 20 20 61 73 73 65  otUsed2);.  asse
2cc50 72 74 28 20 30 20 29 3b 0a 7d 0a 23 65 6e 64 69  rt( 0 );.}.#endi
2cc60 66 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  f./*.** This rou
2cc70 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20 61  tine "expands" a
2cc80 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2cc90 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73  t and all of its
2cca0 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20   subqueries..** 
2ccb0 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  For additional i
2ccc0 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68  nformation on wh
2ccd0 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20 22  at it means to "
2cce0 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43 54  expand" a SELECT
2ccf0 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20 73  .** statement, s
2cd00 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f  ee the comment o
2cd10 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78 70 61  n the selectExpa
2cd20 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61  nd worker callba
2cd30 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  ck above..**.** 
2cd40 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c 45  Expanding a SELE
2cd50 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  CT statement is 
2cd60 74 68 65 20 66 69 72 73 74 20 73 74 65 70 20 69  the first step i
2cd70 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a  n processing a.*
2cd80 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
2cd90 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20  nt.  The SELECT 
2cda0 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20 62  statement must b
2cdb0 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72  e expanded befor
2cdc0 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75  e.** name resolu
2cdd0 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65  tion is performe
2cde0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74  d..**.** If anyt
2cdf0 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c  hing goes wrong,
2ce00 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2ce10 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
2ce20 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65  o pParse..** The
2ce30 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
2ce40 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74 68 65  n can detect the
2ce50 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b   problem by look
2ce60 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e 6e  ing at pParse->n
2ce70 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50  Err.** and/or pP
2ce80 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
2ce90 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  Failed..*/.stati
2cea0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  c void sqlite3Se
2ceb0 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72 73 65  lectExpand(Parse
2cec0 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
2ced0 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57 61   *pSelect){.  Wa
2cee0 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70  lker w;.  w.xExp
2cef0 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  rCallback = sqli
2cf00 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b  te3ExprWalkNoop;
2cf10 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
2cf20 61 72 73 65 3b 0a 20 20 69 66 28 20 4f 4b 5f 49  arse;.  if( OK_I
2cf30 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70 50  F_ALWAYS_TRUE(pP
2cf40 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e  arse->hasCompoun
2cf50 64 29 20 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c  d) ){.    w.xSel
2cf60 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f  ectCallback = co
2cf70 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c  nvertCompoundSel
2cf80 65 63 74 54 6f 53 75 62 71 75 65 72 79 3b 0a 20  ectToSubquery;. 
2cf90 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c     w.xSelectCall
2cfa0 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 73  back2 = 0;.    s
2cfb0 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
2cfc0 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  (&w, pSelect);. 
2cfd0 20 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61   }.  w.xSelectCa
2cfe0 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45  llback = selectE
2cff0 78 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78 53 65  xpander;.  w.xSe
2d000 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20  lectCallback2 = 
2d010 73 65 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a 20  selectPopWith;. 
2d020 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
2d030 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b  ct(&w, pSelect);
2d040 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
2d050 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
2d060 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  Y./*.** This is 
2d070 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74  a Walker.xSelect
2d080 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63  Callback callbac
2d090 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65  k for the sqlite
2d0a0 33 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28  3SelectTypeInfo(
2d0b0 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a  ).** interface..
2d0c0 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46  **.** For each F
2d0d0 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
2d0e0 65 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e  ery, add Column.
2d0f0 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e  zType and Column
2d100 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d  .zColl.** inform
2d110 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62  ation to the Tab
2d120 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
2d130 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65  t represents the
2d140 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f   result set.** o
2d150 66 20 74 68 61 74 20 73 75 62 71 75 65 72 79 2e  f that subquery.
2d160 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65  .**.** The Table
2d170 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2d180 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72  represents the r
2d190 65 73 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f  esult set was co
2d1a0 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20  nstructed.** by 
2d1b0 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29  selectExpander()
2d1c0 20 62 75 74 20 74 68 65 20 74 79 70 65 20 61 6e   but the type an
2d1d0 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f  d collation info
2d1e0 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74  rmation was omit
2d1f0 74 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70  ted.** at that p
2d200 6f 69 6e 74 20 62 65 63 61 75 73 65 20 69 64 65  oint because ide
2d210 6e 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74  ntifiers had not
2d220 20 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76   yet been resolv
2d230 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ed.  This.** rou
2d240 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61  tine is called a
2d250 66 74 65 72 20 69 64 65 6e 74 69 66 69 65 72 20  fter identifier 
2d260 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73  resolution..*/.s
2d270 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
2d280 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65  tAddSubqueryType
2d290 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61  Info(Walker *pWa
2d2a0 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
2d2b0 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
2d2c0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72  e;.  int i;.  Sr
2d2d0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
2d2e0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
2d2f0 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a  t_item *pFrom;..
2d300 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c    assert( p->sel
2d310 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c  Flags & SF_Resol
2d320 76 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ved );.  if( p->
2d330 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61  selFlags & SF_Ha
2d340 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75  sTypeInfo ) retu
2d350 72 6e 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67  rn;.  p->selFlag
2d360 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49  s |= SF_HasTypeI
2d370 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20  nfo;.  pParse = 
2d380 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
2d390 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
2d3a0 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >pSrc;.  for(i=0
2d3b0 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
2d3c0 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
2d3d0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
2d3e0 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  m++){.    Table 
2d3f0 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
2d400 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Tab;.    assert(
2d410 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20   pTab!=0 );.    
2d420 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
2d430 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
2d440 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
2d450 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
2d460 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2d470 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
2d480 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
2d490 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
2d4a0 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66 28 20  lect;.      if( 
2d4b0 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pSel ){.        
2d4c0 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72  while( pSel->pPr
2d4d0 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65  ior ) pSel = pSe
2d4e0 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  l->pPrior;.     
2d4f0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
2d500 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
2d510 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65  Collation(pParse
2d520 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20  , pTab, pSel);. 
2d530 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2d540 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
2d550 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
2d560 64 64 73 20 64 61 74 61 74 79 70 65 20 61 6e 64  dds datatype and
2d570 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
2d580 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nce information 
2d590 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20  to.** the Table 
2d5a0 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c  structures of al
2d5b0 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  l FROM-clause su
2d5c0 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a  bqueries in a.**
2d5d0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2d5e0 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69  t..**.** Use thi
2d5f0 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20  s routine after 
2d600 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  name resolution.
2d610 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2d620 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
2d630 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a  TypeInfo(Parse *
2d640 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
2d650 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65  pSelect){.#ifnde
2d660 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
2d670 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20  BQUERY.  Walker 
2d680 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  w;.  w.xSelectCa
2d690 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  llback = sqlite3
2d6a0 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b 0a  SelectWalkNoop;.
2d6b0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
2d6c0 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 41 64 64  ack2 = selectAdd
2d6d0 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f  SubqueryTypeInfo
2d6e0 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
2d6f0 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ack = sqlite3Exp
2d700 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70  rWalkNoop;.  w.p
2d710 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
2d720 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
2d730 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29  ect(&w, pSelect)
2d740 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
2d750 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2d760 73 65 74 73 20 75 70 20 61 20 53 45 4c 45 43 54  sets up a SELECT
2d770 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70   statement for p
2d780 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a  rocessing.  The.
2d790 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  ** following is 
2d7a0 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a  accomplished:.**
2d7b0 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20  .**     *  VDBE 
2d7c0 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61  Cursor numbers a
2d7d0 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  re assigned to a
2d7e0 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74  ll FROM-clause t
2d7f0 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  erms..**     *  
2d800 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20  Ephemeral Table 
2d810 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61  objects are crea
2d820 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d  ted for all FROM
2d830 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69  -clause subqueri
2d840 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e  es..**     *  ON
2d850 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
2d860 65 73 20 61 72 65 20 73 68 69 66 74 65 64 20 69  es are shifted i
2d870 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d  nto WHERE statem
2d880 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57  ents.**     *  W
2d890 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64  ildcards "*" and
2d8a0 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65   "TABLE.*" in re
2d8b0 73 75 6c 74 20 73 65 74 73 20 61 72 65 20 65 78  sult sets are ex
2d8c0 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a  panded..**     *
2d8d0 20 20 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e    Identifiers in
2d8e0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20   expression are 
2d8f0 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65  matched to table
2d900 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
2d910 75 74 69 6e 65 20 61 63 74 73 20 72 65 63 75 72  utine acts recur
2d920 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75  sively on all su
2d930 62 71 75 65 72 69 65 73 20 77 69 74 68 69 6e 20  bqueries within 
2d940 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76  the SELECT..*/.v
2d950 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
2d960 74 50 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a  tPrep(.  Parse *
2d970 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
2d980 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
2d990 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
2d9a0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
2d9b0 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
2d9c0 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
2d9d0 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65  coded. */.  Name
2d9e0 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e  Context *pOuterN
2d9f0 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65  C  /* Name conte
2da00 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72  xt for container
2da10 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
2da20 20 70 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p!=0 || pParse-
2da30 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2da40 64 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  d );.  if( pPars
2da50 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
2da60 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
2da70 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
2da80 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  & SF_HasTypeInfo
2da90 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
2daa0 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
2dab0 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69  (pParse, p);.  i
2dac0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
2dad0 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
2dae0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
2daf0 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52  turn;.  sqlite3R
2db00 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65  esolveSelectName
2db10 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75  s(pParse, p, pOu
2db20 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50  terNC);.  if( pP
2db30 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50  arse->nErr || pP
2db40 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
2db50 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
2db60 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
2db70 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72  AddTypeInfo(pPar
2db80 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  se, p);.}../*.**
2db90 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65   Reset the aggre
2dba0 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
2dbb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72  ..**.** The aggr
2dbc0 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
2dbd0 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65  r is a set of me
2dbe0 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20  mory cells that 
2dbf0 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64  hold.** intermed
2dc00 69 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69  iate results whi
2dc10 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61  le calculating a
2dc20 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68  n aggregate.  Th
2dc30 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65  is.** routine ge
2dc40 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61  nerates code tha
2dc50 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69  t stores NULLs i
2dc60 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d  n all of those m
2dc70 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a  emory.** cells..
2dc80 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
2dc90 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
2dca0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
2dcb0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
2dcc0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
2dcd0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
2dce0 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
2dcf0 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
2dd00 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20  unc;.  int nReg 
2dd10 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  = pAggInfo->nFun
2dd20 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  c + pAggInfo->nC
2dd30 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65  olumn;.  if( nRe
2dd40 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23  g==0 ) return;.#
2dd50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2dd60 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  UG.  /* Verify t
2dd70 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20  hat all AggInfo 
2dd80 72 65 67 69 73 74 65 72 73 20 61 72 65 20 77 69  registers are wi
2dd90 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73  thin the range s
2dda0 70 65 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a  pecified by.  **
2ddb0 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e   AggInfo.mnReg..
2ddc0 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f  AggInfo.mxReg */
2ddd0 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d  .  assert( nReg=
2dde0 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67  =pAggInfo->mxReg
2ddf0 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67  -pAggInfo->mnReg
2de00 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  +1 );.  for(i=0;
2de10 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   i<pAggInfo->nCo
2de20 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
2de30 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f  assert( pAggInfo
2de40 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d  ->aCol[i].iMem>=
2de50 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a  pAggInfo->mnReg.
2de60 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67           && pAgg
2de70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d  Info->aCol[i].iM
2de80 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78  em<=pAggInfo->mx
2de90 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  Reg );.  }.  for
2dea0 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
2deb0 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20  ->nFunc; i++){. 
2dec0 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49     assert( pAggI
2ded0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d  nfo->aFunc[i].iM
2dee0 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e  em>=pAggInfo->mn
2def0 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20  Reg.         && 
2df00 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
2df10 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66  i].iMem<=pAggInf
2df20 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a  o->mxReg );.  }.
2df30 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
2df40 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2df50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e  _Null, 0, pAggIn
2df60 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49  fo->mnReg, pAggI
2df70 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66  nfo->mxReg);.  f
2df80 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66  or(pFunc=pAggInf
2df90 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69  o->aFunc, i=0; i
2dfa0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
2dfb0 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b  ; i++, pFunc++){
2dfc0 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
2dfd0 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
2dfe0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
2dff0 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20   pFunc->pExpr;. 
2e000 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
2e010 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
2e020 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
2e030 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
2e040 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  >x.pList==0 || p
2e050 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  E->x.pList->nExp
2e060 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  r!=1 ){.        
2e070 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2e080 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43  pParse, "DISTINC
2e090 54 20 61 67 67 72 65 67 61 74 65 73 20 6d 75 73  T aggregates mus
2e0a0 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f  t have exactly o
2e0b0 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ne ".           
2e0c0 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20  "argument");.   
2e0d0 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73       pFunc->iDis
2e0e0 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
2e0f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2e100 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
2e110 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
2e120 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
2e130 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c  pParse, pE->x.pL
2e140 69 73 74 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20  ist,0,0);.      
2e150 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2e160 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
2e170 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e  hemeral, pFunc->
2e180 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c  iDistinct, 0, 0,
2e190 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e1a0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
2e1b0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
2e1c0 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d  EYINFO);.      }
2e1d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
2e1e0 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f  .** Invoke the O
2e1f0 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70  P_AggFinalize op
2e200 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 61  code for every a
2e210 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
2e220 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49  n.** in the AggI
2e230 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  nfo structure..*
2e240 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69  /.static void fi
2e250 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f  nalizeAggFunctio
2e260 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ns(Parse *pParse
2e270 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
2e280 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
2e290 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
2e2a0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
2e2b0 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
2e2c0 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  *pF;.  for(i=0, 
2e2d0 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  pF=pAggInfo->aFu
2e2e0 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  nc; i<pAggInfo->
2e2f0 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b  nFunc; i++, pF++
2e300 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
2e310 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78  *pList = pF->pEx
2e320 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
2e330 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
2e340 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45  sProperty(pF->pE
2e350 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
2e360 74 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t) );.    sqlite
2e370 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2e380 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e  P_AggFinal, pF->
2e390 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c  iMem, pList ? pL
2e3a0 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b  ist->nExpr : 0);
2e3b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2e3c0 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e  AppendP4(v, pF->
2e3d0 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
2e3e0 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  F);.  }.}.../*.*
2e3f0 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63  * Update the acc
2e400 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20  umulator memory 
2e410 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67  cells for an agg
2e420 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a  regate based on.
2e430 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ** the current c
2e440 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a  ursor position..
2e450 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 41 63 63 20  **.** If regAcc 
2e460 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20  is non-zero and 
2e470 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 69 6e  there are no min
2e480 28 29 20 6f 72 20 6d 61 78 28 29 20 61 67 67 72  () or max() aggr
2e490 65 67 61 74 65 73 0a 2a 2a 20 69 6e 20 70 41 67  egates.** in pAg
2e4a0 67 49 6e 66 6f 2c 20 74 68 65 6e 20 6f 6e 6c 79  gInfo, then only
2e4b0 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 70 41   populate the pA
2e4c0 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c  ggInfo->nAccumul
2e4d0 61 74 6f 72 20 61 63 63 75 6d 75 6c 61 74 6f 72  ator accumulator
2e4e0 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 69 20  .** registers i 
2e4f0 72 65 67 69 73 74 65 72 20 72 65 67 41 63 63 20  register regAcc 
2e500 63 6f 6e 74 61 69 6e 73 20 30 2e 20 54 68 65 20  contains 0. The 
2e510 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 61 6b 65  caller will take
2e520 20 63 61 72 65 0a 2a 2a 20 6f 66 20 73 65 74 74   care.** of sett
2e530 69 6e 67 20 61 6e 64 20 63 6c 65 61 72 69 6e 67  ing and clearing
2e540 20 72 65 67 41 63 63 2e 0a 2a 2f 0a 73 74 61 74   regAcc..*/.stat
2e550 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41 63  ic void updateAc
2e560 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20  cumulator(Parse 
2e570 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 72 65 67  *pParse, int reg
2e580 41 63 63 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  Acc, AggInfo *pA
2e590 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
2e5a0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
2e5b0 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  be;.  int i;.  i
2e5c0 6e 74 20 72 65 67 48 69 74 20 3d 20 30 3b 0a 20  nt regHit = 0;. 
2e5d0 20 69 6e 74 20 61 64 64 72 48 69 74 54 65 73 74   int addrHitTest
2e5e0 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 41   = 0;.  struct A
2e5f0 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
2e600 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
2e610 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41  o_col *pC;..  pA
2e620 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
2e630 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d  de = 1;.  for(i=
2e640 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pF=pAggInfo->
2e650 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66  aFunc; i<pAggInf
2e660 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
2e670 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41  F++){.    int nA
2e680 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  rg;.    int addr
2e690 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Next = 0;.    in
2e6a0 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78  t regAgg;.    Ex
2e6b0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
2e6c0 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  pF->pExpr->x.pLi
2e6d0 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
2e6e0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2e6f0 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78  (pF->pExpr, EP_x
2e700 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
2e710 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
2e720 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74      nArg = pList
2e730 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72  ->nExpr;.      r
2e740 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33 47  egAgg = sqlite3G
2e750 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
2e760 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 20  se, nArg);.     
2e770 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
2e780 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
2e790 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c 20   pList, regAgg, 
2e7a0 30 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44  0, SQLITE_ECEL_D
2e7b0 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  UP);.    }else{.
2e7c0 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a        nArg = 0;.
2e7d0 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 30        regAgg = 0
2e7e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2e7f0 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30  pF->iDistinct>=0
2e800 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65   ){.      addrNe
2e810 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
2e820 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
2e830 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 41      testcase( nA
2e840 72 67 3d 3d 30 20 29 3b 20 20 2f 2a 20 45 72 72  rg==0 );  /* Err
2e850 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a  or condition */.
2e860 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2e870 6e 41 72 67 3e 31 20 29 3b 20 20 20 2f 2a 20 41  nArg>1 );   /* A
2e880 6c 73 6f 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  lso an error */.
2e890 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e        codeDistin
2e8a0 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69  ct(pParse, pF->i
2e8b0 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65  Distinct, addrNe
2e8c0 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a  xt, 1, regAgg);.
2e8d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
2e8e0 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61  ->pFunc->funcFla
2e8f0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
2e900 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20  _NEEDCOLL ){.   
2e910 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
2e920 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72  l = 0;.      str
2e930 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
2e940 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
2e950 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73  int j;.      ass
2e960 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b  ert( pList!=0 );
2e970 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66    /* pList!=0 if
2e980 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e   pF->pFunc has N
2e990 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20  EEDCOLL */.     
2e9a0 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d   for(j=0, pItem=
2e9b0 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c  pList->a; !pColl
2e9c0 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c   && j<nArg; j++,
2e9d0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
2e9e0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2e9f0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
2ea00 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78  arse, pItem->pEx
2ea10 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
2ea20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
2ea30 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
2ea40 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
2ea50 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
2ea60 20 20 20 20 20 20 69 66 28 20 72 65 67 48 69 74        if( regHit
2ea70 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d  ==0 && pAggInfo-
2ea80 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 20  >nAccumulator ) 
2ea90 72 65 67 48 69 74 20 3d 20 2b 2b 70 50 61 72 73  regHit = ++pPars
2eaa0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
2eab0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2eac0 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
2ead0 72 65 67 48 69 74 2c 20 30 2c 20 30 2c 20 28 63  regHit, 0, 0, (c
2eae0 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
2eaf0 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a  COLLSEQ);.    }.
2eb00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2eb10 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 53  ddOp3(v, OP_AggS
2eb20 74 65 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20  tep, 0, regAgg, 
2eb30 70 46 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 73  pF->iMem);.    s
2eb40 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64  qlite3VdbeAppend
2eb50 50 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c  P4(v, pF->pFunc,
2eb60 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
2eb70 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2eb80 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72  ngeP5(v, (u8)nAr
2eb90 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  g);.    sqlite3E
2eba0 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
2ebb0 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
2ebc0 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20  egAgg, nArg);.  
2ebd0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
2ebe0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
2ebf0 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b  , regAgg, nArg);
2ec00 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78  .    if( addrNex
2ec10 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
2ec20 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2ec30 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b  el(v, addrNext);
2ec40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2ec50 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
2ec60 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rse);.    }.  }.
2ec70 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70  .  /* Before pop
2ec80 75 6c 61 74 69 6e 67 20 74 68 65 20 61 63 63 75  ulating the accu
2ec90 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72  mulator register
2eca0 73 2c 20 63 6c 65 61 72 20 74 68 65 20 63 6f 6c  s, clear the col
2ecb0 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20  umn cache..  ** 
2ecc0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e  Otherwise, if an
2ecd0 79 20 6f 66 20 74 68 65 20 72 65 71 75 69 72 65  y of the require
2ece0 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20  d column values 
2ecf0 61 72 65 20 61 6c 72 65 61 64 79 20 70 72 65 73  are already pres
2ed00 65 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67  ent .  ** in reg
2ed10 69 73 74 65 72 73 2c 20 73 71 6c 69 74 65 33 45  isters, sqlite3E
2ed20 78 70 72 43 6f 64 65 28 29 20 6d 61 79 20 75 73  xprCode() may us
2ed30 65 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f  e OP_SCopy to co
2ed40 70 79 20 74 68 65 20 76 61 6c 75 65 0a 20 20 2a  py the value.  *
2ed50 2a 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42  * to pC->iMem. B
2ed60 75 74 20 62 79 20 74 68 65 20 74 69 6d 65 20 74  ut by the time t
2ed70 68 65 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  he value is used
2ed80 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 72  , the original r
2ed90 65 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79  egister.  ** may
2eda0 20 68 61 76 65 20 62 65 65 6e 20 75 73 65 64 2c   have been used,
2edb0 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68   invalidating th
2edc0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 75 66  e underlying buf
2edd0 66 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a  fer holding the.
2ede0 20 20 2a 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f    ** text or blo
2edf0 62 20 76 61 6c 75 65 2e 20 53 65 65 20 74 69 63  b value. See tic
2ee00 6b 65 74 20 5b 38 38 33 30 33 34 64 63 62 35 5d  ket [883034dcb5]
2ee10 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74  ..  **.  ** Anot
2ee20 68 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75  her solution wou
2ee30 6c 64 20 62 65 20 74 6f 20 63 68 61 6e 67 65 20  ld be to change 
2ee40 74 68 65 20 4f 50 5f 53 43 6f 70 79 20 75 73 65  the OP_SCopy use
2ee50 64 20 74 6f 20 63 6f 70 79 20 63 61 63 68 65 64  d to copy cached
2ee60 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20  .  ** values to 
2ee70 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f  an OP_Copy..  */
2ee80 0a 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d 30  .  if( regHit==0
2ee90 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41   && pAggInfo->nA
2eea0 63 63 75 6d 75 6c 61 74 6f 72 20 29 7b 0a 20 20  ccumulator ){.  
2eeb0 20 20 72 65 67 48 69 74 20 3d 20 72 65 67 41 63    regHit = regAc
2eec0 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67  c;.  }.  if( reg
2eed0 48 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48  Hit ){.    addrH
2eee0 69 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33  itTest = sqlite3
2eef0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2ef00 5f 49 66 2c 20 72 65 67 48 69 74 29 3b 20 56 64  _If, regHit); Vd
2ef10 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2ef20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
2ef30 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
2ef40 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  e);.  for(i=0, p
2ef50 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  C=pAggInfo->aCol
2ef60 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41  ; i<pAggInfo->nA
2ef70 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c  ccumulator; i++,
2ef80 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   pC++){.    sqli
2ef90 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
2efa0 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70  se, pC->pExpr, p
2efb0 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  C->iMem);.  }.  
2efc0 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
2efd0 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Mode = 0;.  sqli
2efe0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
2eff0 72 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  r(pParse);.  if(
2f000 20 61 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a   addrHitTest ){.
2f010 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2f020 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 48  umpHere(v, addrH
2f030 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  itTest);.  }.}..
2f040 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
2f050 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e  le OP_Explain in
2f060 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65  struction to the
2f070 20 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e   VDBE to explain
2f080 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75   a simple.** cou
2f090 6e 74 28 2a 29 20 71 75 65 72 79 20 28 22 53 45  nt(*) query ("SE
2f0a0 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
2f0b0 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69  OM pTab")..*/.#i
2f0c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f0d0 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63  T_EXPLAIN.static
2f0e0 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d   void explainSim
2f0f0 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73  pleCount(.  Pars
2f100 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2f110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2f120 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
2f130 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
2f140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f150 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67    /* Table being
2f160 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e   queried */.  In
2f170 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
2f180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f190 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f   Index used to o
2f1a0 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72  ptimize scan, or
2f1b0 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66   NULL */.){.  if
2f1c0 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
2f1d0 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20  n==2 ){.    int 
2f1e0 62 43 6f 76 65 72 20 3d 20 28 70 49 64 78 21 3d  bCover = (pIdx!=
2f1f0 30 20 26 26 20 28 48 61 73 52 6f 77 69 64 28 70  0 && (HasRowid(p
2f200 54 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61  Tab) || !IsPrima
2f210 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29  ryKeyIndex(pIdx)
2f220 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
2f230 64 62 65 45 78 70 6c 61 69 6e 28 70 50 61 72 73  dbeExplain(pPars
2f240 65 2c 20 30 2c 20 22 53 43 41 4e 20 54 41 42 4c  e, 0, "SCAN TABL
2f250 45 20 25 73 25 73 25 73 22 2c 0a 20 20 20 20 20  E %s%s%s",.     
2f260 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a     pTab->zName,.
2f270 20 20 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f          bCover ?
2f280 20 22 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e   " USING COVERIN
2f290 47 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a  G INDEX " : "",.
2f2a0 20 20 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f          bCover ?
2f2b0 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22   pIdx->zName : "
2f2c0 22 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23  ".    );.  }.}.#
2f2d0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78  else.# define ex
2f2e0 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74  plainSimpleCount
2f2f0 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a  (a,b,c).#endif..
2f300 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c  /*.** sqlite3Wal
2f310 6b 45 78 70 72 28 29 20 63 61 6c 6c 62 61 63 6b  kExpr() callback
2f320 20 75 73 65 64 20 62 79 20 68 61 76 69 6e 67 54   used by havingT
2f330 6f 57 68 65 72 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  oWhere()..**.** 
2f340 49 66 20 74 68 65 20 6e 6f 64 65 20 70 61 73 73  If the node pass
2f350 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  ed to the callba
2f360 63 6b 20 69 73 20 61 20 54 4b 5f 41 4e 44 20 6e  ck is a TK_AND n
2f370 6f 64 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  ode, return .** 
2f380 57 52 43 5f 43 6f 6e 74 69 6e 75 65 20 74 6f 20  WRC_Continue to 
2f390 74 65 6c 6c 20 73 71 6c 69 74 65 33 57 61 6c 6b  tell sqlite3Walk
2f3a0 45 78 70 72 28 29 20 74 6f 20 69 74 65 72 61 74  Expr() to iterat
2f3b0 65 20 74 68 72 6f 75 67 68 20 63 68 69 6c 64 20  e through child 
2f3c0 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  nodes..**.** Oth
2f3d0 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 57  erwise, return W
2f3e0 52 43 5f 50 72 75 6e 65 2e 20 49 6e 20 74 68 69  RC_Prune. In thi
2f3f0 73 20 63 61 73 65 2c 20 61 6c 73 6f 20 63 68 65  s case, also che
2f400 63 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20 73 75  ck if the .** su
2f410 62 2d 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 74  b-expression mat
2f420 63 68 65 73 20 74 68 65 20 63 72 69 74 65 72 69  ches the criteri
2f430 61 20 66 6f 72 20 62 65 69 6e 67 20 6d 6f 76 65  a for being move
2f440 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 0a 2a  d to the WHERE.*
2f450 2a 20 63 6c 61 75 73 65 2e 20 49 66 20 73 6f 2c  * clause. If so,
2f460 20 61 64 64 20 69 74 20 74 6f 20 74 68 65 20 57   add it to the W
2f470 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64 20  HERE clause and 
2f480 72 65 70 6c 61 63 65 20 74 68 65 20 73 75 62 2d  replace the sub-
2f490 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 77 69  expression.** wi
2f4a0 74 68 69 6e 20 74 68 65 20 48 41 56 49 4e 47 20  thin the HAVING 
2f4b0 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20  expression with 
2f4c0 61 20 63 6f 6e 73 74 61 6e 74 20 22 31 22 2e 0a  a constant "1"..
2f4d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
2f4e0 76 69 6e 67 54 6f 57 68 65 72 65 45 78 70 72 43  vingToWhereExprC
2f4f0 62 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  b(Walker *pWalke
2f500 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
2f510 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
2f520 21 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20  !=TK_AND ){.    
2f530 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 57 61  Select *pS = pWa
2f540 6c 6b 65 72 2d 3e 75 2e 70 53 65 6c 65 63 74 3b  lker->u.pSelect;
2f550 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2f560 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
2f570 47 72 6f 75 70 42 79 28 70 57 61 6c 6b 65 72 2d  GroupBy(pWalker-
2f580 3e 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  >pParse, pExpr, 
2f590 70 53 2d 3e 70 47 72 6f 75 70 42 79 29 20 29 7b  pS->pGroupBy) ){
2f5a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
2f5b0 64 62 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  db = pWalker->pP
2f5c0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20  arse->db;.      
2f5d0 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
2f5e0 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
2f5f0 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73  , TK_INTEGER, &s
2f600 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b  qlite3IntTokens[
2f610 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  1], 0);.      if
2f620 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
2f630 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 20 3d    Expr *pWhere =
2f640 20 70 53 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20   pS->pWhere;.   
2f650 20 20 20 20 20 53 57 41 50 28 45 78 70 72 2c 20       SWAP(Expr, 
2f660 2a 70 4e 65 77 2c 20 2a 70 45 78 70 72 29 3b 0a  *pNew, *pExpr);.
2f670 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
2f680 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
2f690 2c 20 70 57 68 65 72 65 2c 20 70 4e 65 77 29 3b  , pWhere, pNew);
2f6a0 0a 20 20 20 20 20 20 20 20 70 53 2d 3e 70 57 68  .        pS->pWh
2f6b0 65 72 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ere = pNew;.    
2f6c0 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
2f6d0 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  de = 1;.      }.
2f6e0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
2f6f0 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a   WRC_Prune;.  }.
2f700 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2f710 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
2f720 54 72 61 6e 73 66 65 72 20 65 6c 69 67 69 62 6c  Transfer eligibl
2f730 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65  e terms from the
2f740 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 6f   HAVING clause o
2f750 66 20 61 20 71 75 65 72 79 2c 20 77 68 69 63 68  f a query, which
2f760 20 69 73 0a 2a 2a 20 70 72 6f 63 65 73 73 65 64   is.** processed
2f770 20 61 66 74 65 72 20 67 72 6f 75 70 69 6e 67 2c   after grouping,
2f780 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
2f790 61 75 73 65 2c 20 77 68 69 63 68 20 69 73 20 70  ause, which is p
2f7a0 72 6f 63 65 73 73 65 64 20 62 65 66 6f 72 65 0a  rocessed before.
2f7b0 2a 2a 20 67 72 6f 75 70 69 6e 67 2e 20 46 6f 72  ** grouping. For
2f7c0 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 71 75   example, the qu
2f7d0 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  ery:.**.**   SEL
2f7e0 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c  ECT * FROM <tabl
2f7f0 65 73 3e 20 57 48 45 52 45 20 61 3d 3f 20 47 52  es> WHERE a=? GR
2f800 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e 47 20  OUP BY b HAVING 
2f810 62 3d 3f 20 41 4e 44 20 63 3d 3f 0a 2a 2a 0a 2a  b=? AND c=?.**.*
2f820 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69 74 74  * can be rewritt
2f830 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53  en as:.**.**   S
2f840 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61  ELECT * FROM <ta
2f850 62 6c 65 73 3e 20 57 48 45 52 45 20 61 3d 3f 20  bles> WHERE a=? 
2f860 41 4e 44 20 62 3d 3f 20 47 52 4f 55 50 20 42 59  AND b=? GROUP BY
2f870 20 62 20 48 41 56 49 4e 47 20 63 3d 3f 0a 2a 2a   b HAVING c=?.**
2f880 0a 2a 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68  .** A term of th
2f890 65 20 48 41 56 49 4e 47 20 65 78 70 72 65 73 73  e HAVING express
2f8a0 69 6f 6e 20 69 73 20 65 6c 69 67 69 62 6c 65 20  ion is eligible 
2f8b0 66 6f 72 20 74 72 61 6e 73 66 65 72 20 69 66 20  for transfer if 
2f8c0 69 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 65  it consists.** e
2f8d0 6e 74 69 72 65 6c 79 20 6f 66 20 63 6f 6e 73 74  ntirely of const
2f8e0 61 6e 74 73 20 61 6e 64 20 65 78 70 72 65 73 73  ants and express
2f8f0 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 61 6c  ions that are al
2f900 73 6f 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  so GROUP BY term
2f910 73 20 74 68 61 74 0a 2a 2a 20 75 73 65 20 74 68  s that.** use th
2f920 65 20 22 42 49 4e 41 52 59 22 20 63 6f 6c 6c 61  e "BINARY" colla
2f930 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a 2a  tion sequence..*
2f940 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 61  /.static void ha
2f950 76 69 6e 67 54 6f 57 68 65 72 65 28 50 61 72 73  vingToWhere(Pars
2f960 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
2f970 74 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20  t *p){.  Walker 
2f980 73 57 61 6c 6b 65 72 3b 0a 20 20 6d 65 6d 73 65  sWalker;.  memse
2f990 74 28 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73  t(&sWalker, 0, s
2f9a0 69 7a 65 6f 66 28 73 57 61 6c 6b 65 72 29 29 3b  izeof(sWalker));
2f9b0 0a 20 20 73 57 61 6c 6b 65 72 2e 70 50 61 72 73  .  sWalker.pPars
2f9c0 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 57  e = pParse;.  sW
2f9d0 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
2f9e0 61 63 6b 20 3d 20 68 61 76 69 6e 67 54 6f 57 68  ack = havingToWh
2f9f0 65 72 65 45 78 70 72 43 62 3b 0a 20 20 73 57 61  ereExprCb;.  sWa
2fa00 6c 6b 65 72 2e 75 2e 70 53 65 6c 65 63 74 20 3d  lker.u.pSelect =
2fa10 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   p;.  sqlite3Wal
2fa20 6b 45 78 70 72 28 26 73 57 61 6c 6b 65 72 2c 20  kExpr(&sWalker, 
2fa30 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 23 69 66  p->pHaving);.#if
2fa40 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
2fa50 42 4c 45 44 0a 20 20 69 66 28 20 73 57 61 6c 6b  BLED.  if( sWalk
2fa60 65 72 2e 65 43 6f 64 65 20 26 26 20 28 73 71 6c  er.eCode && (sql
2fa70 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
2fa80 26 20 30 78 31 30 30 29 21 3d 30 20 29 7b 0a 20  & 0x100)!=0 ){. 
2fa90 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
2faa0 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x100,pParse,p,("
2fab0 4d 6f 76 65 20 48 41 56 49 4e 47 20 74 65 72 6d  Move HAVING term
2fac0 73 20 69 6e 74 6f 20 57 48 45 52 45 3a 5c 6e 22  s into WHERE:\n"
2fad0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ));.    sqlite3T
2fae0 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
2faf0 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
2fb00 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  if.}../*.** Chec
2fb10 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
2fb20 70 54 68 69 73 20 65 6e 74 72 79 20 6f 66 20 70  pThis entry of p
2fb30 54 61 62 4c 69 73 74 20 69 73 20 61 20 73 65 6c  TabList is a sel
2fb40 66 2d 6a 6f 69 6e 20 6f 66 20 61 20 70 72 69 6f  f-join of a prio
2fb50 72 20 76 69 65 77 2e 0a 2a 2a 20 49 66 20 69 74  r view..** If it
2fb60 20 69 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e   is, then return
2fb70 20 74 68 65 20 53 72 63 4c 69 73 74 5f 69 74 65   the SrcList_ite
2fb80 6d 20 66 6f 72 20 74 68 65 20 70 72 69 6f 72 20  m for the prior 
2fb90 76 69 65 77 2e 20 20 49 66 20 69 74 20 69 73 20  view.  If it is 
2fba0 6e 6f 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74  not,.** then ret
2fbb0 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  urn 0..*/.static
2fbc0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2fbd0 69 74 65 6d 20 2a 69 73 53 65 6c 66 4a 6f 69 6e  item *isSelfJoin
2fbe0 56 69 65 77 28 0a 20 20 53 72 63 4c 69 73 74 20  View(.  SrcList 
2fbf0 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
2fc00 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
2fc10 6f 72 20 73 65 6c 66 2d 6a 6f 69 6e 73 20 69 6e  or self-joins in
2fc20 20 74 68 69 73 20 46 52 4f 4d 20 63 6c 61 75 73   this FROM claus
2fc30 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
2fc40 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 68 69  cList_item *pThi
2fc50 73 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f  s   /* Search fo
2fc60 72 20 70 72 69 6f 72 20 72 65 66 65 72 65 6e 63  r prior referenc
2fc70 65 20 74 6f 20 74 68 69 73 20 73 75 62 71 75 65  e to this subque
2fc80 72 79 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  ry */.){.  struc
2fc90 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2fca0 70 49 74 65 6d 3b 0a 20 20 66 6f 72 28 70 49 74  pItem;.  for(pIt
2fcb0 65 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  em = pTabList->a
2fcc0 3b 20 70 49 74 65 6d 3c 70 54 68 69 73 3b 20 70  ; pItem<pThis; p
2fcd0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Item++){.    if(
2fce0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3d   pItem->pSelect=
2fcf0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2fd00 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
2fd10 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 20  .viaCoroutine ) 
2fd20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
2fd30 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pItem->zName==
2fd40 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2fd50 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
2fd60 72 69 63 6d 70 28 70 49 74 65 6d 2d 3e 7a 44 61  ricmp(pItem->zDa
2fd70 74 61 62 61 73 65 2c 20 70 54 68 69 73 2d 3e 7a  tabase, pThis->z
2fd80 44 61 74 61 62 61 73 65 29 21 3d 30 20 29 20 63  Database)!=0 ) c
2fd90 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
2fda0 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
2fdb0 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70  (pItem->zName, p
2fdc0 54 68 69 73 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20  This->zName)!=0 
2fdd0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2fde0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
2fdf0 6f 6d 70 61 72 65 28 30 2c 20 0a 20 20 20 20 20  ompare(0, .     
2fe00 20 20 20 20 20 70 54 68 69 73 2d 3e 70 53 65 6c       pThis->pSel
2fe10 65 63 74 2d 3e 70 57 68 65 72 65 2c 20 70 49 74  ect->pWhere, pIt
2fe20 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 57 68  em->pSelect->pWh
2fe30 65 72 65 2c 20 2d 31 29 20 0a 20 20 20 20 29 7b  ere, -1) .    ){
2fe40 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69  .      /* The vi
2fe50 65 77 20 77 61 73 20 6d 6f 64 69 66 69 65 64 20  ew was modified 
2fe60 62 79 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70  by some other op
2fe70 74 69 6d 69 7a 61 74 69 6f 6e 20 73 75 63 68 20  timization such 
2fe80 61 73 0a 20 20 20 20 20 20 2a 2a 20 70 75 73 68  as.      ** push
2fe90 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 29  DownWhereTerms()
2fea0 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   */.      contin
2feb0 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ue;.    }.    re
2fec0 74 75 72 6e 20 70 49 74 65 6d 3b 0a 20 20 7d 0a  turn pItem;.  }.
2fed0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23    return 0;.}..#
2fee0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 4f 55  ifdef SQLITE_COU
2fef0 4e 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a  NTOFVIEW_OPTIMIZ
2ff00 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41 74 74 65  ATION./*.** Atte
2ff10 6d 70 74 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d  mpt to transform
2ff20 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20   a query of the 
2ff30 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  form.**.**    SE
2ff40 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
2ff50 4f 4d 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f  OM (SELECT x FRO
2ff60 4d 20 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53  M t1 UNION ALL S
2ff70 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 32 29  ELECT y FROM t2)
2ff80 0a 2a 2a 0a 2a 2a 20 49 6e 74 6f 20 74 68 69 73  .**.** Into this
2ff90 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
2ffa0 54 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  T (SELECT count(
2ffb0 2a 29 20 46 52 4f 4d 20 74 31 29 2b 28 53 45 4c  *) FROM t1)+(SEL
2ffc0 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
2ffd0 4d 20 74 32 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20  M t2).**.** The 
2ffe0 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 6f  transformation o
2fff0 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 61 6c 6c  nly works if all
30000 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
30010 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
30020 2a 20 20 20 2a 20 20 54 68 65 20 73 75 62 71 75  *   *  The subqu
30030 65 72 79 20 69 73 20 61 20 55 4e 49 4f 4e 20 41  ery is a UNION A
30040 4c 4c 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  LL of two or mor
30050 65 20 74 65 72 6d 73 0a 2a 2a 20 20 20 2a 20 20  e terms.**   *  
30060 54 68 65 72 65 20 69 73 20 6e 6f 20 57 48 45 52  There is no WHER
30070 45 20 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72  E or GROUP BY or
30080 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20   HAVING clauses 
30090 6f 6e 20 74 68 65 20 73 75 62 71 75 65 72 69 65  on the subquerie
300a0 73 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20 6f 75  s.**   *  The ou
300b0 74 65 72 20 71 75 65 72 79 20 69 73 20 61 20 73  ter query is a s
300c0 69 6d 70 6c 65 20 63 6f 75 6e 74 28 2a 29 0a 2a  imple count(*).*
300d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
300e0 20 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   if the optimiza
300f0 74 69 6f 6e 20 69 73 20 75 6e 64 65 72 74 61 6b  tion is undertak
30100 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  en..*/.static in
30110 74 20 63 6f 75 6e 74 4f 66 56 69 65 77 4f 70 74  t countOfViewOpt
30120 69 6d 69 7a 61 74 69 6f 6e 28 50 61 72 73 65 20  imization(Parse 
30130 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
30140 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  *p){.  Select *p
30150 53 75 62 2c 20 2a 70 50 72 69 6f 72 3b 0a 20 20  Sub, *pPrior;.  
30160 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 45  Expr *pExpr;.  E
30170 78 70 72 20 2a 70 43 6f 75 6e 74 3b 0a 20 20 73  xpr *pCount;.  s
30180 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
30190 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
301a0 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 3d 3d   SF_Aggregate)==
301b0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
301c0 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 61 67  /* This is an ag
301d0 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 69 66 28  gregate */.  if(
301e0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
301f0 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  r!=1 ) return 0;
30200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30210 2a 20 53 69 6e 67 6c 65 20 72 65 73 75 6c 74 20  * Single result 
30220 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 70 45 78 70  column */.  pExp
30230 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  r = p->pEList->a
30240 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [0].pExpr;.  if(
30250 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
30260 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65  GG_FUNCTION ) re
30270 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f  turn 0;        /
30280 2a 20 52 65 73 75 6c 74 20 69 73 20 61 6e 20 61  * Result is an a
30290 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 69 66  ggregate */.  if
302a0 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
302b0 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  p(pExpr->u.zToke
302c0 6e 2c 22 63 6f 75 6e 74 22 29 20 29 20 72 65 74  n,"count") ) ret
302d0 75 72 6e 20 30 3b 20 20 2f 2a 20 49 73 20 63 6f  urn 0;  /* Is co
302e0 75 6e 74 28 29 20 2a 2f 0a 20 20 69 66 28 20 70  unt() */.  if( p
302f0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30  Expr->x.pList!=0
30300 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
30310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30320 4d 75 73 74 20 62 65 20 63 6f 75 6e 74 28 2a 29  Must be count(*)
30330 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 53 72   */.  if( p->pSr
30340 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74  c->nSrc!=1 ) ret
30350 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
30360 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 74          /* One t
30370 61 62 6c 65 20 69 6e 20 46 52 4f 4d 20 20 2a 2f  able in FROM  */
30380 0a 20 20 70 53 75 62 20 3d 20 70 2d 3e 70 53 72  .  pSub = p->pSr
30390 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b  c->a[0].pSelect;
303a0 0a 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29  .  if( pSub==0 )
303b0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
303c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
303d0 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
303e0 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20 2a   is a subquery *
303f0 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50  /.  if( pSub->pP
30400 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  rior==0 ) return
30410 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
30420 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65        /* Must be
30430 20 61 20 63 6f 6d 70 6f 75 6e 64 20 72 79 20 2a   a compound ry *
30440 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20  /.  do{.    if( 
30450 70 53 75 62 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  pSub->op!=TK_ALL
30460 20 26 26 20 70 53 75 62 2d 3e 70 50 72 69 6f 72   && pSub->pPrior
30470 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
30480 20 4d 75 73 74 20 62 65 20 55 4e 49 4f 4e 20 41   Must be UNION A
30490 4c 4c 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  LL */.    if( pS
304a0 75 62 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74  ub->pWhere ) ret
304b0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
304c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
304d0 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  o WHERE clause *
304e0 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  /.    if( pSub->
304f0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
30500 67 72 65 67 61 74 65 20 29 20 72 65 74 75 72 6e  gregate ) return
30510 20 30 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61   0;     /* Not a
30520 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20  n aggregate */. 
30530 20 20 20 70 53 75 62 20 3d 20 70 53 75 62 2d 3e     pSub = pSub->
30540 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 20 20  pPrior;         
30550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30560 20 20 20 20 20 2f 2a 20 52 65 70 65 61 74 20 6f       /* Repeat o
30570 76 65 72 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a  ver compound */.
30580 20 20 7d 77 68 69 6c 65 28 20 70 53 75 62 20 29    }while( pSub )
30590 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  ;..  /* If we re
305a0 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20 74  ach this point t
305b0 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 74 6f 20  hen it is OK to 
305c0 70 65 72 66 6f 72 6d 20 74 68 65 20 74 72 61 6e  perform the tran
305d0 73 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 20  sformation */.. 
305e0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
305f0 3b 0a 20 20 70 43 6f 75 6e 74 20 3d 20 70 45 78  ;.  pCount = pEx
30600 70 72 3b 0a 20 20 70 45 78 70 72 20 3d 20 30 3b  pr;.  pExpr = 0;
30610 0a 20 20 70 53 75 62 20 3d 20 70 2d 3e 70 53 72  .  pSub = p->pSr
30620 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b  c->a[0].pSelect;
30630 0a 20 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d  .  p->pSrc->a[0]
30640 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20  .pSelect = 0;.  
30650 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
30660 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53 72 63  lete(db, p->pSrc
30670 29 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 73  );.  p->pSrc = s
30680 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
30690 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
306a0 69 7a 65 6f 66 28 2a 70 2d 3e 70 53 72 63 29 29  izeof(*p->pSrc))
306b0 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 75 62 20  ;.  while( pSub 
306c0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 54 65  ){.    Expr *pTe
306d0 72 6d 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d  rm;.    pPrior =
306e0 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 0a 20   pSub->pPrior;. 
306f0 20 20 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20     pSub->pPrior 
30700 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70  = 0;.    pSub->p
30710 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 70 53  Next = 0;.    pS
30720 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  ub->selFlags |= 
30730 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20  SF_Aggregate;.  
30740 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73    pSub->selFlags
30750 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64   &= ~SF_Compound
30760 3b 0a 20 20 20 20 70 53 75 62 2d 3e 6e 53 65 6c  ;.    pSub->nSel
30770 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20  ectRow = 0;.    
30780 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
30790 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 2d 3e  elete(db, pSub->
307a0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 54 65  pEList);.    pTe
307b0 72 6d 20 3d 20 70 50 72 69 6f 72 20 3f 20 73 71  rm = pPrior ? sq
307c0 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
307d0 20 70 43 6f 75 6e 74 2c 20 30 29 20 3a 20 70 43   pCount, 0) : pC
307e0 6f 75 6e 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e  ount;.    pSub->
307f0 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pEList = sqlite3
30800 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
30810 50 61 72 73 65 2c 20 30 2c 20 70 54 65 72 6d 29  Parse, 0, pTerm)
30820 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71  ;.    pTerm = sq
30830 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
30840 65 2c 20 54 4b 5f 53 45 4c 45 43 54 2c 20 30 2c  e, TK_SELECT, 0,
30850 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
30860 50 45 78 70 72 41 64 64 53 65 6c 65 63 74 28 70  PExprAddSelect(p
30870 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 53  Parse, pTerm, pS
30880 75 62 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  ub);.    if( pEx
30890 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  pr==0 ){.      p
308a0 45 78 70 72 20 3d 20 70 54 65 72 6d 3b 0a 20 20  Expr = pTerm;.  
308b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
308c0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
308d0 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 50  xpr(pParse, TK_P
308e0 4c 55 53 2c 20 70 54 65 72 6d 2c 20 70 45 78 70  LUS, pTerm, pExp
308f0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  r);.    }.    pS
30900 75 62 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 7d  ub = pPrior;.  }
30910 0a 20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  .  p->pEList->a[
30920 30 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72  0].pExpr = pExpr
30930 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ;.  p->selFlags 
30940 26 3d 20 7e 53 46 5f 41 67 67 72 65 67 61 74 65  &= ~SF_Aggregate
30950 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ;..#if SELECTTRA
30960 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
30970 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
30980 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20  ace & 0x400 ){. 
30990 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
309a0 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x400,pParse,p,("
309b0 41 66 74 65 72 20 63 6f 75 6e 74 2d 6f 66 2d 76  After count-of-v
309c0 69 65 77 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  iew optimization
309d0 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  :\n"));.    sqli
309e0 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
309f0 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
30a00 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
30a10 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
30a20 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45  QLITE_COUNTOFVIE
30a30 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  W_OPTIMIZATION *
30a40 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  /../*.** Generat
30a50 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53  e code for the S
30a60 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
30a70 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61  given in the p a
30a80 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a  rgument.  .**.**
30a90 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
30aa0 20 72 65 74 75 72 6e 65 64 20 61 63 63 6f 72 64   returned accord
30ab0 69 6e 67 20 74 6f 20 74 68 65 20 53 65 6c 65 63  ing to the Selec
30ac0 74 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e  tDest structure.
30ad0 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  .** See comments
30ae0 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20   in sqliteInt.h 
30af0 66 6f 72 20 66 75 72 74 68 65 72 20 69 6e 66 6f  for further info
30b00 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  rmation..**.** T
30b10 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
30b20 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
30b30 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
30b40 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20  y errors are.** 
30b50 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65  encountered, the
30b60 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
30b70 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
30b80 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61  s left in.** pPa
30b90 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  rse->zErrMsg..**
30ba0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
30bb0 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74   does NOT free t
30bc0 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  he Select struct
30bd0 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20  ure passed in.  
30be0 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66  The.** calling f
30bf0 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  unction needs to
30c00 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74   do that..*/.int
30c10 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a   sqlite3Select(.
30c20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
30c30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
30c40 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
30c50 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
30c60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
30c70 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
30c80 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
30c90 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
30ca0 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57  *pDest      /* W
30cb0 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74  hat to do with t
30cc0 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  he query results
30cd0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
30ce0 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
30cf0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
30d00 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   */.  WhereInfo 
30d10 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20  *pWInfo;     /* 
30d20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69  Return from sqli
30d30 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
30d40 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
30d50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
30d60 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
30d70 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ne under constru
30d80 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
30d90 73 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20  sAgg;           
30da0 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65    /* True for se
30db0 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20  lect lists like 
30dc0 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20  "count(*)" */.  
30dd0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
30de0 20 3d 20 30 3b 20 20 2f 2a 20 4c 69 73 74 20 6f   = 0;  /* List o
30df0 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74  f columns to ext
30e00 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69  ract. */.  SrcLi
30e10 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20  st *pTabList;   
30e20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
30e30 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72  les to select fr
30e40 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  om */.  Expr *pW
30e50 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f  here;          /
30e60 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
30e70 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
30e80 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
30e90 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20  pGroupBy;    /* 
30ea0 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  The GROUP BY cla
30eb0 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
30ec0 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  L */.  Expr *pHa
30ed0 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  ving;         /*
30ee0 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   The HAVING clau
30ef0 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
30f00 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31   */.  int rc = 1
30f10 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
30f20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
30f30 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
30f40 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74  on */.  Distinct
30f50 43 74 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f  Ctx sDistinct; /
30f60 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  * Info on how to
30f70 20 63 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e   code the DISTIN
30f80 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20  CT keyword */.  
30f90 53 6f 72 74 43 74 78 20 73 53 6f 72 74 3b 20 20  SortCtx sSort;  
30fa0 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6f         /* Info o
30fb0 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68  n how to code th
30fc0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
30fd0 65 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73  e */.  AggInfo s
30fe0 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a  AggInfo;      /*
30ff0 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65   Information use
31000 64 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71  d by aggregate q
31010 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ueries */.  int 
31020 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  iEnd;           
31030 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
31040 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
31050 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74  query */.  sqlit
31060 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
31070 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
31080 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
31090 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e    ExprList *pMin
310a0 4d 61 78 4f 72 64 65 72 42 79 20 3d 20 30 3b 20  MaxOrderBy = 0; 
310b0 20 2f 2a 20 41 64 64 65 64 20 4f 52 44 45 52 20   /* Added ORDER 
310c0 42 59 20 66 6f 72 20 6d 69 6e 2f 6d 61 78 20 71  BY for min/max q
310d0 75 65 72 69 65 73 20 2a 2f 0a 20 20 75 38 20 6d  ueries */.  u8 m
310e0 69 6e 4d 61 78 46 6c 61 67 3b 20 20 20 20 20 20  inMaxFlag;      
310f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
31100 61 67 20 66 6f 72 20 6d 69 6e 2f 6d 61 78 20 71  ag for min/max q
31110 75 65 72 69 65 73 20 2a 2f 0a 0a 20 20 64 62 20  ueries */..  db 
31120 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
31130 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
31140 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
31150 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  ( p==0 || db->ma
31160 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
31170 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20  arse->nErr ){.  
31180 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
31190 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
311a0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
311b0 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
311c0 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20   0, 0) ) return 
311d0 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67  1;.  memset(&sAg
311e0 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  gInfo, 0, sizeof
311f0 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 23 69 66  (sAggInfo));.#if
31200 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
31210 42 4c 45 44 0a 20 20 53 45 4c 45 43 54 54 52 41  BLED.  SELECTTRA
31220 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 20 28  CE(1,pParse,p, (
31230 22 62 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e  "begin processin
31240 67 3a 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 61  g:\n", pParse->a
31250 64 64 72 45 78 70 6c 61 69 6e 29 29 3b 0a 20 20  ddrExplain));.  
31260 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
31270 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  tTrace & 0x100 )
31280 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  {.    sqlite3Tre
31290 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
312a0 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
312b0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ..  assert( p->p
312c0 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44  OrderBy==0 || pD
312d0 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
312e0 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 61 73  DistFifo );.  as
312f0 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
31300 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65  y==0 || pDest->e
31310 44 65 73 74 21 3d 53 52 54 5f 46 69 66 6f 20 29  Dest!=SRT_Fifo )
31320 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
31330 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44  OrderBy==0 || pD
31340 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
31350 44 69 73 74 51 75 65 75 65 20 29 3b 0a 20 20 61  DistQueue );.  a
31360 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
31370 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
31380 65 44 65 73 74 21 3d 53 52 54 5f 51 75 65 75 65  eDest!=SRT_Queue
31390 20 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61   );.  if( Ignora
313a0 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74  bleOrderby(pDest
313b0 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
313c0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
313d0 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73  T_Exists || pDes
313e0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e  t->eDest==SRT_Un
313f0 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ion || .        
31400 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d     pDest->eDest=
31410 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70  =SRT_Except || p
31420 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
31430 5f 44 69 73 63 61 72 64 20 7c 7c 0a 20 20 20 20  _Discard ||.    
31440 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44         pDest->eD
31450 65 73 74 3d 3d 53 52 54 5f 51 75 65 75 65 20 20  est==SRT_Queue  
31460 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  || pDest->eDest=
31470 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c  =SRT_DistFifo ||
31480 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73  .           pDes
31490 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  t->eDest==SRT_Di
314a0 73 74 51 75 65 75 65 20 7c 7c 20 70 44 65 73 74  stQueue || pDest
314b0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66  ->eDest==SRT_Fif
314c0 6f 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52  o);.    /* If OR
314d0 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20  DER BY makes no 
314e0 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68  difference in th
314f0 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65  e output then ne
31500 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a  ither does.    *
31510 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74  * DISTINCT so it
31520 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20   can be removed 
31530 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  too. */.    sqli
31540 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
31550 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
31560 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65  y);.    p->pOrde
31570 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  rBy = 0;.    p->
31580 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
31590 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20  Distinct;.  }.  
315a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
315b0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b  p(pParse, p, 0);
315c0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
315d0 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
315e0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
315f0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
31600 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
31610 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 23 69  >pEList!=0 );.#i
31620 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
31630 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
31640 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
31650 20 30 78 31 30 34 20 29 7b 0a 20 20 20 20 53 45   0x104 ){.    SE
31660 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 34 2c  LECTTRACE(0x104,
31670 70 50 61 72 73 65 2c 70 2c 20 28 22 61 66 74 65  pParse,p, ("afte
31680 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  r name resolutio
31690 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c  n:\n"));.    sql
316a0 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
316b0 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
316c0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
316d0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
316e0 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67  _Output ){.    g
316f0 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
31700 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  es(pParse, p);. 
31710 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
31720 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
31730 4e 43 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  NC.  if( sqlite3
31740 57 69 6e 64 6f 77 52 65 77 72 69 74 65 28 70 50  WindowRewrite(pP
31750 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20  arse, p) ){.    
31760 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
31770 0a 20 20 7d 0a 23 69 66 20 53 45 4c 45 43 54 54  .  }.#if SELECTT
31780 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
31790 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
317a0 54 72 61 63 65 20 26 20 30 78 31 30 38 20 29 7b  Trace & 0x108 ){
317b0 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
317c0 28 30 78 31 30 34 2c 70 50 61 72 73 65 2c 70 2c  (0x104,pParse,p,
317d0 20 28 22 61 66 74 65 72 20 77 69 6e 64 6f 77 20   ("after window 
317e0 72 65 77 72 69 74 65 3a 5c 6e 22 29 29 3b 0a 20  rewrite:\n"));. 
317f0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
31800 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
31810 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65  );.  }.#endif.#e
31820 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
31830 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a  MIT_WINDOWFUNC *
31840 2f 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  /.  pTabList = p
31850 2d 3e 70 53 72 63 3b 0a 20 20 69 73 41 67 67 20  ->pSrc;.  isAgg 
31860 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  = (p->selFlags &
31870 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d   SF_Aggregate)!=
31880 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 6f  0;.  memset(&sSo
31890 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53  rt, 0, sizeof(sS
318a0 6f 72 74 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70  ort));.  sSort.p
318b0 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
318c0 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 54 72 79  derBy;..  /* Try
318d0 20 74 6f 20 76 61 72 69 6f 75 73 20 6f 70 74 69   to various opti
318e0 6d 69 7a 61 74 69 6f 6e 73 20 28 66 6c 61 74 74  mizations (flatt
318f0 65 6e 69 6e 67 20 73 75 62 71 75 65 72 69 65 73  ening subqueries
31900 2c 20 61 6e 64 20 73 74 72 65 6e 67 74 68 0a 20  , and strength. 
31910 20 2a 2a 20 72 65 64 75 63 74 69 6f 6e 20 6f 66   ** reduction of
31920 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 29   join operators)
31930 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
31940 75 73 65 20 75 70 20 69 6e 74 6f 20 74 68 65 20  use up into the 
31950 6d 61 69 6e 20 71 75 65 72 79 0a 20 20 2a 2f 0a  main query.  */.
31960 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
31970 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
31980 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
31990 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
319a0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e  .  for(i=0; !p->
319b0 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62  pPrior && i<pTab
319c0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
319d0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
319e0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
319f0 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
31a00 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  i];.    Select *
31a10 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53  pSub = pItem->pS
31a20 65 6c 65 63 74 3b 0a 20 20 20 20 54 61 62 6c 65  elect;.    Table
31a30 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e   *pTab = pItem->
31a40 70 54 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  pTab;..    /* Co
31a50 6e 76 65 72 74 20 4c 45 46 54 20 4a 4f 49 4e 20  nvert LEFT JOIN 
31a60 69 6e 74 6f 20 4a 4f 49 4e 20 69 66 20 74 68 65  into JOIN if the
31a70 72 65 20 61 72 65 20 74 65 72 6d 73 20 6f 66 20  re are terms of 
31a80 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 0a  the right table.
31a90 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 4c 45      ** of the LE
31aa0 46 54 20 4a 4f 49 4e 20 75 73 65 64 20 69 6e 20  FT JOIN used in 
31ab0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
31ac0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
31ad0 20 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e   (pItem->fg.join
31ae0 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21  type & JT_LEFT)!
31af0 3d 30 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74  =0.     && sqlit
31b00 65 33 45 78 70 72 49 6d 70 6c 69 65 73 4e 6f 6e  e3ExprImpliesNon
31b10 4e 75 6c 6c 52 6f 77 28 70 2d 3e 70 57 68 65 72  NullRow(p->pWher
31b20 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e, pItem->iCurso
31b30 72 29 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d  r).     && Optim
31b40 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64  izationEnabled(d
31b50 62 2c 20 53 51 4c 49 54 45 5f 53 69 6d 70 6c 69  b, SQLITE_Simpli
31b60 66 79 4a 6f 69 6e 29 0a 20 20 20 20 29 7b 0a 20  fyJoin).    ){. 
31b70 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
31b80 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x100,pParse,p,
31b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31ba0 20 28 22 4c 45 46 54 2d 4a 4f 49 4e 20 73 69 6d   ("LEFT-JOIN sim
31bb0 70 6c 69 66 69 65 73 20 74 6f 20 4a 4f 49 4e 20  plifies to JOIN 
31bc0 6f 6e 20 74 65 72 6d 20 25 64 5c 6e 22 2c 69 29  on term %d\n",i)
31bd0 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
31be0 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 3d 20 7e  fg.jointype &= ~
31bf0 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45  (JT_LEFT|JT_OUTE
31c00 52 29 3b 0a 20 20 20 20 20 20 75 6e 73 65 74 4a  R);.      unsetJ
31c10 6f 69 6e 45 78 70 72 28 70 2d 3e 70 57 68 65 72  oinExpr(p->pWher
31c20 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e, pItem->iCurso
31c30 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  r);.    }..    /
31c40 2a 20 4e 6f 20 66 75 74 68 65 72 20 61 63 74 69  * No futher acti
31c50 6f 6e 20 69 66 20 74 68 69 73 20 74 65 72 6d 20  on if this term 
31c60 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
31c70 73 65 20 69 73 20 6e 6f 20 61 20 73 75 62 71 75  se is no a subqu
31c80 65 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ery */.    if( p
31c90 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Sub==0 ) continu
31ca0 65 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 74 63 68  e;..    /* Catch
31cb0 20 6d 69 73 6d 61 74 63 68 20 69 6e 20 74 68 65   mismatch in the
31cc0 20 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e   declared column
31cd0 73 20 6f 66 20 61 20 76 69 65 77 20 61 6e 64 20  s of a view and 
31ce0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
31cf0 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20    ** columns in 
31d00 74 68 65 20 53 45 4c 45 43 54 20 6f 6e 20 74 68  the SELECT on th
31d10 65 20 52 48 53 20 2a 2f 0a 20 20 20 20 69 66 28  e RHS */.    if(
31d20 20 70 54 61 62 2d 3e 6e 43 6f 6c 21 3d 70 53 75   pTab->nCol!=pSu
31d30 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  b->pEList->nExpr
31d40 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
31d50 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
31d60 2c 20 22 65 78 70 65 63 74 65 64 20 25 64 20 63  , "expected %d c
31d70 6f 6c 75 6d 6e 73 20 66 6f 72 20 27 25 73 27 20  olumns for '%s' 
31d80 62 75 74 20 67 6f 74 20 25 64 22 2c 0a 20 20 20  but got %d",.   
31d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31da0 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70     pTab->nCol, p
31db0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 53 75 62  Tab->zName, pSub
31dc0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
31dd0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  ;.      goto sel
31de0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a  ect_end;.    }..
31df0 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 74 72      /* Do not tr
31e00 79 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 6e 20  y to flatten an 
31e10 61 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65  aggregate subque
31e20 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ry..    **.    *
31e30 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 61 6e 20  * Flattening an 
31e40 61 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65  aggregate subque
31e50 72 79 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69  ry is only possi
31e60 62 6c 65 20 69 66 20 74 68 65 20 6f 75 74 65 72  ble if the outer
31e70 20 71 75 65 72 79 0a 20 20 20 20 2a 2a 20 69 73   query.    ** is
31e80 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 20 20 42 75   not a join.  Bu
31e90 74 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71  t if the outer q
31ea0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
31eb0 69 6e 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62  in, then the sub
31ec0 71 75 65 72 79 0a 20 20 20 20 2a 2a 20 77 69 6c  query.    ** wil
31ed0 6c 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64  l be implemented
31ee0 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65   as a co-routine
31ef0 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
31f00 20 61 64 76 61 6e 74 61 67 65 20 74 6f 0a 20 20   advantage to.  
31f10 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20    ** flattening 
31f20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20  in that case..  
31f30 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 53    */.    if( (pS
31f40 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
31f50 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 20  F_Aggregate)!=0 
31f60 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
31f70 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 47  assert( pSub->pG
31f80 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 0a 20 20  roupBy==0 );..  
31f90 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 65    /* If the oute
31fa0 72 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73  r query contains
31fb0 20 61 20 22 63 6f 6d 70 6c 65 78 22 20 72 65 73   a "complex" res
31fc0 75 6c 74 20 73 65 74 20 28 74 68 61 74 20 69 73  ult set (that is
31fd0 2c 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20  ,.    ** if the 
31fe0 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
31ff0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 75 73  e outer query us
32000 65 73 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20  es functions or 
32010 73 75 62 71 75 65 72 69 65 73 29 0a 20 20 20 20  subqueries).    
32020 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 73 75  ** and if the su
32030 62 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20  bquery contains 
32040 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
32050 73 65 20 61 6e 64 20 69 66 0a 20 20 20 20 2a 2a  se and if.    **
32060 20 69 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c   it will be impl
32070 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d  emented as a co-
32080 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20 64 6f  routine, then do
32090 20 6e 6f 74 20 66 6c 61 74 74 65 6e 2e 20 20 54   not flatten.  T
320a0 68 69 73 0a 20 20 20 20 2a 2a 20 72 65 73 74 72  his.    ** restr
320b0 69 63 74 69 6f 6e 20 61 6c 6c 6f 77 73 20 53 51  iction allows SQ
320c0 4c 20 63 6f 6e 73 74 72 75 63 74 73 20 6c 69 6b  L constructs lik
320d0 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20  e this:.    **. 
320e0 20 20 20 2a 2a 20 20 53 45 4c 45 43 54 20 65 78     **  SELECT ex
320f0 70 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e  pensive_function
32100 28 78 29 0a 20 20 20 20 2a 2a 20 20 20 20 46 52  (x).    **    FR
32110 4f 4d 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f  OM (SELECT x FRO
32120 4d 20 74 61 62 20 4f 52 44 45 52 20 42 59 20 79  M tab ORDER BY y
32130 20 4c 49 4d 49 54 20 31 30 29 3b 0a 20 20 20 20   LIMIT 10);.    
32140 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 65 78  **.    ** The ex
32150 70 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e  pensive_function
32160 28 29 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 75  () is only compu
32170 74 65 64 20 6f 6e 20 74 68 65 20 31 30 20 72 6f  ted on the 10 ro
32180 77 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61  ws that.    ** a
32190 72 65 20 6f 75 74 70 75 74 2c 20 72 61 74 68 65  re output, rathe
321a0 72 20 74 68 61 6e 20 65 76 65 72 79 20 72 6f 77  r than every row
321b0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20   of the table.. 
321c0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
321d0 20 72 65 71 75 69 72 65 6d 65 6e 74 20 74 68 61   requirement tha
321e0 74 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  t the outer quer
321f0 79 20 68 61 76 65 20 61 20 63 6f 6d 70 6c 65 78  y have a complex
32200 20 72 65 73 75 6c 74 20 73 65 74 0a 20 20 20 20   result set.    
32210 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 66 6c  ** means that fl
32220 61 74 74 65 6e 69 6e 67 20 64 6f 65 73 20 6f 63  attening does oc
32230 63 75 72 20 6f 6e 20 73 69 6d 70 6c 65 72 20 53  cur on simpler S
32240 51 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77  QL constraints w
32250 69 74 68 6f 75 74 0a 20 20 20 20 2a 2a 20 74 68  ithout.    ** th
32260 65 20 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63  e expensive_func
32270 74 69 6f 6e 28 29 20 6c 69 6b 65 3a 0a 20 20 20  tion() like:.   
32280 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 53 45 4c 45   **.    **  SELE
32290 43 54 20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT x FROM (SELEC
322a0 54 20 78 20 46 52 4f 4d 20 74 61 62 20 4f 52 44  T x FROM tab ORD
322b0 45 52 20 42 59 20 79 20 4c 49 4d 49 54 20 31 30  ER BY y LIMIT 10
322c0 29 3b 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  );.    */.    if
322d0 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
322e0 21 3d 30 0a 20 20 20 20 20 26 26 20 69 3d 3d 30  !=0.     && i==0
322f0 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 73 65 6c  .     && (p->sel
32300 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6c  Flags & SF_Compl
32310 65 78 52 65 73 75 6c 74 29 21 3d 30 0a 20 20 20  exResult)!=0.   
32320 20 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e    && (pTabList->
32330 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20  nSrc==1.        
32340 20 7c 7c 20 28 70 54 61 62 4c 69 73 74 2d 3e 61   || (pTabList->a
32350 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 26  [1].fg.jointype&
32360 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53  (JT_LEFT|JT_CROS
32370 53 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20  S))!=0).    ){. 
32380 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
32390 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 66 6c     }..    if( fl
323a0 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50  attenSubquery(pP
323b0 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67  arse, p, i, isAg
323c0 67 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  g) ){.      /* T
323d0 68 69 73 20 73 75 62 71 75 65 72 79 20 63 61 6e  his subquery can
323e0 20 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74   be absorbed int
323f0 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f  o its parent. */
32400 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20  .      i = -1;. 
32410 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73     }.    pTabLis
32420 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
32430 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
32440 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
32450 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28  ect_end;.    if(
32460 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72   !IgnorableOrder
32470 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  by(pDest) ){.   
32480 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42     sSort.pOrderB
32490 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
324a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
324b0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
324c0 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
324d0 53 45 4c 45 43 54 0a 20 20 2f 2a 20 48 61 6e 64  SELECT.  /* Hand
324e0 6c 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  le compound SELE
324f0 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 75 73  CT statements us
32500 69 6e 67 20 74 68 65 20 73 65 70 61 72 61 74 65  ing the separate
32510 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 0a 20   multiSelect(). 
32520 20 2a 2a 20 70 72 6f 63 65 64 75 72 65 2e 0a 20   ** procedure.. 
32530 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
32540 69 6f 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ior ){.    rc = 
32550 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72  multiSelect(pPar
32560 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 23  se, p, pDest);.#
32570 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
32580 4e 41 42 4c 45 44 0a 20 20 20 20 53 45 4c 45 43  NABLED.    SELEC
32590 54 54 52 41 43 45 28 30 78 31 2c 70 50 61 72 73  TTRACE(0x1,pPars
325a0 65 2c 70 2c 28 22 65 6e 64 20 63 6f 6d 70 6f 75  e,p,("end compou
325b0 6e 64 2d 73 65 6c 65 63 74 20 70 72 6f 63 65 73  nd-select proces
325c0 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 20 20 69  sing\n"));.    i
325d0 66 28 20 28 73 71 6c 69 74 65 33 53 65 6c 65 63  f( (sqlite3Selec
325e0 74 54 72 61 63 65 20 26 20 30 78 32 30 30 30 29  tTrace & 0x2000)
325f0 21 3d 30 20 26 26 20 45 78 70 6c 61 69 6e 51 75  !=0 && ExplainQu
32600 65 72 79 50 6c 61 6e 50 61 72 65 6e 74 28 70 50  eryPlanParent(pP
32610 61 72 73 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  arse)==0 ){.    
32620 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
32630 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
32640 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
32650 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 3d     if( p->pNext=
32660 3d 30 20 29 20 45 78 70 6c 61 69 6e 51 75 65 72  =0 ) ExplainQuer
32670 79 50 6c 61 6e 50 6f 70 28 70 50 61 72 73 65 29  yPlanPop(pParse)
32680 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
32690 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
326a0 2a 20 44 6f 20 74 68 65 20 63 6f 6e 73 74 61 6e  * Do the constan
326b0 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6f 70  t propagation op
326c0 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20  timization */.  
326d0 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
326e0 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
326f0 54 45 5f 50 72 6f 70 61 67 61 74 65 43 6f 6e 73  TE_PropagateCons
32700 74 29 0a 20 20 20 26 26 20 70 72 6f 70 61 67 61  t).   && propaga
32710 74 65 43 6f 6e 73 74 61 6e 74 73 28 70 50 61 72  teConstants(pPar
32720 73 65 2c 20 70 29 0a 20 20 29 7b 0a 23 69 66 20  se, p).  ){.#if 
32730 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
32740 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69  LED.    if( sqli
32750 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
32760 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 20 20   0x100 ){.      
32770 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30  SELECTTRACE(0x10
32780 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74  0,pParse,p,("Aft
32790 65 72 20 63 6f 6e 73 74 61 6e 74 20 70 72 6f 70  er constant prop
327a0 61 67 61 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20  agation:\n"));. 
327b0 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
327c0 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
327d0 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   0);.    }.#endi
327e0 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 53  f.  }else{.    S
327f0 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30  ELECTTRACE(0x100
32800 2c 70 50 61 72 73 65 2c 70 2c 28 22 43 6f 6e 73  ,pParse,p,("Cons
32810 74 61 6e 74 20 70 72 6f 70 61 67 61 74 69 6f 6e  tant propagation
32820 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 5c 6e 22   not possible\n"
32830 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f  ));.  }..  /* Fo
32840 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 74  r each term in t
32850 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20  he FROM clause, 
32860 64 6f 20 74 77 6f 20 74 68 69 6e 67 73 3a 0a 20  do two things:. 
32870 20 2a 2a 20 28 31 29 20 41 75 74 68 6f 72 69 7a   ** (1) Authoriz
32880 65 64 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20  ed unreferenced 
32890 74 61 62 6c 65 73 0a 20 20 2a 2a 20 28 32 29 20  tables.  ** (2) 
328a0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
328b0 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65  r all sub-querie
328c0 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  s.  */.  for(i=0
328d0 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
328e0 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
328f0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
32900 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62  m *pItem = &pTab
32910 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  List->a[i];.    
32920 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
32930 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75  .    Select *pSu
32940 62 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  b;.#if !defined(
32950 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
32960 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
32970 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
32980 45 57 29 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  EW).    const ch
32990 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
329a0 6e 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a 0a 20  ntext;.#endif.. 
329b0 20 20 20 2f 2a 20 49 73 73 75 65 20 53 51 4c 49     /* Issue SQLI
329c0 54 45 5f 52 45 41 44 20 61 75 74 68 6f 72 69 7a  TE_READ authoriz
329d0 61 74 69 6f 6e 73 20 77 69 74 68 20 61 20 66 61  ations with a fa
329e0 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 66  ke column name f
329f0 6f 72 20 61 6e 79 0a 20 20 20 20 2a 2a 20 74 61  or any.    ** ta
32a00 62 6c 65 73 20 74 68 61 74 20 61 72 65 20 72 65  bles that are re
32a10 66 65 72 65 6e 63 65 64 20 62 75 74 20 66 72 6f  ferenced but fro
32a20 6d 20 77 68 69 63 68 20 6e 6f 20 76 61 6c 75 65  m which no value
32a30 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64 2e  s are extracted.
32a40 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 73  .    ** Examples
32a50 20 6f 66 20 77 68 65 72 65 20 74 68 65 73 65 20   of where these 
32a60 6b 69 6e 64 73 20 6f 66 20 6e 75 6c 6c 20 53 51  kinds of null SQ
32a70 4c 49 54 45 5f 52 45 41 44 20 61 75 74 68 6f 72  LITE_READ author
32a80 69 7a 61 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20  izations.    ** 
32a90 77 6f 75 6c 64 20 6f 63 63 75 72 3a 0a 20 20 20  would occur:.   
32aa0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 53   **.    **     S
32ab0 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
32ac0 52 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 53 51 4c  ROM t1;   -- SQL
32ad0 49 54 45 5f 52 45 41 44 20 74 31 2e 22 22 0a 20  ITE_READ t1."". 
32ae0 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54     **     SELECT
32af0 20 74 31 2e 2a 20 46 52 4f 4d 20 74 31 2c 20 74   t1.* FROM t1, t
32b00 32 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52  2;   -- SQLITE_R
32b10 45 41 44 20 74 32 2e 22 22 0a 20 20 20 20 2a 2a  EAD t2."".    **
32b20 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 61 6b 65  .    ** The fake
32b30 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
32b40 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
32b50 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65    It is possible
32b60 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74 6f 0a   for a table to.
32b70 20 20 20 20 2a 2a 20 68 61 76 65 20 61 20 63 6f      ** have a co
32b80 6c 75 6d 6e 20 6e 61 6d 65 64 20 62 79 20 74 68  lumn named by th
32b90 65 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20  e empty string, 
32ba0 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
32bb0 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f  ere is no way to
32bc0 0a 20 20 20 20 2a 2a 20 64 69 73 74 69 6e 67 75  .    ** distingu
32bd0 69 73 68 20 62 65 74 77 65 65 6e 20 61 6e 20 75  ish between an u
32be0 6e 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c  nreferenced tabl
32bf0 65 20 61 6e 64 20 61 6e 20 61 63 74 75 61 6c 20  e and an actual 
32c00 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
32c10 0a 20 20 20 20 2a 2a 20 22 22 20 63 6f 6c 75 6d  .    ** "" colum
32c20 6e 2e 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  n. The original 
32c30 64 65 73 69 67 6e 20 77 61 73 20 66 6f 72 20 74  design was for t
32c40 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e  he fake column n
32c50 61 6d 65 20 74 6f 20 62 65 20 61 20 4e 55 4c 4c  ame to be a NULL
32c60 2c 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77  ,.    ** which w
32c70 6f 75 6c 64 20 62 65 20 75 6e 61 6d 62 69 67 75  ould be unambigu
32c80 6f 75 73 2e 20 20 42 75 74 20 6c 65 67 61 63 79  ous.  But legacy
32c90 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63   authorization c
32ca0 61 6c 6c 62 61 63 6b 73 20 6d 69 67 68 74 0a 20  allbacks might. 
32cb0 20 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 65     ** assume the
32cc0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
32cd0 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 73 65 67  non-NULL and seg
32ce0 66 61 75 6c 74 2e 20 20 54 68 65 20 75 73 65 20  fault.  The use 
32cf0 6f 66 20 61 6e 20 65 6d 70 74 79 0a 20 20 20 20  of an empty.    
32d00 2a 2a 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68  ** string for th
32d10 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61  e fake column na
32d20 6d 65 20 73 65 65 6d 73 20 73 61 66 65 72 2e 0a  me seems safer..
32d30 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
32d40 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3d 3d 30  Item->colUsed==0
32d50 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
32d60 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
32d70 65 2c 20 53 51 4c 49 54 45 5f 52 45 41 44 2c 20  e, SQLITE_READ, 
32d80 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 22 22  pItem->zName, ""
32d90 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  , pItem->zDataba
32da0 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  se);.    }..#if 
32db0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
32dc0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
32dd0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
32de0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 20  E_OMIT_VIEW).   
32df0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
32e00 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75  e for all sub-qu
32e10 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
32e20 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2f 0a  M clause.    */.
32e30 20 20 20 20 70 53 75 62 20 3d 20 70 49 74 65 6d      pSub = pItem
32e40 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69  ->pSelect;.    i
32e50 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e  f( pSub==0 ) con
32e60 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53  tinue;..    /* S
32e70 6f 6d 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64  ometimes the cod
32e80 65 20 66 6f 72 20 61 20 73 75 62 71 75 65 72 79  e for a subquery
32e90 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74   will be generat
32ea0 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20  ed more than.   
32eb0 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65   ** once, if the
32ec0 20 73 75 62 71 75 65 72 79 20 69 73 20 70 61 72   subquery is par
32ed0 74 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  t of the WHERE c
32ee0 6c 61 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20  lause in a LEFT 
32ef0 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72  JOIN,.    ** for
32f00 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68   example.  In th
32f10 61 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20  at case, do not 
32f20 72 65 67 65 6e 65 72 61 74 65 20 74 68 65 20 63  regenerate the c
32f30 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a  ode to manifest.
32f40 20 20 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72      ** a view or
32f50 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20   the co-routine 
32f60 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76  to implement a v
32f70 69 65 77 2e 20 20 54 68 65 20 66 69 72 73 74 20  iew.  The first 
32f80 69 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20  instance.    ** 
32f90 69 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74  is sufficient, t
32fa0 68 6f 75 67 68 20 74 68 65 20 73 75 62 72 6f 75  hough the subrou
32fb0 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74  tine to manifest
32fc0 20 74 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e   the view does n
32fd0 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65  eed.    ** to be
32fe0 20 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20   invoked again. 
32ff0 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  */.    if( pItem
33000 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b  ->addrFillSub ){
33010 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
33020 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e  ->fg.viaCoroutin
33030 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
33040 2f 2a 20 54 68 65 20 73 75 62 72 6f 75 74 69 6e  /* The subroutin
33050 65 20 74 68 61 74 20 6d 61 6e 69 66 65 73 74 73  e that manifests
33060 20 74 68 65 20 76 69 65 77 20 6d 69 67 68 74 20   the view might 
33070 62 65 20 61 20 6f 6e 65 2d 74 69 6d 65 20 72 6f  be a one-time ro
33080 75 74 69 6e 65 2c 0a 20 20 20 20 20 20 20 20 2a  utine,.        *
33090 2a 20 6f 72 20 69 74 20 6d 69 67 68 74 20 6e 65  * or it might ne
330a0 65 64 20 74 6f 20 62 65 20 72 65 72 75 6e 20 6f  ed to be rerun o
330b0 6e 20 65 61 63 68 20 69 74 65 72 61 74 69 6f 6e  n each iteration
330c0 20 62 65 63 61 75 73 65 20 69 74 0a 20 20 20 20   because it.    
330d0 20 20 20 20 2a 2a 20 65 6e 63 6f 64 65 73 20 61      ** encodes a
330e0 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71   correlated subq
330f0 75 65 72 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  uery. */.       
33100 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
33110 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
33120 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
33130 62 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f  b)->opcode==OP_O
33140 6e 63 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73  nce );.        s
33150 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
33160 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49  (v, OP_Gosub, pI
33170 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  tem->regReturn, 
33180 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
33190 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ub);.      }.   
331a0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
331b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65   }..    /* Incre
331c0 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67  ment Parse.nHeig
331d0 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74  ht by the height
331e0 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20   of the largest 
331f0 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
33200 2a 20 74 72 65 65 20 72 65 66 65 72 72 65 64 20  * tree referred 
33210 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20  to by this, the 
33220 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54  parent select. T
33230 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a  he child select.
33240 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61      ** may conta
33250 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  in expression tr
33260 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20  ees of at most. 
33270 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41     ** (SQLITE_MA
33280 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72  X_EXPR_DEPTH-Par
33290 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67  se.nHeight) heig
332a0 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69  ht. This is a bi
332b0 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f  t.    ** more co
332c0 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20  nservative than 
332d0 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d  necessary, but m
332e0 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20  uch easier than 
332f0 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a  enforcing.    **
33300 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e   an exact limit.
33310 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
33320 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73  se->nHeight += s
33330 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
33340 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20  Height(p);..    
33350 2f 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  /* Make copies o
33360 66 20 63 6f 6e 73 74 61 6e 74 20 57 48 45 52 45  f constant WHERE
33370 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 20 69 6e  -clause terms in
33380 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
33390 20 64 6f 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73   down.    ** ins
333a0 69 64 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ide the subquery
333b0 2e 20 20 54 68 69 73 20 63 61 6e 20 68 65 6c 70  .  This can help
333c0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74 6f   the subquery to
333d0 20 72 75 6e 20 6d 6f 72 65 20 65 66 66 69 63 69   run more effici
333e0 65 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ently..    */.  
333f0 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
33400 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
33410 4c 49 54 45 5f 50 75 73 68 44 6f 77 6e 29 0a 20  LITE_PushDown). 
33420 20 20 20 20 26 26 20 70 75 73 68 44 6f 77 6e 57      && pushDownW
33430 68 65 72 65 54 65 72 6d 73 28 70 50 61 72 73 65  hereTerms(pParse
33440 2c 20 70 53 75 62 2c 20 70 2d 3e 70 57 68 65 72  , pSub, p->pWher
33450 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e, pItem->iCurso
33460 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
33470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70                (p
33480 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  Item->fg.jointyp
33490 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
334a0 29 0a 20 20 20 20 29 7b 0a 23 69 66 20 53 45 4c  ).    ){.#if SEL
334b0 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
334c0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
334d0 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
334e0 30 78 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20  0x100 ){.       
334f0 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
33500 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66  00,pParse,p,("Af
33510 74 65 72 20 57 48 45 52 45 2d 63 6c 61 75 73 65  ter WHERE-clause
33520 20 70 75 73 68 2d 64 6f 77 6e 3a 5c 6e 22 29 29   push-down:\n"))
33530 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
33540 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
33550 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, p, 0);.      
33560 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  }.#endif.    }el
33570 73 65 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  se{.      SELECT
33580 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72  TRACE(0x100,pPar
33590 73 65 2c 70 2c 28 22 50 75 73 68 2d 64 6f 77 6e  se,p,("Push-down
335a0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 5c 6e 22   not possible\n"
335b0 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7a  ));.    }..    z
335c0 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
335d0 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68   = pParse->zAuth
335e0 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70 50 61  Context;.    pPa
335f0 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
33600 74 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  t = pItem->zName
33610 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ;..    /* Genera
33620 74 65 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65  te code to imple
33630 6d 65 6e 74 20 74 68 65 20 73 75 62 71 75 65 72  ment the subquer
33640 79 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  y.    **.    ** 
33650 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
33660 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
33670 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 66 20 74   co-routine if t
33680 68 65 20 73 75 62 71 75 65 72 79 20 69 73 0a 20  he subquery is. 
33690 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64     ** guaranteed
336a0 20 74 6f 20 62 65 20 74 68 65 20 6f 75 74 65 72   to be the outer
336b0 20 6c 6f 6f 70 20 28 73 6f 20 74 68 61 74 20 69   loop (so that i
336c0 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
336d0 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 6d  to be.    ** com
336e0 70 75 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 20  puted more than 
336f0 6f 6e 63 65 29 0a 20 20 20 20 2a 2a 0a 20 20 20  once).    **.   
33700 20 2a 2a 20 54 4f 44 4f 3a 20 41 72 65 20 74 68   ** TODO: Are th
33710 65 72 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e  ere other reason
33720 73 20 62 65 73 69 64 65 20 28 31 29 20 74 6f 20  s beside (1) to 
33730 75 73 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65  use a co-routine
33740 0a 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e  .    ** implemen
33750 74 61 74 69 6f 6e 3f 0a 20 20 20 20 2a 2f 0a 20  tation?.    */. 
33760 20 20 20 69 66 28 20 69 3d 3d 30 0a 20 20 20 20     if( i==0.    
33770 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e   && (pTabList->n
33780 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20  Src==1.         
33790 20 20 20 7c 7c 20 28 70 54 61 62 4c 69 73 74 2d     || (pTabList-
337a0 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70  >a[1].fg.jointyp
337b0 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52  e&(JT_LEFT|JT_CR
337c0 4f 53 53 29 29 21 3d 30 29 20 20 2f 2a 20 28 31  OSS))!=0)  /* (1
337d0 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20  ) */.    ){.    
337e0 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61    /* Implement a
337f0 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74   co-routine that
33800 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 73   will return a s
33810 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
33820 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a   result.      **
33830 20 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e 76   set on each inv
33840 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  ocation..      *
33850 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
33860 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
33870 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
33880 31 3b 0a 20 20 20 20 20 0a 20 20 20 20 20 20 70  1;.     .      p
33890 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
338a0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
338b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
338c0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
338d0 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 70  InitCoroutine, p
338e0 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c  Item->regReturn,
338f0 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20   0, addrTop);.  
33900 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
33910 28 76 2c 20 22 25 73 22 2c 20 70 49 74 65 6d 2d  (v, "%s", pItem-
33920 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
33930 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64        pItem->add
33940 72 46 69 6c 6c 53 75 62 20 3d 20 61 64 64 72 54  rFillSub = addrT
33950 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  op;.      sqlite
33960 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
33970 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75  &dest, SRT_Corou
33980 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67  tine, pItem->reg
33990 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 45  Return);.      E
339a0 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
339b0 28 70 50 61 72 73 65 2c 20 31 2c 20 22 43 4f 2d  (pParse, 1, "CO-
339c0 52 4f 55 54 49 4e 45 20 25 75 22 2c 20 70 53 75  ROUTINE %u", pSu
339d0 62 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20 20 20  b->selId));.    
339e0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
339f0 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64  pParse, pSub, &d
33a00 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65  est);.      pIte
33a10 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67  m->pTab->nRowLog
33a20 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e 53 65 6c  Est = pSub->nSel
33a30 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 70 49  ectRow;.      pI
33a40 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75  tem->fg.viaCorou
33a50 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  tine = 1;.      
33a60 70 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74  pItem->regResult
33a70 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20   = dest.iSdst;. 
33a80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
33a90 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20  EndCoroutine(v, 
33aa0 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
33ab0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
33ac0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
33ad0 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20 20 20  addrTop-1);.    
33ae0 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65    sqlite3ClearTe
33af0 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73  mpRegCache(pPars
33b00 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
33b10 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
33b20 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
33b30 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20  at will fill an 
33b40 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
33b50 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 74 68  with.      ** th
33b60 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69  e content of thi
33b70 73 20 73 75 62 71 75 65 72 79 2e 20 20 70 49 74  s subquery.  pIt
33b80 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
33b90 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20  will point.     
33ba0 20 2a 2a 20 74 6f 20 74 68 65 20 61 64 64 72 65   ** to the addre
33bb0 73 73 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61  ss of the genera
33bc0 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  ted subroutine. 
33bd0 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
33be0 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20  n.      ** is a 
33bf0 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61 74  register allocat
33c00 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 73  ed to hold the s
33c10 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  ubroutine return
33c20 20 61 64 64 72 65 73 73 0a 20 20 20 20 20 20 2a   address.      *
33c30 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70 41  /.      int topA
33c40 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f  ddr;.      int o
33c50 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a 20 20 20  nceAddr = 0;.   
33c60 20 20 20 69 6e 74 20 72 65 74 41 64 64 72 3b 0a     int retAddr;.
33c70 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
33c80 4c 69 73 74 5f 69 74 65 6d 20 2a 70 50 72 69 6f  List_item *pPrio
33c90 72 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  r;..      assert
33ca0 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  ( pItem->addrFil
33cb0 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  lSub==0 );.     
33cc0 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
33cd0 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
33ce0 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41 64 64  em;.      topAdd
33cf0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
33d00 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
33d10 67 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72  ger, 0, pItem->r
33d20 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20  egReturn);.     
33d30 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
33d40 53 75 62 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b  Sub = topAddr+1;
33d50 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
33d60 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65  ->fg.isCorrelate
33d70 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
33d80 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71 75 65  /* If the subque
33d90 72 79 20 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c  ry is not correl
33da0 61 74 65 64 20 61 6e 64 20 69 66 20 77 65 20 61  ated and if we a
33db0 72 65 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66  re not inside of
33dc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72  .        ** a tr
33dd0 69 67 67 65 72 2c 20 74 68 65 6e 20 77 65 20 6f  igger, then we o
33de0 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70  nly need to comp
33df0 75 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ute the value of
33e00 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20 20   the subquery.  
33e10 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a        ** once. *
33e20 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 41 64  /.        onceAd
33e30 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
33e40 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp0(v, OP_Onc
33e50 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
33e60 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  (v);.        Vdb
33e70 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61  eComment((v, "ma
33e80 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22  terialize \"%s\"
33e90 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
33ea0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d  zName));.      }
33eb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 56 64  else{.        Vd
33ec0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
33ed0 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c  , "materialize \
33ee0 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70  "%s\"", pItem->p
33ef0 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
33f00 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 72 69      }.      pPri
33f10 6f 72 20 3d 20 69 73 53 65 6c 66 4a 6f 69 6e 56  or = isSelfJoinV
33f20 69 65 77 28 70 54 61 62 4c 69 73 74 2c 20 70 49  iew(pTabList, pI
33f30 74 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tem);.      if( 
33f40 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 20 20  pPrior ){.      
33f50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
33f60 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75  Op2(v, OP_OpenDu
33f70 70 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  p, pItem->iCurso
33f80 72 2c 20 70 50 72 69 6f 72 2d 3e 69 43 75 72 73  r, pPrior->iCurs
33f90 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  or);.        ass
33fa0 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 53 65  ert( pPrior->pSe
33fb0 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  lect!=0 );.     
33fc0 20 20 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74     pSub->nSelect
33fd0 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 70 53  Row = pPrior->pS
33fe0 65 6c 65 63 74 2d 3e 6e 53 65 6c 65 63 74 52 6f  elect->nSelectRo
33ff0 77 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  w;.      }else{.
34000 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
34010 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
34020 65 73 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61  est, SRT_EphemTa
34030 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  b, pItem->iCurso
34040 72 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 6c  r);.        Expl
34050 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
34060 61 72 73 65 2c 20 31 2c 20 22 4d 41 54 45 52 49  arse, 1, "MATERI
34070 41 4c 49 5a 45 20 25 75 22 2c 20 70 53 75 62 2d  ALIZE %u", pSub-
34080 3e 73 65 6c 49 64 29 29 3b 0a 20 20 20 20 20 20  >selId));.      
34090 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
340a0 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64  pParse, pSub, &d
340b0 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  est);.      }.  
340c0 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d      pItem->pTab-
340d0 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53  >nRowLogEst = pS
340e0 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  ub->nSelectRow;.
340f0 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64        if( onceAd
34100 64 72 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  dr ) sqlite3Vdbe
34110 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65  JumpHere(v, once
34120 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74  Addr);.      ret
34130 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
34140 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
34150 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65  eturn, pItem->re
34160 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
34170 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
34180 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d  "end %s", pItem-
34190 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
341a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
341b0 65 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70  eChangeP1(v, top
341c0 41 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a  Addr, retAddr);.
341d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65        sqlite3Cle
341e0 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70  arTempRegCache(p
341f0 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
34200 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
34210 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65  Failed ) goto se
34220 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70 50  lect_end;.    pP
34230 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d  arse->nHeight -=
34240 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
34250 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20 20  prHeight(p);.   
34260 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
34270 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75  ntext = zSavedAu
34280 74 68 43 6f 6e 74 65 78 74 3b 0a 23 65 6e 64 69  thContext;.#endi
34290 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 56 61 72 69  f.  }..  /* Vari
342a0 6f 75 73 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  ous elements of 
342b0 74 68 65 20 53 45 4c 45 43 54 20 63 6f 70 69 65  the SELECT copie
342c0 64 20 69 6e 74 6f 20 6c 6f 63 61 6c 20 76 61 72  d into local var
342d0 69 61 62 6c 65 73 20 66 6f 72 0a 20 20 2a 2a 20  iables for.  ** 
342e0 63 6f 6e 76 65 6e 69 65 6e 63 65 20 2a 2f 0a 20  convenience */. 
342f0 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
34300 69 73 74 3b 0a 20 20 70 57 68 65 72 65 20 3d 20  ist;.  pWhere = 
34310 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72  p->pWhere;.  pGr
34320 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
34330 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d  pBy;.  pHaving =
34340 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73   p->pHaving;.  s
34350 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
34360 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  = (p->selFlags &
34370 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
34380 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ;..#if SELECTTRA
34390 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
343a0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
343b0 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20  ace & 0x400 ){. 
343c0 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
343d0 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x400,pParse,p,("
343e0 41 66 74 65 72 20 61 6c 6c 20 46 52 4f 4d 2d 63  After all FROM-c
343f0 6c 61 75 73 65 20 61 6e 61 6c 79 73 69 73 3a 5c  lause analysis:\
34400 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n"));.    sqlite
34410 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
34420 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, p, 0);.  }.#e
34430 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
34440 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f  ITE_COUNTOFVIEW_
34450 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69  OPTIMIZATION.  i
34460 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  f( OptimizationE
34470 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
34480 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72  E_QueryFlattener
34490 7c 53 51 4c 49 54 45 5f 43 6f 75 6e 74 4f 66 56  |SQLITE_CountOfV
344a0 69 65 77 29 0a 20 20 20 26 26 20 63 6f 75 6e 74  iew).   && count
344b0 4f 66 56 69 65 77 4f 70 74 69 6d 69 7a 61 74 69  OfViewOptimizati
344c0 6f 6e 28 70 50 61 72 73 65 2c 20 70 29 0a 20 20  on(pParse, p).  
344d0 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  ){.    if( db->m
344e0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
344f0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
34500 20 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70     pEList = p->p
34510 45 4c 69 73 74 3b 0a 20 20 20 20 70 54 61 62 4c  EList;.    pTabL
34520 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
34530 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
34540 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  If the query is 
34550 44 49 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e  DISTINCT with an
34560 20 4f 52 44 45 52 20 42 59 20 62 75 74 20 69 73   ORDER BY but is
34570 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
34580 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20  e, and .  ** if 
34590 74 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20  the select-list 
345a0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
345b0 68 65 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74  he ORDER BY list
345c0 2c 20 74 68 65 6e 20 74 68 69 73 20 71 75 65 72  , then this quer
345d0 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65  y.  ** can be re
345e0 77 72 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f  written as a GRO
345f0 55 50 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20  UP BY. In other 
34600 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a  words, this:.  *
34610 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
34620 54 20 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46  T DISTINCT xyz F
34630 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59  ROM ... ORDER BY
34640 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69   xyz.  **.  ** i
34650 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f  s transformed to
34660 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
34670 53 45 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20  SELECT xyz FROM 
34680 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a  ... GROUP BY xyz
34690 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20   ORDER BY xyz.  
346a0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f  **.  ** The seco
346b0 6e 64 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65  nd form is prefe
346c0 72 72 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65  rred as a single
346d0 20 69 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d   index (or temp-
346e0 74 61 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20  table) may be . 
346f0 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74   ** used for bot
34700 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 61  h the ORDER BY a
34710 6e 64 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63  nd DISTINCT proc
34720 65 73 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69  essing. As origi
34730 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74  nally .  ** writ
34740 74 65 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75  ten the query mu
34750 73 74 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61  st use a temp-ta
34760 62 6c 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74  ble for at least
34770 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45   one of the ORDE
34780 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44  R .  ** BY and D
34790 49 53 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20  ISTINCT, and an 
347a0 69 6e 64 65 78 20 6f 72 20 73 65 70 61 72 61 74  index or separat
347b0 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72  e temp-table for
347c0 20 74 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f   the other..  */
347d0 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
347e0 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
347f0 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
34800 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a  )==SF_Distinct .
34810 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
34820 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 73 53 6f  rListCompare(sSo
34830 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 70 45 4c  rt.pOrderBy, pEL
34840 69 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b  ist, -1)==0.  ){
34850 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
34860 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74   &= ~SF_Distinct
34870 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d  ;.    pGroupBy =
34880 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73   p->pGroupBy = s
34890 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
348a0 70 28 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29  p(db, pEList, 0)
348b0 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20  ;.    /* Notice 
348c0 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68  that even though
348d0 74 20 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61  t SF_Distinct ha
348e0 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66  s been cleared f
348f0 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c  rom p->selFlags,
34900 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73  .    ** the sDis
34910 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20  tinct.isTnct is 
34920 73 74 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63  still set.  Henc
34930 65 2c 20 69 73 54 6e 63 74 20 72 65 70 72 65 73  e, isTnct repres
34940 65 6e 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  ents the.    ** 
34950 6f 72 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67  original setting
34960 20 6f 66 20 74 68 65 20 53 46 5f 44 69 73 74 69   of the SF_Disti
34970 6e 63 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68  nct flag, not th
34980 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e  e current settin
34990 67 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  g */.    assert(
349a0 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
349b0 74 20 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54  t );..#if SELECT
349c0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
349d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
349e0 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30  ectTrace & 0x400
349f0 20 29 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54   ){.      SELECT
34a00 54 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72  TRACE(0x400,pPar
34a10 73 65 2c 70 2c 28 22 54 72 61 6e 73 66 6f 72 6d  se,p,("Transform
34a20 20 44 49 53 54 49 4e 43 54 20 69 6e 74 6f 20 47   DISTINCT into G
34a30 52 4f 55 50 20 42 59 3a 5c 6e 22 29 29 3b 0a 20  ROUP BY:\n"));. 
34a40 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
34a50 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
34a60 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   0);.    }.#endi
34a70 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  f.  }..  /* If t
34a80 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
34a90 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
34aa0 20 63 72 65 61 74 65 20 61 6e 20 65 70 68 65 6d   create an ephem
34ab0 65 72 61 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20  eral index to.  
34ac0 2a 2a 20 64 6f 20 74 68 65 20 73 6f 72 74 69 6e  ** do the sortin
34ad0 67 2e 20 20 42 75 74 20 74 68 69 73 20 73 6f 72  g.  But this sor
34ae0 74 69 6e 67 20 65 70 68 65 6d 65 72 61 6c 20 69  ting ephemeral i
34af0 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75  ndex might end u
34b00 70 0a 20 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75  p.  ** being unu
34b10 73 65 64 20 69 66 20 74 68 65 20 64 61 74 61 20  sed if the data 
34b20 63 61 6e 20 62 65 20 65 78 74 72 61 63 74 65 64  can be extracted
34b30 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f   in pre-sorted o
34b40 72 64 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68  rder..  ** If th
34b50 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  at is the case, 
34b60 74 68 65 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e  then the OP_Open
34b70 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
34b80 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20  ction will be.  
34b90 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e  ** changed to an
34ba0 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65   OP_Noop once we
34bb0 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 61 74   figure out that
34bc0 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
34bd0 65 78 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e  ex is.  ** not n
34be0 65 65 64 65 64 2e 20 20 54 68 65 20 73 53 6f 72  eeded.  The sSor
34bf0 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  t.addrSortIndex 
34c00 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
34c10 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 0a 20   to facilitate. 
34c20 20 2a 2a 20 74 68 61 74 20 63 68 61 6e 67 65 2e   ** that change.
34c30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72  .  */.  if( sSor
34c40 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  t.pOrderBy ){.  
34c50 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
34c60 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  nfo;.    pKeyInf
34c70 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
34c80 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a  foFromExprList(.
34c90 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
34ca0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20  sSort.pOrderBy, 
34cb0 30 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  0, pEList->nExpr
34cc0 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 69 45 43  );.    sSort.iEC
34cd0 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
34ce0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72  nTab++;.    sSor
34cf0 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  t.addrSortIndex 
34d00 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  =.      sqlite3V
34d10 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
34d20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20  OpenEphemeral,. 
34d30 20 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 69           sSort.i
34d40 45 43 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70  ECursor, sSort.p
34d50 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31  OrderBy->nExpr+1
34d60 2b 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  +pEList->nExpr, 
34d70 30 2c 0a 20 20 20 20 20 20 20 20 20 20 28 63 68  0,.          (ch
34d80 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
34d90 5f 4b 45 59 49 4e 46 4f 0a 20 20 20 20 20 20 29  _KEYINFO.      )
34da0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
34db0 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
34dc0 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  ex = -1;.  }..  
34dd0 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74  /* If the output
34de0 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72   is destined for
34df0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
34e00 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61  le, open that ta
34e10 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
34e20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
34e30 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20  T_EphemTab ){.  
34e40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
34e50 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
34e60 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e  hemeral, pDest->
34e70 69 53 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d  iSDParm, pEList-
34e80 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  >nExpr);.  }..  
34e90 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74  /* Set the limit
34ea0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20  er..  */.  iEnd 
34eb0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
34ec0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 66 28  eLabel(v);.  if(
34ed0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
34ee0 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 29 3d 3d  SF_FixedLimit)==
34ef0 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c  0 ){.    p->nSel
34f00 65 63 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f  ectRow = 320;  /
34f10 2a 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73  * 4 billion rows
34f20 20 2a 2f 0a 20 20 7d 0a 20 20 63 6f 6d 70 75 74   */.  }.  comput
34f30 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
34f40 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29  pParse, p, iEnd)
34f50 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  ;.  if( p->iLimi
34f60 74 3d 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64  t==0 && sSort.ad
34f70 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29  drSortIndex>=0 )
34f80 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
34f90 65 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c  eChangeOpcode(v,
34fa0 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
34fb0 6e 64 65 78 2c 20 4f 50 5f 53 6f 72 74 65 72 4f  ndex, OP_SorterO
34fc0 70 65 6e 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e  pen);.    sSort.
34fd0 73 6f 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52  sortFlags |= SOR
34fe0 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 3b  TFLAG_UseSorter;
34ff0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
35000 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  an ephemeral ind
35010 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  ex to use for th
35020 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a  e distinct set..
35030 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65    */.  if( p->se
35040 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
35050 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73  inct ){.    sDis
35060 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20  tinct.tabTnct = 
35070 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
35080 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64      sDistinct.ad
35090 64 72 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33  drTnct = sqlite3
350a0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
350b0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a  _OpenEphemeral,.
350c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
350d0 20 20 20 20 20 20 20 73 44 69 73 74 69 6e 63 74         sDistinct
350e0 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20 30 2c 0a  .tabTnct, 0, 0,.
350f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35100 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71         (char*)sq
35110 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d  lite3KeyInfoFrom
35120 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
35130 20 70 2d 3e 70 45 4c 69 73 74 2c 30 2c 30 29 2c   p->pEList,0,0),
35140 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35150 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e          P4_KEYIN
35160 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  FO);.    sqlite3
35170 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
35180 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
35190 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  ;.    sDistinct.
351a0 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52  eTnctType = WHER
351b0 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44  E_DISTINCT_UNORD
351c0 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ERED;.  }else{. 
351d0 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e     sDistinct.eTn
351e0 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44  ctType = WHERE_D
351f0 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20  ISTINCT_NOOP;.  
35200 7d 0a 0a 20 20 69 66 28 20 21 69 73 41 67 67 20  }..  if( !isAgg 
35210 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  && pGroupBy==0 )
35220 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72  {.    /* No aggr
35230 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
35240 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  and no GROUP BY 
35250 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 75 31  clause */.    u1
35260 36 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 28  6 wctrlFlags = (
35270 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
35280 20 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   ? WHERE_WANT_DI
35290 53 54 49 4e 43 54 20 3a 20 30 29 0a 20 20 20 20  STINCT : 0).    
352a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
352b0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
352c0 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 29 3b 0a  SF_FixedLimit);.
352d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
352e0 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20  MIT_WINDOWFUNC. 
352f0 20 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 20     Window *pWin 
35300 3d 20 70 2d 3e 70 57 69 6e 3b 20 20 20 20 20 20  = p->pWin;      
35310 2f 2a 20 4d 61 73 74 65 72 20 77 69 6e 64 6f 77  /* Master window
35320 20 6f 62 6a 65 63 74 20 28 6f 72 20 4e 55 4c 4c   object (or NULL
35330 29 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 69  ) */.    if( pWi
35340 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  n ){.      sqlit
35350 65 33 57 69 6e 64 6f 77 43 6f 64 65 49 6e 69 74  e3WindowCodeInit
35360 28 70 50 61 72 73 65 2c 20 70 57 69 6e 29 3b 0a  (pParse, pWin);.
35370 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
35380 20 61 73 73 65 72 74 28 20 57 48 45 52 45 5f 55   assert( WHERE_U
35390 53 45 5f 4c 49 4d 49 54 3d 3d 53 46 5f 46 69 78  SE_LIMIT==SF_Fix
353a0 65 64 4c 69 6d 69 74 20 29 3b 0a 0a 0a 20 20 20  edLimit );...   
353b0 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61   /* Begin the da
353c0 74 61 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a  tabase scan. */.
353d0 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
353e0 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 57 68 65  1,pParse,p,("Whe
353f0 72 65 42 65 67 69 6e 5c 6e 22 29 29 3b 0a 20 20  reBegin\n"));.  
35400 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
35410 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
35420 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
35430 57 68 65 72 65 2c 20 73 53 6f 72 74 2e 70 4f 72  Where, sSort.pOr
35440 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20  derBy,.         
35450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35460 20 20 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 2c        p->pEList,
35470 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 70 2d 3e   wctrlFlags, p->
35480 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20  nSelectRow);.   
35490 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
354a0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
354b0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
354c0 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43  3WhereOutputRowC
354d0 6f 75 6e 74 28 70 57 49 6e 66 6f 29 20 3c 20 70  ount(pWInfo) < p
354e0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a  ->nSelectRow ){.
354f0 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
35500 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 57 68 65  Row = sqlite3Whe
35510 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74  reOutputRowCount
35520 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  (pWInfo);.    }.
35530 20 20 20 20 69 66 28 20 73 44 69 73 74 69 6e 63      if( sDistinc
35540 74 2e 69 73 54 6e 63 74 20 26 26 20 73 71 6c 69  t.isTnct && sqli
35550 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69 6e  te3WhereIsDistin
35560 63 74 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20  ct(pWInfo) ){.  
35570 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54      sDistinct.eT
35580 6e 63 74 54 79 70 65 20 3d 20 73 71 6c 69 74 65  nctType = sqlite
35590 33 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74  3WhereIsDistinct
355a0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  (pWInfo);.    }.
355b0 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f      if( sSort.pO
355c0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
355d0 73 53 6f 72 74 2e 6e 4f 42 53 61 74 20 3d 20 73  sSort.nOBSat = s
355e0 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64  qlite3WhereIsOrd
355f0 65 72 65 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  ered(pWInfo);.  
35600 20 20 20 20 73 53 6f 72 74 2e 62 4f 72 64 65 72      sSort.bOrder
35610 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 3d 20 73 71  edInnerLoop = sq
35620 6c 69 74 65 33 57 68 65 72 65 4f 72 64 65 72 65  lite3WhereOrdere
35630 64 49 6e 6e 65 72 4c 6f 6f 70 28 70 57 49 6e 66  dInnerLoop(pWInf
35640 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 53  o);.      if( sS
35650 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d 73 53 6f 72  ort.nOBSat==sSor
35660 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  t.pOrderBy->nExp
35670 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f  r ){.        sSo
35680 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  rt.pOrderBy = 0;
35690 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
356a0 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e      /* If sortin
356b0 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 61 73  g index that was
356c0 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
356d0 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  ior OP_OpenEphem
356e0 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73  eral .    ** ins
356f0 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75  truction ended u
35700 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64  p not being need
35710 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20  ed, then change 
35720 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  the OP_OpenEphem
35730 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  eral.    ** into
35740 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20   an OP_Noop..   
35750 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 53 6f 72   */.    if( sSor
35760 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e  t.addrSortIndex>
35770 3d 30 20 26 26 20 73 53 6f 72 74 2e 70 4f 72 64  =0 && sSort.pOrd
35780 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
35790 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
357a0 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72  geToNoop(v, sSor
357b0 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  t.addrSortIndex)
357c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
357d0 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 3d 3d  ert( p->pEList==
357e0 70 45 4c 69 73 74 20 29 3b 0a 23 69 66 6e 64 65  pEList );.#ifnde
357f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
35800 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 69 66 28  NDOWFUNC.    if(
35810 20 70 57 69 6e 20 29 7b 0a 20 20 20 20 20 20 69   pWin ){.      i
35820 6e 74 20 61 64 64 72 47 6f 73 75 62 20 3d 20 73  nt addrGosub = s
35830 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
35840 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e  bel(v);.      in
35850 74 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65  t iCont = sqlite
35860 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
35870 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 42 72  );.      int iBr
35880 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
35890 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
358a0 20 20 20 20 20 69 6e 74 20 72 65 67 47 6f 73 75       int regGosu
358b0 62 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  b = ++pParse->nM
358c0 65 6d 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  em;..      sqlit
358d0 65 33 57 69 6e 64 6f 77 43 6f 64 65 53 74 65 70  e3WindowCodeStep
358e0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 57 49 6e  (pParse, p, pWIn
358f0 66 6f 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64  fo, regGosub, ad
35900 64 72 47 6f 73 75 62 29 3b 0a 0a 20 20 20 20 20  drGosub);..     
35910 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
35920 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
35930 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
35940 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
35950 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
35960 47 6f 73 75 62 29 3b 0a 20 20 20 20 20 20 56 64  Gosub);.      Vd
35970 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
35980 2c 20 22 69 6e 6e 65 72 2d 6c 6f 6f 70 20 73 75  , "inner-loop su
35990 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
359a0 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
359b0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d 31  op(pParse, p, -1
359c0 2c 20 26 73 53 6f 72 74 2c 20 26 73 44 69 73 74  , &sSort, &sDist
359d0 69 6e 63 74 2c 20 70 44 65 73 74 2c 20 69 43 6f  inct, pDest, iCo
359e0 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  nt, iBreak);.   
359f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
35a00 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
35a10 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ont);.      sqli
35a20 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
35a30 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 47   OP_Return, regG
35a40 6f 73 75 62 29 3b 0a 20 20 20 20 20 20 56 64 62  osub);.      Vdb
35a50 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e  eComment((v, "en
35a60 64 20 69 6e 6e 65 72 2d 6c 6f 6f 70 20 73 75 62  d inner-loop sub
35a70 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20  routine"));.    
35a80 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
35a90 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
35aa0 65 61 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  eak);.    }else.
35ab0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
35ac0 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
35ad0 20 2a 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20 20   */.    {.      
35ae0 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64  /* Use the stand
35af0 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20  ard inner loop. 
35b00 2a 2f 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  */.      selectI
35b10 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
35b20 20 70 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20   p, -1, &sSort, 
35b30 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73  &sDistinct, pDes
35b40 74 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  t,.          sql
35b50 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75  ite3WhereContinu
35b60 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a  eLabel(pWInfo),.
35b70 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
35b80 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c  3WhereBreakLabel
35b90 28 70 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20  (pWInfo));..    
35ba0 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74    /* End the dat
35bb0 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  abase scan loop.
35bc0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
35bd0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
35be0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  pWInfo);.    }. 
35bf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
35c00 68 69 73 20 63 61 73 65 20 77 68 65 6e 20 74 68  his case when th
35c10 65 72 65 20 65 78 69 73 74 20 61 67 67 72 65 67  ere exist aggreg
35c20 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72  ate functions or
35c30 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
35c40 73 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74  se.    ** or bot
35c50 68 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e  h */.    NameCon
35c60 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20  text sNC;    /* 
35c70 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72  Name context for
35c80 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72   processing aggr
35c90 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f  egate informatio
35ca0 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d  n */.    int iAM
35cb0 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em;          /* 
35cc0 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73  First Mem addres
35cd0 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75  s for storing cu
35ce0 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a  rrent GROUP BY *
35cf0 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b  /.    int iBMem;
35d00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
35d10 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66  st Mem address f
35d20 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55  or previous GROU
35d30 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20  P BY */.    int 
35d40 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20  iUseFlag;       
35d50 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68  /* Mem address h
35d60 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69  olding flag indi
35d70 63 61 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c  cating that at l
35d80 65 61 73 74 0a 20 20 20 20 20 20 20 20 20 20 20  east.           
35d90 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
35da0 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69  one row of the i
35db0 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67 67 72  nput to the aggr
35dc0 65 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a  egator has been.
35dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35de0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
35df0 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ssed */.    int 
35e00 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20  iAbortFlag;     
35e10 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77  /* Mem address w
35e20 68 69 63 68 20 63 61 75 73 65 73 20 71 75 65 72  hich causes quer
35e30 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74  y abort if posit
35e40 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67  ive */.    int g
35e50 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f  roupBySort;    /
35e60 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d  * Rows come from
35e70 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50   source in GROUP
35e80 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20   BY order */.   
35e90 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20   int addrEnd;   
35ea0 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70       /* End of p
35eb0 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68  rocessing for th
35ec0 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20  is SELECT */.   
35ed0 20 69 6e 74 20 73 6f 72 74 50 54 61 62 20 3d 20   int sortPTab = 
35ee0 30 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61  0;   /* Pseudota
35ef0 62 6c 65 20 75 73 65 64 20 74 6f 20 64 65 63 6f  ble used to deco
35f00 64 65 20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c  de sorting resul
35f10 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f  ts */.    int so
35f20 72 74 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a  rtOut = 0;    /*
35f30 20 4f 75 74 70 75 74 20 72 65 67 69 73 74 65 72   Output register
35f40 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72   from the sorter
35f50 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 72 64 65   */.    int orde
35f60 72 42 79 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54  rByGrp = 0; /* T
35f70 72 75 65 20 69 66 20 74 68 65 20 47 52 4f 55 50  rue if the GROUP
35f80 20 42 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59   BY and ORDER BY
35f90 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 2a 2f   are the same */
35fa0 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ..    /* Remove 
35fb0 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61  any and all alia
35fc0 73 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20  ses between the 
35fd0 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74  result set and t
35fe0 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20  he.    ** GROUP 
35ff0 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a  BY clause..    *
36000 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
36010 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  By ){.      int 
36020 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
36030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
36040 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
36050 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
36060 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20  st_item *pItem; 
36070 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
36080 6f 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  over expression 
36090 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20  in a list */..  
360a0 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c      for(k=p->pEL
360b0 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  ist->nExpr, pIte
360c0 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20  m=p->pEList->a; 
360d0 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b  k>0; k--, pItem+
360e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65  +){.        pIte
360f0 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20  m->u.x.iAlias = 
36100 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
36110 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d   for(k=pGroupBy-
36120 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47  >nExpr, pItem=pG
36130 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20  roupBy->a; k>0; 
36140 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  k--, pItem++){. 
36150 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e         pItem->u.
36160 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  x.iAlias = 0;.  
36170 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
36180 72 74 28 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c  rt( 66==sqlite3L
36190 6f 67 45 73 74 28 31 30 30 29 20 29 3b 0a 20 20  ogEst(100) );.  
361a0 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65      if( p->nSele
361b0 63 74 52 6f 77 3e 36 36 20 29 20 70 2d 3e 6e 53  ctRow>66 ) p->nS
361c0 65 6c 65 63 74 52 6f 77 20 3d 20 36 36 3b 0a 20  electRow = 66;. 
361d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
361e0 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
361f0 65 33 4c 6f 67 45 73 74 28 31 29 20 29 3b 0a 20  e3LogEst(1) );. 
36200 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
36210 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  ow = 0;.    }.. 
36220 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
36230 73 20 62 6f 74 68 20 61 20 47 52 4f 55 50 20 42  s both a GROUP B
36240 59 20 61 6e 64 20 61 6e 20 4f 52 44 45 52 20 42  Y and an ORDER B
36250 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  Y clause and the
36260 79 20 61 72 65 0a 20 20 20 20 2a 2a 20 69 64 65  y are.    ** ide
36270 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20 69 74 20  ntical, then it 
36280 6d 61 79 20 62 65 20 70 6f 73 73 69 62 6c 65 20  may be possible 
36290 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 4f  to disable the O
362a0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 0a  RDER BY clause .
362b0 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 67 72      ** on the gr
362c0 6f 75 6e 64 73 20 74 68 61 74 20 74 68 65 20 47  ounds that the G
362d0 52 4f 55 50 20 42 59 20 77 69 6c 6c 20 63 61 75  ROUP BY will cau
362e0 73 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63  se elements to c
362f0 6f 6d 65 20 6f 75 74 20 0a 20 20 20 20 2a 2a 20  ome out .    ** 
36300 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f  in the correct o
36310 72 64 65 72 2e 20 49 74 20 61 6c 73 6f 20 6d 61  rder. It also ma
36320 79 20 6e 6f 74 20 2d 20 74 68 65 20 47 52 4f 55  y not - the GROU
36330 50 20 42 59 20 6d 69 67 68 74 20 75 73 65 20 61  P BY might use a
36340 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
36350 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 75 73   index that caus
36360 65 73 20 72 6f 77 73 20 74 6f 20 62 65 20 67 72  es rows to be gr
36370 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 20 61  ouped together a
36380 73 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 2a  s required.    *
36390 2a 20 62 75 74 20 6e 6f 74 20 61 63 74 75 61 6c  * but not actual
363a0 6c 79 20 73 6f 72 74 65 64 2e 20 45 69 74 68 65  ly sorted. Eithe
363b0 72 20 77 61 79 2c 20 72 65 63 6f 72 64 20 74 68  r way, record th
363c0 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65 0a  e fact that the.
363d0 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20      ** ORDER BY 
363e0 61 6e 64 20 47 52 4f 55 50 20 42 59 20 63 6c 61  and GROUP BY cla
363f0 75 73 65 73 20 61 72 65 20 74 68 65 20 73 61 6d  uses are the sam
36400 65 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  e by setting the
36410 20 6f 72 64 65 72 42 79 47 72 70 0a 20 20 20 20   orderByGrp.    
36420 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f  ** variable.  */
36430 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
36440 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
36450 70 47 72 6f 75 70 42 79 2c 20 73 53 6f 72 74 2e  pGroupBy, sSort.
36460 70 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30  pOrderBy, -1)==0
36470 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 42   ){.      orderB
36480 79 47 72 70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  yGrp = 1;.    }.
36490 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20   .    /* Create 
364a0 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  a label to jump 
364b0 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20  to when we want 
364c0 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75 65  to abort the que
364d0 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e  ry */.    addrEn
364e0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
364f0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
36500 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f    /* Convert TK_
36510 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74  COLUMN nodes int
36520 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  o TK_AGG_COLUMN 
36530 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73  and make entries
36540 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49   in.    ** sAggI
36550 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41  nfo for all TK_A
36560 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65  GG_FUNCTION node
36570 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  s in expressions
36580 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53   of the.    ** S
36590 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
365a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  .    */.    mems
365b0 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
365c0 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e  of(sNC));.    sN
365d0 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
365e0 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  e;.    sNC.pSrcL
365f0 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
36600 20 20 20 20 73 4e 43 2e 75 4e 43 2e 70 41 67 67      sNC.uNC.pAgg
36610 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f  Info = &sAggInfo
36620 3b 0a 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20  ;.    VVA_ONLY( 
36630 73 4e 43 2e 6e 63 46 6c 61 67 73 20 3d 20 4e 43  sNC.ncFlags = NC
36640 5f 55 41 67 67 49 6e 66 6f 3b 20 29 0a 20 20 20  _UAggInfo; ).   
36650 20 73 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 20   sAggInfo.mnReg 
36660 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
36670 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e  ;.    sAggInfo.n
36680 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20  SortingColumn = 
36690 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75  pGroupBy ? pGrou
366a0 70 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  pBy->nExpr : 0;.
366b0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72      sAggInfo.pGr
366c0 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
366d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
366e0 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
366f0 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20  &sNC, pEList);. 
36700 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
36710 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
36720 43 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  C, sSort.pOrderB
36730 79 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76  y);.    if( pHav
36740 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ing ){.      if(
36750 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
36760 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 68       assert( pWh
36770 65 72 65 3d 3d 70 2d 3e 70 57 68 65 72 65 20 29  ere==p->pWhere )
36780 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
36790 28 20 70 48 61 76 69 6e 67 3d 3d 70 2d 3e 70 48  ( pHaving==p->pH
367a0 61 76 69 6e 67 20 29 3b 0a 20 20 20 20 20 20 20  aving );.       
367b0 20 61 73 73 65 72 74 28 20 70 47 72 6f 75 70 42   assert( pGroupB
367c0 79 3d 3d 70 2d 3e 70 47 72 6f 75 70 42 79 20 29  y==p->pGroupBy )
367d0 3b 0a 20 20 20 20 20 20 20 20 68 61 76 69 6e 67  ;.        having
367e0 54 6f 57 68 65 72 65 28 70 50 61 72 73 65 2c 20  ToWhere(pParse, 
367f0 70 29 3b 0a 20 20 20 20 20 20 20 20 70 57 68 65  p);.        pWhe
36800 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  re = p->pWhere;.
36810 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
36820 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
36830 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c  Aggregates(&sNC,
36840 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d   pHaving);.    }
36850 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41  .    sAggInfo.nA
36860 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67  ccumulator = sAg
36870 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20  gInfo.nColumn;. 
36880 20 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70     if( p->pGroup
36890 42 79 3d 3d 30 20 26 26 20 70 2d 3e 70 48 61 76  By==0 && p->pHav
368a0 69 6e 67 3d 3d 30 20 26 26 20 73 41 67 67 49 6e  ing==0 && sAggIn
368b0 66 6f 2e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20  fo.nFunc==1 ){. 
368c0 20 20 20 20 20 6d 69 6e 4d 61 78 46 6c 61 67 20       minMaxFlag 
368d0 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 64 62  = minMaxQuery(db
368e0 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
368f0 5b 30 5d 2e 70 45 78 70 72 2c 20 26 70 4d 69 6e  [0].pExpr, &pMin
36900 4d 61 78 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  MaxOrderBy);.   
36910 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 69   }else{.      mi
36920 6e 4d 61 78 46 6c 61 67 20 3d 20 57 48 45 52 45  nMaxFlag = WHERE
36930 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b  _ORDERBY_NORMAL;
36940 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
36950 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
36960 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Func; i++){.    
36970 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
36980 61 73 50 72 6f 70 65 72 74 79 28 73 41 67 67 49  asProperty(sAggI
36990 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78  nfo.aFunc[i].pEx
369a0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
369b0 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e  ) );.      sNC.n
369c0 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41  cFlags |= NC_InA
369d0 67 67 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71  ggFunc;.      sq
369e0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
369f0 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41  AggList(&sNC, sA
36a00 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e  ggInfo.aFunc[i].
36a10 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b  pExpr->x.pList);
36a20 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61  .      sNC.ncFla
36a30 67 73 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46  gs &= ~NC_InAggF
36a40 75 6e 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  unc;.    }.    s
36a50 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 3d 20  AggInfo.mxReg = 
36a60 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
36a70 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
36a80 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65  Failed ) goto se
36a90 6c 65 63 74 5f 65 6e 64 3b 0a 23 69 66 20 53 45  lect_end;.#if SE
36aa0 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
36ab0 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  D.    if( sqlite
36ac0 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
36ad0 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  x400 ){.      in
36ae0 74 20 69 69 3b 0a 20 20 20 20 20 20 53 45 4c 45  t ii;.      SELE
36af0 43 54 54 52 41 43 45 28 30 78 34 30 30 2c 70 50  CTTRACE(0x400,pP
36b00 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 61  arse,p,("After a
36b10 67 67 72 65 67 61 74 65 20 61 6e 61 6c 79 73 69  ggregate analysi
36b20 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 73  s:\n"));.      s
36b30 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
36b40 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
36b50 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
36b60 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  i<sAggInfo.nColu
36b70 6d 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  mn; ii++){.     
36b80 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
36b90 72 69 6e 74 66 28 22 61 67 67 2d 63 6f 6c 75 6d  rintf("agg-colum
36ba0 6e 5b 25 64 5d 20 69 4d 65 6d 3d 25 64 5c 6e 22  n[%d] iMem=%d\n"
36bb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 69  ,.            ii
36bc0 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b  , sAggInfo.aCol[
36bd0 69 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20  ii].iMem);.     
36be0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
36bf0 65 77 45 78 70 72 28 30 2c 20 73 41 67 67 49 6e  ewExpr(0, sAggIn
36c00 66 6f 2e 61 43 6f 6c 5b 69 69 5d 2e 70 45 78 70  fo.aCol[ii].pExp
36c10 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r, 0);.      }. 
36c20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
36c30 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63  i<sAggInfo.nFunc
36c40 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
36c50 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
36c60 6e 74 66 28 22 61 67 67 2d 66 75 6e 63 5b 25 64  ntf("agg-func[%d
36c70 5d 3a 20 69 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20  ]: iMem=%d\n",. 
36c80 20 20 20 20 20 20 20 20 20 20 20 69 69 2c 20 73             ii, s
36c90 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 69  AggInfo.aFunc[ii
36ca0 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  ].iMem);.       
36cb0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
36cc0 45 78 70 72 28 30 2c 20 73 41 67 67 49 6e 66 6f  Expr(0, sAggInfo
36cd0 2e 61 46 75 6e 63 5b 69 69 5d 2e 70 45 78 70 72  .aFunc[ii].pExpr
36ce0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
36cf0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 20    }.#endif...   
36d00 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66   /* Processing f
36d10 6f 72 20 61 67 67 72 65 67 61 74 65 73 20 77 69  or aggregates wi
36d20 74 68 20 47 52 4f 55 50 20 42 59 20 69 73 20 76  th GROUP BY is v
36d30 65 72 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e  ery different an
36d40 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f  d.    ** much mo
36d50 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20  re complex than 
36d60 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68 6f  aggregates witho
36d70 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20  ut a GROUP BY.. 
36d80 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
36d90 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
36da0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
36db0 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e  o;  /* Keying in
36dc0 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
36dd0 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73  e group by claus
36de0 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  e */.      int a
36df0 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 2f  ddr1;          /
36e00 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69  * A-vs-B compari
36e10 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20  sion jump */.   
36e20 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75     int addrOutpu
36e30 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20  tRow;  /* Start 
36e40 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68  of subroutine th
36e50 61 74 20 6f 75 74 70 75 74 73 20 61 20 72 65 73  at outputs a res
36e60 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20  ult row */.     
36e70 20 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f   int regOutputRo
36e80 77 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61  w;   /* Return a
36e90 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
36ea0 66 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f  for output subro
36eb0 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69  utine */.      i
36ec0 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b  nt addrSetAbort;
36ed0 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62     /* Set the ab
36ee0 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74  ort flag and ret
36ef0 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  urn */.      int
36f00 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20   addrTopOfLoop; 
36f10 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
36f20 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  nput loop */.   
36f30 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69     int addrSorti
36f40 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50  ngIdx; /* The OP
36f50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66  _OpenEphemeral f
36f60 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  or the sorting i
36f70 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ndex */.      in
36f80 74 20 61 64 64 72 52 65 73 65 74 3b 20 20 20 20  t addrReset;    
36f90 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20    /* Subroutine 
36fa0 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74 68  for resetting th
36fb0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f  e accumulator */
36fc0 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65  .      int regRe
36fd0 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  set;       /* Re
36fe0 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
36ff0 69 73 74 65 72 20 66 6f 72 20 72 65 73 65 74 20  ister for reset 
37000 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20  subroutine */.. 
37010 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
37020 20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20 63   is a GROUP BY c
37030 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e  lause we might n
37040 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e  eed a sorting in
37050 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  dex to.      ** 
37060 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41  implement it.  A
37070 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72  llocate that sor
37080 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20  ting index now. 
37090 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74   If it turns out
370a0 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
370b0 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74  e do not need it
370c0 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20   after all, the 
370d0 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e  OP_SorterOpen in
370e0 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20  struction.      
370f0 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65  ** will be conve
37100 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70  rted into a Noop
37110 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  .  .      */.   
37120 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
37130 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d  ingIdx = pParse-
37140 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70  >nTab++;.      p
37150 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
37160 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  3KeyInfoFromExpr
37170 4c 69 73 74 28 70 50 61 72 73 65 2c 70 47 72 6f  List(pParse,pGro
37180 75 70 42 79 2c 30 2c 73 41 67 67 49 6e 66 6f 2e  upBy,0,sAggInfo.
37190 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
371a0 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d  addrSortingIdx =
371b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
371c0 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f  p4(v, OP_SorterO
371d0 70 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  pen, .          
371e0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
371f0 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53  Idx, sAggInfo.nS
37200 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20  ortingColumn, . 
37210 20 20 20 20 20 20 20 20 20 30 2c 20 28 63 68 61           0, (cha
37220 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
37230 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20 20 20  KEYINFO);..     
37240 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d   /* Initialize m
37250 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20  emory locations 
37260 75 73 65 64 20 62 79 20 47 52 4f 55 50 20 42 59  used by GROUP BY
37270 20 61 67 67 72 65 67 61 74 65 20 70 72 6f 63 65   aggregate proce
37280 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20  ssing.      */. 
37290 20 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20       iUseFlag = 
372a0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
372b0 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67        iAbortFlag
372c0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
372d0 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74 70  m;.      regOutp
372e0 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65  utRow = ++pParse
372f0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64  ->nMem;.      ad
37300 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71  drOutputRow = sq
37310 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
37320 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72 65 67  el(v);.      reg
37330 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65  Reset = ++pParse
37340 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64  ->nMem;.      ad
37350 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65  drReset = sqlite
37360 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
37370 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d  );.      iAMem =
37380 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
37390 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;.      pParse-
373a0 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42  >nMem += pGroupB
373b0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
373c0 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  iBMem = pParse->
373d0 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20  nMem + 1;.      
373e0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
373f0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
37400 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
37410 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
37420 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f 72  nteger, 0, iAbor
37430 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  tFlag);.      Vd
37440 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63  beComment((v, "c
37450 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22  lear abort flag"
37460 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
37470 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
37480 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d  P_Null, 0, iAMem
37490 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79  , iAMem+pGroupBy
374a0 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20  ->nExpr-1);..   
374b0 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f     /* Begin a lo
374c0 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74  op that will ext
374d0 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20  ract all source 
374e0 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59  rows in GROUP BY
374f0 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a   order..      **
37500 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f   This might invo
37510 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74 65  lve two separate
37520 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f   loops with an O
37530 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65  P_Sort in betwee
37540 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69  n, or.      ** i
37550 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e  t might be a sin
37560 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73  gle loop that us
37570 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65  es an index to e
37580 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69  xtract informati
37590 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  on.      ** in t
375a0 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20 74  he right order t
375b0 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20  o begin with..  
375c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
375d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
375e0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
375f0 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29  eset, addrReset)
37600 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  ;.      SELECTTR
37610 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28  ACE(1,pParse,p,(
37620 22 57 68 65 72 65 42 65 67 69 6e 5c 6e 22 29 29  "WhereBegin\n"))
37630 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d  ;.      pWInfo =
37640 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
37650 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
37660 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 47 72  ist, pWhere, pGr
37670 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20 20 20 20  oupBy, 0,.      
37680 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55 50 42      WHERE_GROUPB
37690 59 20 7c 20 28 6f 72 64 65 72 42 79 47 72 70 20  Y | (orderByGrp 
376a0 3f 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52  ? WHERE_SORTBYGR
376b0 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20 20 20 20  OUP : 0), 0.    
376c0 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70    );.      if( p
376d0 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
376e0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
376f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
37700 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
37710 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e  fo)==pGroupBy->n
37720 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
37730 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72  /* The optimizer
37740 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69   is able to deli
37750 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75  ver rows in grou
37760 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20  p by order so.  
37770 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e        ** we do n
37780 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e  ot have to sort.
37790 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68    The OP_OpenEph
377a0 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c  emeral table wil
377b0 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
377c0 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20  cancelled later 
377d0 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c  because we still
377e0 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65   need to use the
377f0 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20   pKeyInfo.      
37800 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f    */.        gro
37810 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20  upBySort = 0;.  
37820 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
37830 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63     /* Rows are c
37840 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64  oming out in und
37850 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e  etermined order.
37860 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73    We have to pus
37870 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63  h.        ** eac
37880 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72  h row into a sor
37890 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d  ting index, term
378a0 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20  inate the first 
378b0 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a  loop,.        **
378c0 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20   then loop over 
378d0 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
378e0 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  x in order to ge
378f0 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20  t the output.   
37900 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65       ** in sorte
37910 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20  d order.        
37920 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  */.        int r
37930 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  egBase;.        
37940 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20  int regRecord;. 
37950 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b         int nCol;
37960 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72  .        int nGr
37970 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20  oupBy;..        
37980 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
37990 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
379a0 20 20 20 20 20 20 28 73 44 69 73 74 69 6e 63 74        (sDistinct
379b0 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d 3e 73  .isTnct && (p->s
379c0 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73 74 69  elFlags&SF_Disti
379d0 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20  nct)==0) ?.     
379e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
379f0 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47 52 4f  DISTINCT" : "GRO
37a00 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20 20  UP BY");..      
37a10 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
37a20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75  1;.        nGrou
37a30 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e  pBy = pGroupBy->
37a40 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e  nExpr;.        n
37a50 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a  Col = nGroupBy;.
37a60 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f          j = nGro
37a70 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f  upBy;.        fo
37a80 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
37a90 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  o.nColumn; i++){
37aa0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
37ab0 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e  AggInfo.aCol[i].
37ac0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a  iSorterColumn>=j
37ad0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
37ae0 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nCol++;.        
37af0 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
37b00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
37b10 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d         regBase =
37b20 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
37b30 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f  ange(pParse, nCo
37b40 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
37b50 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
37b60 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  r(pParse);.     
37b70 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
37b80 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
37b90 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67  e, pGroupBy, reg
37ba0 42 61 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Base, 0, 0);.   
37bb0 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42       j = nGroupB
37bc0 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  y;.        for(i
37bd0 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
37be0 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
37bf0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
37c00 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
37c10 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f   = &sAggInfo.aCo
37c20 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[i];.          
37c30 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
37c40 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20  rColumn>=j ){.  
37c50 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31            int r1
37c60 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a   = j + regBase;.
37c70 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
37c80 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
37c90 6c 75 6d 6e 54 6f 52 65 67 28 70 50 61 72 73 65  lumnToReg(pParse
37ca0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
37cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37cc0 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43    pCol->pTab, pC
37cd0 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f  ol->iColumn, pCo
37ce0 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 29 3b 0a  l->iTable, r1);.
37cf0 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b              j++;
37d00 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
37d10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
37d20 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
37d30 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
37d40 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
37d50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
37d60 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
37d70 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c  , regBase, nCol,
37d80 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
37d90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
37da0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
37db0 74 65 72 49 6e 73 65 72 74 2c 20 73 41 67 67 49  terInsert, sAggI
37dc0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
37dd0 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  regRecord);.    
37de0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
37df0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
37e00 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
37e10 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
37e20 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
37e30 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
37e40 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
37e50 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
37e60 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  Info);.        s
37e70 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
37e80 64 78 50 54 61 62 20 3d 20 73 6f 72 74 50 54 61  dxPTab = sortPTa
37e90 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
37ea0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f 72 74  ++;.        sort
37eb0 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Out = sqlite3Get
37ec0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
37ed0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
37ee0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
37ef0 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72  _OpenPseudo, sor
37f00 74 50 54 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20  tPTab, sortOut, 
37f10 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
37f20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
37f30 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72  (v, OP_SorterSor
37f40 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  t, sAggInfo.sort
37f50 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e 64 29  ingIdx, addrEnd)
37f60 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
37f70 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f 55 50  mment((v, "GROUP
37f80 20 42 59 20 73 6f 72 74 22 29 29 3b 20 56 64 62   BY sort")); Vdb
37f90 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
37fa0 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 75        sAggInfo.u
37fb0 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 31  seSortingIdx = 1
37fc0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
37fd0 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
37fe0 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
37ff0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  }..      /* If t
38000 68 65 20 69 6e 64 65 78 20 6f 72 20 74 65 6d 70  he index or temp
38010 6f 72 61 72 79 20 74 61 62 6c 65 20 75 73 65 64  orary table used
38020 20 62 79 20 74 68 65 20 47 52 4f 55 50 20 42 59   by the GROUP BY
38030 20 73 6f 72 74 0a 20 20 20 20 20 20 2a 2a 20 77   sort.      ** w
38040 69 6c 6c 20 6e 61 74 75 72 61 6c 6c 79 20 64 65  ill naturally de
38050 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 74 68  liver rows in th
38060 65 20 6f 72 64 65 72 20 72 65 71 75 69 72 65 64  e order required
38070 20 62 79 20 74 68 65 20 4f 52 44 45 52 20 42 59   by the ORDER BY
38080 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65  .      ** clause
38090 2c 20 63 61 6e 63 65 6c 20 74 68 65 20 65 70 68  , cancel the eph
380a0 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6f 70 65  emeral table ope
380b0 6e 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 2e  n coded earlier.
380c0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
380d0 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  ** This is an op
380e0 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65  timization - the
380f0 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20   correct answer 
38100 73 68 6f 75 6c 64 20 72 65 73 75 6c 74 20 72 65  should result re
38110 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 20  gardless..      
38120 2a 2a 20 55 73 65 20 74 68 65 20 53 51 4c 49 54  ** Use the SQLIT
38130 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 20 66  E_GroupByOrder f
38140 6c 61 67 20 77 69 74 68 20 53 51 4c 49 54 45 5f  lag with SQLITE_
38150 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
38160 45 52 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  ER to .      ** 
38170 64 69 73 61 62 6c 65 20 74 68 69 73 20 6f 70 74  disable this opt
38180 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65  imization for te
38190 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20  sting purposes. 
381a0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 72   */.      if( or
381b0 64 65 72 42 79 47 72 70 20 26 26 20 4f 70 74 69  derByGrp && Opti
381c0 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
381d0 64 62 2c 20 53 51 4c 49 54 45 5f 47 72 6f 75 70  db, SQLITE_Group
381e0 42 79 4f 72 64 65 72 29 20 0a 20 20 20 20 20 20  ByOrder) .      
381f0 20 26 26 20 28 67 72 6f 75 70 42 79 53 6f 72 74   && (groupBySort
38200 20 7c 7c 20 73 71 6c 69 74 65 33 57 68 65 72 65   || sqlite3Where
38210 49 73 53 6f 72 74 65 64 28 70 57 49 6e 66 6f 29  IsSorted(pWInfo)
38220 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
38230 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42     sSort.pOrderB
38240 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  y = 0;.        s
38250 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
38260 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e  ToNoop(v, sSort.
38270 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a  addrSortIndex);.
38280 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
38290 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 63  * Evaluate the c
382a0 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
382b0 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20  terms and store 
382c0 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e  in b0, b1, b2...
382d0 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73  .      ** (b0 is
382e0 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
382f0 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20   iBMem+0, b1 is 
38300 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20  iBMem+1, and so 
38310 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20  forth).      ** 
38320 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65  Then compare the
38330 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
38340 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20  Y terms against 
38350 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72  the GROUP BY ter
38360 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d  ms.      ** from
38370 20 74 68 65