/ Hex Artifact Content
Login

Artifact 0671309c245ecb2b75d8b33948cbcf039325468aaedc13f37c8c4f3f62f48d5f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 75 2f 25 64 2f 25 70 3a 20 22 2c 28 53 29  "%u/%d/%p: ",(S)
02c0: 2d 3e 73 65 6c 49 64 2c 28 50 29 2d 3e 61 64 64  ->selId,(P)->add
02d0: 72 45 78 70 6c 61 69 6e 2c 28 53 29 29 2c 5c 0a  rExplain,(S)),\.
02e0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
02f0: 50 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23  Printf X.#else.#
0300: 20 64 65 66 69 6e 65 20 53 45 4c 45 43 54 54 52   define SELECTTR
0310: 41 43 45 28 4b 2c 50 2c 53 2c 58 29 0a 23 65 6e  ACE(K,P,S,X).#en
0320: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  dif.../*.** An i
0330: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
0340: 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20  ollowing object 
0350: 69 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72  is used to recor
0360: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  d information ab
0370: 6f 75 74 0a 2a 2a 20 68 6f 77 20 74 6f 20 70 72  out.** how to pr
0380: 6f 63 65 73 73 20 74 68 65 20 44 49 53 54 49 4e  ocess the DISTIN
0390: 43 54 20 6b 65 79 77 6f 72 64 2c 20 74 6f 20 73  CT keyword, to s
03a0: 69 6d 70 6c 69 66 79 20 70 61 73 73 69 6e 67 20  implify passing 
03b0: 74 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  that information
03c0: 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 65 6c  .** into the sel
03d0: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 72  ectInnerLoop() r
03e0: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64  outine..*/.typed
03f0: 65 66 20 73 74 72 75 63 74 20 44 69 73 74 69 6e  ef struct Distin
0400: 63 74 43 74 78 20 44 69 73 74 69 6e 63 74 43 74  ctCtx DistinctCt
0410: 78 3b 0a 73 74 72 75 63 74 20 44 69 73 74 69 6e  x;.struct Distin
0420: 63 74 43 74 78 20 7b 0a 20 20 75 38 20 69 73 54  ctCtx {.  u8 isT
0430: 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  nct;      /* Tru
0440: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
0450: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
0460: 73 65 6e 74 20 2a 2f 0a 20 20 75 38 20 65 54 6e  sent */.  u8 eTn
0470: 63 74 54 79 70 65 3b 20 20 20 2f 2a 20 4f 6e 65  ctType;   /* One
0480: 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 44 49   of the WHERE_DI
0490: 53 54 49 4e 43 54 5f 2a 20 6f 70 65 72 61 74 6f  STINCT_* operato
04a0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62 54  rs */.  int tabT
04b0: 6e 63 74 3b 20 20 20 20 2f 2a 20 45 70 68 65 6d  nct;    /* Ephem
04c0: 65 72 61 6c 20 74 61 62 6c 65 20 75 73 65 64 20  eral table used 
04d0: 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72 6f  for DISTINCT pro
04e0: 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  cessing */.  int
04f0: 20 61 64 64 72 54 6e 63 74 3b 20 20 20 2f 2a 20   addrTnct;   /* 
0500: 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70  Address of OP_Op
0510: 65 6e 45 70 68 65 6d 65 72 61 6c 20 6f 70 63 6f  enEphemeral opco
0520: 64 65 20 66 6f 72 20 74 61 62 54 6e 63 74 20 2a  de for tabTnct *
0530: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  /.};../*.** An i
0540: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
0550: 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20  ollowing object 
0560: 69 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72  is used to recor
0570: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  d information ab
0580: 6f 75 74 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52  out.** the ORDER
0590: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
05a0: 29 20 63 6c 61 75 73 65 20 6f 66 20 71 75 65 72  ) clause of quer
05b0: 79 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64  y is being coded
05c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 44 65 66  ..**.** The aDef
05d0: 65 72 5b 5d 20 61 72 72 61 79 20 69 73 20 75 73  er[] array is us
05e0: 65 64 20 62 79 20 74 68 65 20 73 6f 72 74 65 72  ed by the sorter
05f0: 2d 72 65 66 65 72 65 6e 63 65 73 20 6f 70 74 69  -references opti
0600: 6d 69 7a 61 74 69 6f 6e 2e 20 46 6f 72 0a 2a 2a  mization. For.**
0610: 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69   example, assumi
0620: 6e 67 20 74 68 65 72 65 20 69 73 20 6e 6f 20 69  ng there is no i
0630: 6e 64 65 78 20 74 68 61 74 20 63 61 6e 20 62 65  ndex that can be
0640: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 4f 52   used for the OR
0650: 44 45 52 20 42 59 2c 0a 2a 2a 20 66 6f 72 20 74  DER BY,.** for t
0660: 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  he query:.**.** 
0670: 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 69      SELECT a, bi
0680: 67 62 6c 6f 62 20 46 52 4f 4d 20 74 31 20 4f 52  gblob FROM t1 OR
0690: 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 31  DER BY a LIMIT 1
06a0: 30 3b 0a 2a 2a 0a 2a 2a 20 69 74 20 6d 61 79 20  0;.**.** it may 
06b0: 62 65 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  be more efficien
06c0: 74 20 74 6f 20 61 64 64 20 6a 75 73 74 20 74 68  t to add just th
06d0: 65 20 22 61 22 20 76 61 6c 75 65 73 20 74 6f 20  e "a" values to 
06e0: 74 68 65 20 73 6f 72 74 65 72 2c 20 61 6e 64 0a  the sorter, and.
06f0: 2a 2a 20 72 65 74 72 69 65 76 65 20 74 68 65 20  ** retrieve the 
0700: 61 73 73 6f 63 69 61 74 65 64 20 22 62 69 67 62  associated "bigb
0710: 6c 6f 62 22 20 76 61 6c 75 65 73 20 64 69 72 65  lob" values dire
0720: 63 74 6c 79 20 66 72 6f 6d 20 74 61 62 6c 65 20  ctly from table 
0730: 74 31 20 61 73 20 74 68 65 0a 2a 2a 20 31 30 20  t1 as the.** 10 
0740: 73 6d 61 6c 6c 65 73 74 20 22 61 22 20 76 61 6c  smallest "a" val
0750: 75 65 73 20 61 72 65 20 65 78 74 72 61 63 74 65  ues are extracte
0760: 64 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65  d from the sorte
0770: 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  r..**.** When th
0780: 65 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e  e sorter-referen
0790: 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ce optimization 
07a0: 69 73 20 75 73 65 64 2c 20 74 68 65 72 65 20 69  is used, there i
07b0: 73 20 6f 6e 65 20 65 6e 74 72 79 20 69 6e 20 74  s one entry in t
07c0: 68 65 0a 2a 2a 20 61 44 65 66 65 72 5b 5d 20 61  he.** aDefer[] a
07d0: 72 72 61 79 20 66 6f 72 20 65 61 63 68 20 64 61  rray for each da
07e0: 74 61 62 61 73 65 20 74 61 62 6c 65 20 74 68 61  tabase table tha
07f0: 74 20 6d 61 79 20 62 65 20 72 65 61 64 20 61 73  t may be read as
0800: 20 76 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 65   values are.** e
0810: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
0820: 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 74 79 70  e sorter..*/.typ
0830: 65 64 65 66 20 73 74 72 75 63 74 20 53 6f 72 74  edef struct Sort
0840: 43 74 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72  Ctx SortCtx;.str
0850: 75 63 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20  uct SortCtx {.  
0860: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
0870: 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By;   /* The ORD
0880: 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20  ER BY (or GROUP 
0890: 42 59 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20  BY clause) */.  
08a0: 69 6e 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20  int nOBSat;     
08b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
08c0: 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  of ORDER BY term
08d0: 73 20 73 61 74 69 73 66 69 65 64 20 62 79 20 69  s satisfied by i
08e0: 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
08f0: 69 45 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20  iECursor;       
0900: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
0910: 65 72 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65  er for the sorte
0920: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  r */.  int regRe
0930: 74 75 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20  turn;        /* 
0940: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
0950: 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65   block-output re
0960: 74 75 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a  turn address */.
0970: 20 20 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74    int labelBkOut
0980: 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74  ;       /* Start
0990: 20 6c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62   label for the b
09a0: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72  lock-output subr
09b0: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
09c0: 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20  addrSortIndex;  
09d0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
09e0: 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  the OP_SorterOpe
09f0: 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65  n or OP_OpenEphe
0a00: 6d 65 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6c  meral */.  int l
0a10: 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20  abelDone;       
0a20: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68   /* Jump here wh
0a30: 65 6e 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49 4d  en done, ex: LIM
0a40: 49 54 20 72 65 61 63 68 65 64 20 2a 2f 0a 20 20  IT reached */.  
0a50: 69 6e 74 20 6c 61 62 65 6c 4f 42 4c 6f 70 74 3b  int labelOBLopt;
0a60: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
0a70: 72 65 20 77 68 65 6e 20 73 6f 72 74 65 72 20 69  re when sorter i
0a80: 73 20 66 75 6c 6c 20 2a 2f 0a 20 20 75 38 20 73  s full */.  u8 s
0a90: 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20 20 20  ortFlags;       
0aa0: 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72    /* Zero or mor
0ab0: 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62 69 74  e SORTFLAG_* bit
0ac0: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
0ad0: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
0ae0: 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 75 38  _REFERENCES.  u8
0af0: 20 6e 44 65 66 65 72 3b 20 20 20 20 20 20 20 20   nDefer;        
0b00: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0b10: 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69   valid entries i
0b20: 6e 20 61 44 65 66 65 72 5b 5d 20 2a 2f 0a 20 20  n aDefer[] */.  
0b30: 73 74 72 75 63 74 20 44 65 66 65 72 72 65 64 43  struct DeferredC
0b40: 73 72 20 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  sr {.    Table *
0b50: 70 54 61 62 3b 20 20 20 20 20 20 20 20 2f 2a 20  pTab;        /* 
0b60: 54 61 62 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e  Table definition
0b70: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 73 72   */.    int iCsr
0b80: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
0b90: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
0ba0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e   table */.    in
0bb0: 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20 20  t nKey;         
0bc0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50    /* Number of P
0bd0: 4b 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 61  K columns for ta
0be0: 62 6c 65 20 70 54 61 62 20 28 3e 3d 31 29 20 2a  ble pTab (>=1) *
0bf0: 2f 0a 20 20 7d 20 61 44 65 66 65 72 5b 34 5d 3b  /.  } aDefer[4];
0c00: 0a 23 65 6e 64 69 66 0a 20 20 73 74 72 75 63 74  .#endif.  struct
0c10: 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20 2a 70 44   RowLoadInfo *pD
0c20: 65 66 65 72 72 65 64 52 6f 77 4c 6f 61 64 3b 20  eferredRowLoad; 
0c30: 20 2f 2a 20 44 65 66 65 72 72 65 64 20 72 6f 77   /* Deferred row
0c40: 20 6c 6f 61 64 69 6e 67 20 69 6e 66 6f 20 6f 72   loading info or
0c50: 20 4e 55 4c 4c 20 2a 2f 0a 7d 3b 0a 23 64 65 66   NULL */.};.#def
0c60: 69 6e 65 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  ine SORTFLAG_Use
0c70: 53 6f 72 74 65 72 20 20 30 78 30 31 20 20 20 2f  Sorter  0x01   /
0c80: 2a 20 55 73 65 20 53 6f 72 74 65 72 4f 70 65 6e  * Use SorterOpen
0c90: 20 69 6e 73 74 65 61 64 20 6f 66 20 4f 70 65 6e   instead of Open
0ca0: 45 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a  Ephemeral */../*
0cb0: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 74  .** Delete all t
0cc0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
0cd0: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0ce0: 2e 20 20 44 65 61 6c 6c 6f 63 61 74 65 20 74 68  .  Deallocate th
0cf0: 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69  e structure.** i
0d00: 74 73 65 6c 66 20 6f 6e 6c 79 20 69 66 20 62 46  tself only if bF
0d10: 72 65 65 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a  ree is true..*/.
0d20: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61  static void clea
0d30: 72 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 20  rSelect(sqlite3 
0d40: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  *db, Select *p, 
0d50: 69 6e 74 20 62 46 72 65 65 29 7b 0a 20 20 77 68  int bFree){.  wh
0d60: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 53 65  ile( p ){.    Se
0d70: 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70  lect *pPrior = p
0d80: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 73 71  ->pPrior;.    sq
0d90: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
0da0: 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  ete(db, p->pELis
0db0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  t);.    sqlite3S
0dc0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
0dd0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 73   p->pSrc);.    s
0de0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
0df0: 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b  (db, p->pWhere);
0e00: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0e10: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
0e20: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
0e30: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
0e40: 74 65 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  te(db, p->pHavin
0e50: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  g);.    sqlite3E
0e60: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
0e70: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
0e80: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
0e90: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
0ea0: 6d 69 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  mit);.#ifndef SQ
0eb0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
0ec0: 46 55 4e 43 0a 20 20 20 20 69 66 28 20 4f 4b 5f  FUNC.    if( OK_
0ed0: 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70  IF_ALWAYS_TRUE(p
0ee0: 2d 3e 70 57 69 6e 44 65 66 6e 29 20 29 7b 0a 20  ->pWinDefn) ){. 
0ef0: 20 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64       sqlite3Wind
0f00: 6f 77 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  owListDelete(db,
0f10: 20 70 2d 3e 70 57 69 6e 44 65 66 6e 29 3b 0a 20   p->pWinDefn);. 
0f20: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
0f30: 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53  if( OK_IF_ALWAYS
0f40: 5f 54 52 55 45 28 70 2d 3e 70 57 69 74 68 29 20  _TRUE(p->pWith) 
0f50: 29 20 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c  ) sqlite3WithDel
0f60: 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69 74 68  ete(db, p->pWith
0f70: 29 3b 0a 20 20 20 20 69 66 28 20 62 46 72 65 65  );.    if( bFree
0f80: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
0f90: 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70  NN(db, p);.    p
0fa0: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 62   = pPrior;.    b
0fb0: 46 72 65 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  Free = 1;.  }.}.
0fc0: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
0fd0: 65 20 61 20 53 65 6c 65 63 74 44 65 73 74 20 73  e a SelectDest s
0fe0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69  tructure..*/.voi
0ff0: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  d sqlite3SelectD
1000: 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74 44 65  estInit(SelectDe
1010: 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74 20 65  st *pDest, int e
1020: 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29  Dest, int iParm)
1030: 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74  {.  pDest->eDest
1040: 20 3d 20 28 75 38 29 65 44 65 73 74 3b 0a 20 20   = (u8)eDest;.  
1050: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 3d  pDest->iSDParm =
1060: 20 69 50 61 72 6d 3b 0a 20 20 70 44 65 73 74 2d   iParm;.  pDest-
1070: 3e 7a 41 66 66 53 64 73 74 20 3d 20 30 3b 0a 20  >zAffSdst = 0;. 
1080: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
1090: 30 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73  0;.  pDest->nSds
10a0: 74 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t = 0;.}.../*.**
10b0: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
10c0: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
10d0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
10e0: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
10f0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
1100: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
1110: 6c 65 63 74 4e 65 77 28 0a 20 20 50 61 72 73 65  lectNew(.  Parse
1120: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1130: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1140: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
1150: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 2f  t *pEList,     /
1160: 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20  * which columns 
1170: 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68  to include in th
1180: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 53 72  e result */.  Sr
1190: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
11a0: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
11b0: 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68 20  clause -- which 
11c0: 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20 2a  tables to scan *
11d0: 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
11e0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  ,         /* the
11f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1200: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
1210: 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65 20  oupBy,   /* the 
1220: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
1230: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
1240: 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  ng,        /* th
1250: 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  e HAVING clause 
1260: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1270: 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74 68  OrderBy,   /* th
1280: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1290: 65 20 2a 2f 0a 20 20 75 33 32 20 73 65 6c 46 6c  e */.  u32 selFl
12a0: 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ags,         /* 
12b0: 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 73 2c  Flag parameters,
12c0: 20 73 75 63 68 20 61 73 20 53 46 5f 44 69 73 74   such as SF_Dist
12d0: 69 6e 63 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  inct */.  Expr *
12e0: 70 4c 69 6d 69 74 20 20 20 20 20 20 20 20 20 20  pLimit          
12f0: 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20  /* LIMIT value. 
1300: 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 74 20   NULL means not 
1310: 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  used */.){.  Sel
1320: 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c  ect *pNew;.  Sel
1330: 65 63 74 20 73 74 61 6e 64 69 6e 3b 0a 20 20 70  ect standin;.  p
1340: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
1350: 61 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61 72 73  allocRawNN(pPars
1360: 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  e->db, sizeof(*p
1370: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
1380: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ew==0 ){.    ass
1390: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
13a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
13b0: 0a 20 20 20 20 70 4e 65 77 20 3d 20 26 73 74 61  .    pNew = &sta
13c0: 6e 64 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndin;.  }.  if( 
13d0: 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  pEList==0 ){.   
13e0: 20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65   pEList = sqlite
13f0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
1400: 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20  pParse, 0,.     
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1430: 6c 69 74 65 33 45 78 70 72 28 70 50 61 72 73 65  lite3Expr(pParse
1440: 2d 3e 64 62 2c 54 4b 5f 41 53 54 45 52 49 53 4b  ->db,TK_ASTERISK
1450: 2c 30 29 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  ,0));.  }.  pNew
1460: 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73  ->pEList = pELis
1470: 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20  t;.  pNew->op = 
1480: 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 4e 65  TK_SELECT;.  pNe
1490: 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 73 65  w->selFlags = se
14a0: 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e  lFlags;.  pNew->
14b0: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e  iLimit = 0;.  pN
14c0: 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b  ew->iOffset = 0;
14d0: 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 49 64 20 3d  .  pNew->selId =
14e0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65   ++pParse->nSele
14f0: 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  ct;.  pNew->addr
1500: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31  OpenEphm[0] = -1
1510: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
1520: 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a  enEphm[1] = -1;.
1530: 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52    pNew->nSelectR
1540: 6f 77 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53  ow = 0;.  if( pS
1550: 72 63 3d 3d 30 20 29 20 70 53 72 63 20 3d 20 73  rc==0 ) pSrc = s
1560: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1570: 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
1580: 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20  izeof(*pSrc));. 
1590: 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53   pNew->pSrc = pS
15a0: 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65  rc;.  pNew->pWhe
15b0: 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70  re = pWhere;.  p
15c0: 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
15d0: 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77  pGroupBy;.  pNew
15e0: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76  ->pHaving = pHav
15f0: 69 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  ing;.  pNew->pOr
1600: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
1610: 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
1620: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e   = 0;.  pNew->pN
1630: 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ext = 0;.  pNew-
1640: 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
1650: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74 68 20  ;.  pNew->pWith 
1660: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
1670: 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
1680: 55 4e 43 0a 20 20 70 4e 65 77 2d 3e 70 57 69 6e  UNC.  pNew->pWin
1690: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 57   = 0;.  pNew->pW
16a0: 69 6e 44 65 66 6e 20 3d 20 30 3b 0a 23 65 6e 64  inDefn = 0;.#end
16b0: 69 66 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  if.  if( pParse-
16c0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
16d0: 64 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53  d ) {.    clearS
16e0: 65 6c 65 63 74 28 70 50 61 72 73 65 2d 3e 64 62  elect(pParse->db
16f0: 2c 20 70 4e 65 77 2c 20 70 4e 65 77 21 3d 26 73  , pNew, pNew!=&s
1700: 74 61 6e 64 69 6e 29 3b 0a 20 20 20 20 70 4e 65  tandin);.    pNe
1710: 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w = 0;.  }else{.
1720: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
1730: 2d 3e 70 53 72 63 21 3d 30 20 7c 7c 20 70 50 61  ->pSrc!=0 || pPa
1740: 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a 20  rse->nErr>0 );. 
1750: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65   }.  assert( pNe
1760: 77 21 3d 26 73 74 61 6e 64 69 6e 20 29 3b 0a 20  w!=&standin );. 
1770: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
1780: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
1790: 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63 74 20  he given Select 
17a0: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c  structure and al
17b0: 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74 72 75  l of its substru
17c0: 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ctures..*/.void 
17d0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
17e0: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
17f0: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
1800: 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f  f( OK_IF_ALWAYS_
1810: 54 52 55 45 28 70 29 20 29 20 63 6c 65 61 72 53  TRUE(p) ) clearS
1820: 65 6c 65 63 74 28 64 62 2c 20 70 2c 20 31 29 3b  elect(db, p, 1);
1830: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1840: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1850: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c  e right-most SEL
1860: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ECT statement in
1870: 20 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a   a compound..*/.
1880: 73 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 66  static Select *f
1890: 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 53 65 6c  indRightmost(Sel
18a0: 65 63 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65  ect *p){.  while
18b0: 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 20 3d  ( p->pNext ) p =
18c0: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74   p->pNext;.  ret
18d0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
18e0: 47 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65  Given 1 to 3 ide
18f0: 6e 74 69 66 69 65 72 73 20 70 72 65 63 65 64 69  ntifiers precedi
1900: 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77  ng the JOIN keyw
1910: 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74  ord, determine t
1920: 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f  he.** type of jo
1930: 69 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  in.  Return an i
1940: 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
1950: 74 68 61 74 20 65 78 70 72 65 73 73 65 73 20 74  that expresses t
1960: 68 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74  hat type.** in t
1970: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c  erms of the foll
1980: 6f 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73  owing bit values
1990: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49  :.**.**     JT_I
19a0: 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43  NNER.**     JT_C
19b0: 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f  ROSS.**     JT_O
19c0: 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e  UTER.**     JT_N
19d0: 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54  ATURAL.**     JT
19e0: 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f  _LEFT.**     JT_
19f0: 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75  RIGHT.**.** A fu
1a00: 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73  ll outer join is
1a10: 20 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e   the combination
1a20: 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20   of JT_LEFT and 
1a30: 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20  JT_RIGHT..**.** 
1a40: 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72  If an illegal or
1a50: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
1a60: 6e 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20  n type is seen, 
1a70: 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72  then still retur
1a80: 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65  n.** a join type
1a90: 2c 20 62 75 74 20 70 75 74 20 61 6e 20 65 72 72  , but put an err
1aa0: 6f 72 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  or in the pParse
1ab0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69   structure..*/.i
1ac0: 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79  nt sqlite3JoinTy
1ad0: 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pe(Parse *pParse
1ae0: 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b  , Token *pA, Tok
1af0: 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70  en *pB, Token *p
1b00: 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79  C){.  int jointy
1b10: 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20  pe = 0;.  Token 
1b20: 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b  *apAll[3];.  Tok
1b30: 65 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 20  en *p;.         
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b50: 20 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35 36      /*   0123456
1b60: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
1b70: 33 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a 20  3456789 123 */. 
1b80: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
1b90: 61 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20  ar zKeyText[] = 
1ba0: 22 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65 72  "naturaleftouter
1bb0: 69 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f  ightfullinnercro
1bc0: 73 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  ss";.  static co
1bd0: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
1be0: 20 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f 2a   u8 i;        /*
1bf0: 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65   Beginning of ke
1c00: 79 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a 4b  yword text in zK
1c10: 65 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20  eyText[] */.    
1c20: 75 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20  u8 nChar;    /* 
1c30: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65  Length of the ke
1c40: 79 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63 74  yword in charact
1c50: 65 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f  ers */.    u8 co
1c60: 64 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20  de;     /* Join 
1c70: 74 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d  type mask */.  }
1c80: 20 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a   aKeyword[] = {.
1c90: 20 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a      /* natural *
1ca0: 2f 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41  / { 0,  7, JT_NA
1cb0: 54 55 52 41 4c 20 20 20 20 20 20 20 20 20 20 20  TURAL           
1cc0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c       },.    /* l
1cd0: 65 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20  eft    */ { 6,  
1ce0: 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55  4, JT_LEFT|JT_OU
1cf0: 54 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  TER          },.
1d00: 20 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a      /* outer   *
1d10: 2f 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55  / { 10, 5, JT_OU
1d20: 54 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  TER             
1d30: 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72       },.    /* r
1d40: 69 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20  ight   */ { 14, 
1d50: 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  5, JT_RIGHT|JT_O
1d60: 55 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c 0a  UTER         },.
1d70: 20 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a      /* full    *
1d80: 2f 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45  / { 19, 4, JT_LE
1d90: 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  FT|JT_RIGHT|JT_O
1da0: 55 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69  UTER },.    /* i
1db0: 6e 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20  nner   */ { 23, 
1dc0: 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20  5, JT_INNER     
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
1de0: 20 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a      /* cross   *
1df0: 2f 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e  / { 28, 5, JT_IN
1e00: 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20  NER|JT_CROSS    
1e10: 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69       },.  };.  i
1e20: 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c  nt i, j;.  apAll
1e30: 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c  [0] = pA;.  apAl
1e40: 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41  l[1] = pB;.  apA
1e50: 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f  ll[2] = pC;.  fo
1e60: 72 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70  r(i=0; i<3 && ap
1e70: 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  All[i]; i++){.  
1e80: 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a    p = apAll[i];.
1e90: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41      for(j=0; j<A
1ea0: 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72  rraySize(aKeywor
1eb0: 64 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  d); j++){.      
1ec0: 69 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f  if( p->n==aKeywo
1ed0: 72 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20  rd[j].nChar .   
1ee0: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
1ef0: 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a  3StrNICmp((char*
1f00: 29 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74  )p->z, &zKeyText
1f10: 5b 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c  [aKeyword[j].i],
1f20: 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20   p->n)==0 ){.   
1f30: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
1f40: 20 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64   aKeyword[j].cod
1f50: 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
1f60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f70: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d      testcase( j=
1f80: 3d 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d  =0 || j==1 || j=
1f90: 3d 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d  =2 || j==3 || j=
1fa0: 3d 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d  =4 || j==5 || j=
1fb0: 3d 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e  =6 );.    if( j>
1fc0: 3d 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77  =ArraySize(aKeyw
1fd0: 6f 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f  ord) ){.      jo
1fe0: 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52  intype |= JT_ERR
1ff0: 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
2000: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2010: 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20  .     (jointype 
2020: 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  & (JT_INNER|JT_O
2030: 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45  UTER))==(JT_INNE
2040: 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20  R|JT_OUTER) ||. 
2050: 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20      (jointype & 
2060: 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29  JT_ERROR)!=0.  )
2070: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2080: 20 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20 20   *zSp = " ";.   
2090: 20 61 73 73 65 72 74 28 20 70 42 21 3d 30 20 29   assert( pB!=0 )
20a0: 3b 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20  ;.    if( pC==0 
20b0: 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20  ){ zSp++; }.    
20c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
20d0: 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
20e0: 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20   or unsupported 
20f0: 6a 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20  join type: ".   
2100: 20 20 20 20 22 25 54 20 25 54 25 73 25 54 22 2c      "%T %T%s%T",
2110: 20 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43   pA, pB, zSp, pC
2120: 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  );.    jointype 
2130: 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65  = JT_INNER;.  }e
2140: 6c 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79 70  lse if( (jointyp
2150: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
2160: 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 6a   .         && (j
2170: 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45  ointype & (JT_LE
2180: 46 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a  FT|JT_RIGHT))!=J
2190: 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73 71  T_LEFT ){.    sq
21a0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
21b0: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49  arse, .      "RI
21c0: 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54  GHT and FULL OUT
21d0: 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74  ER JOINs are not
21e0: 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f   currently suppo
21f0: 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e  rted");.    join
2200: 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b  type = JT_INNER;
2210: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f  .  }.  return jo
2220: 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  intype;.}../*.**
2230: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
2240: 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  x of a column in
2250: 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72   a table.  Retur
2260: 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75  n -1 if the colu
2270: 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e  mn.** is not con
2280: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61  tained in the ta
2290: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
22a0: 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54  nt columnIndex(T
22b0: 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73  able *pTab, cons
22c0: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20  t char *zCol){. 
22d0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
22e0: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
22f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
2300: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54  qlite3StrICmp(pT
2310: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
2320: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65  e, zCol)==0 ) re
2330: 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
2340: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
2350: 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 69 72  * Search the fir
2360: 73 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20 70  st N tables in p
2370: 53 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74  Src, from left t
2380: 6f 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67  o right, looking
2390: 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20   for a.** table 
23a0: 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75 6d  that has a colum
23b0: 6e 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a  n named zCol.  .
23c0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64  **.** When found
23d0: 2c 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e 64  , set *piTab and
23e0: 20 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20 74   *piCol to the t
23f0: 61 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20 63  able index and c
2400: 6f 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f  olumn index.** o
2410: 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63  f the matching c
2420: 6f 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e  olumn and return
2430: 20 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   TRUE..**.** If 
2440: 6e 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75 72  not found, retur
2450: 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74  n FALSE..*/.stat
2460: 69 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64 43  ic int tableAndC
2470: 6f 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72  olumnIndex(.  Sr
2480: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
2490: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74     /* Array of t
24a0: 61 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68 20  ables to search 
24b0: 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
24c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
24d0: 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ber of tables in
24e0: 20 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65   pSrc->a[] to se
24f0: 61 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  arch */.  const 
2500: 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f  char *zCol,    /
2510: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
2520: 6c 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b  lumn we are look
2530: 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  ing for */.  int
2540: 20 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20 20   *piTab,        
2550: 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78    /* Write index
2560: 20 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65   of pSrc->a[] he
2570: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43  re */.  int *piC
2580: 6f 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ol           /* 
2590: 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70  Write index of p
25a0: 53 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70  Src->a[*piTab].p
25b0: 54 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65  Tab->aCol[] here
25c0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25e0: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
25f0: 72 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  r tables in pSrc
2600: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20   */.  int iCol; 
2610: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2620: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61  dex of column ma
2630: 74 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a  tching zCol */..
2640: 20 20 61 73 73 65 72 74 28 20 28 70 69 54 61 62    assert( (piTab
2650: 3d 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29  ==0)==(piCol==0)
2660: 20 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20   );  /* Both or 
2670: 6e 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c 4c  neither are NULL
2680: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
2690: 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43  <N; i++){.    iC
26a0: 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78  ol = columnIndex
26b0: 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62  (pSrc->a[i].pTab
26c0: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28  , zCol);.    if(
26d0: 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20   iCol>=0 ){.    
26e0: 20 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a 20    if( piTab ){. 
26f0: 20 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d 20         *piTab = 
2700: 69 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f  i;.        *piCo
2710: 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  l = iCol;.      
2720: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  }.      return 1
2730: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2740: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2750: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2760: 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 74 65  s used to add te
2770: 72 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20 4a  rms implied by J
2780: 4f 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74 68  OIN syntax to th
2790: 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
27a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  e expression of 
27b0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
27c0: 6e 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72 6d  nt. The new term
27d0: 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e  , which.** is AN
27e0: 44 65 64 20 77 69 74 68 20 74 68 65 20 65 78 69  Ded with the exi
27f0: 73 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61 75  sting WHERE clau
2800: 73 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66 6f  se, is of the fo
2810: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61  rm:.**.**    (ta
2820: 62 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63  b1.col1 = tab2.c
2830: 6f 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  ol2).**.** where
2840: 20 74 61 62 31 20 69 73 20 74 68 65 20 69 53 72   tab1 is the iSr
2850: 63 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53 72  c'th table in Sr
2860: 63 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20 74  cList pSrc and t
2870: 61 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20 28  ab2 is the .** (
2880: 69 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75  iSrc+1)'th. Colu
2890: 6d 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d  mn col1 is colum
28a0: 6e 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61  n iColLeft of ta
28b0: 62 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a  b1, and col2 is.
28c0: 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69  ** column iColRi
28d0: 67 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a  ght of tab2..*/.
28e0: 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57  static void addW
28f0: 68 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73  hereTerm(.  Pars
2900: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2920: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
2930: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
2940: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2950: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
2960: 61 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c  ables in FROM cl
2970: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ause */.  int iL
2980: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
2990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
29a0: 65 78 20 6f 66 20 66 69 72 73 74 20 74 61 62 6c  ex of first tabl
29b0: 65 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72  e to join in pSr
29c0: 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c  c */.  int iColL
29d0: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
29e0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
29f0: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72  of column in fir
2a00: 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  st table */.  in
2a10: 74 20 69 52 69 67 68 74 2c 20 20 20 20 20 20 20  t iRight,       
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a30: 20 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e 64   Index of second
2a40: 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20 2a   table in pSrc *
2a50: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67 68  /.  int iColRigh
2a60: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2a70: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
2a80: 63 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64  column in second
2a90: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
2aa0: 69 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20  isOuterJoin,    
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2ac0: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2ad0: 6e 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a  n OUTER join */.
2ae0: 20 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65    Expr **ppWhere
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b00: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65    /* IN/OUT: The
2b10: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
2b20: 20 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20   add to */.){.  
2b30: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
2b40: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
2b50: 20 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a 70   *pE1;.  Expr *p
2b60: 45 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71 3b  E2;.  Expr *pEq;
2b70: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 66  ..  assert( iLef
2b80: 74 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73  t<iRight );.  as
2b90: 73 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63  sert( pSrc->nSrc
2ba0: 3e 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73  >iRight );.  ass
2bb0: 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65  ert( pSrc->a[iLe
2bc0: 66 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61 73  ft].pTab );.  as
2bd0: 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 52  sert( pSrc->a[iR
2be0: 69 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20  ight].pTab );.. 
2bf0: 20 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43 72   pE1 = sqlite3Cr
2c00: 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64  eateColumnExpr(d
2c10: 62 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20  b, pSrc, iLeft, 
2c20: 69 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32  iColLeft);.  pE2
2c30: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
2c40: 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70  ColumnExpr(db, p
2c50: 53 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43 6f  Src, iRight, iCo
2c60: 6c 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71 20  lRight);..  pEq 
2c70: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
2c80: 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45  Parse, TK_EQ, pE
2c90: 31 2c 20 70 45 32 29 3b 0a 20 20 69 66 28 20 70  1, pE2);.  if( p
2ca0: 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69  Eq && isOuterJoi
2cb0: 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  n ){.    ExprSet
2cc0: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
2cd0: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
2ce0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2cf0: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
2d00: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
2d10: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78  duced) );.    Ex
2d20: 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
2d30: 28 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63  (pEq, EP_NoReduc
2d40: 65 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69  e);.    pEq->iRi
2d50: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28  ghtJoinTable = (
2d60: 69 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b  i16)pE2->iTable;
2d70: 0a 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20  .  }.  *ppWhere 
2d80: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
2d90: 28 64 62 2c 20 2a 70 70 57 68 65 72 65 2c 20 70  (db, *ppWhere, p
2da0: 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  Eq);.}../*.** Se
2db0: 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  t the EP_FromJoi
2dc0: 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c  n property on al
2dd0: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67  l terms of the g
2de0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  iven expression.
2df0: 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20  .** And set the 
2e00: 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
2e10: 61 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66  able to iTable f
2e20: 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  or every term in
2e30: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
2e40: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50  on..**.** The EP
2e50: 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72  _FromJoin proper
2e60: 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65  ty is used on te
2e70: 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73  rms of an expres
2e80: 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20  sion to tell.** 
2e90: 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  the LEFT OUTER J
2ea0: 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  OIN processing l
2eb0: 6f 67 69 63 20 74 68 61 74 20 74 68 69 73 20 74  ogic that this t
2ec0: 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74  erm is part of t
2ed0: 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72  he.** join restr
2ee0: 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64  iction specified
2ef0: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
2f00: 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e  ING clause and n
2f10: 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20  ot a part.** of 
2f20: 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c  the more general
2f30: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
2f40: 54 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20  These terms are 
2f50: 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68  moved over to th
2f60: 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
2f70: 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72  e during join pr
2f80: 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77 65 20  ocessing but we 
2f90: 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
2fa0: 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72   that they.** or
2fb0: 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20  iginated in the 
2fc0: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
2fd0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78  se..**.** The Ex
2fe0: 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
2ff0: 6c 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45  le tells the WHE
3000: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
3010: 73 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a  sing that the.**
3020: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65   expression depe
3030: 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69  nds on table iRi
3040: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65  ghtJoinTable eve
3050: 6e 20 69 66 20 74 68 61 74 20 74 61 62 6c 65 20  n if that table 
3060: 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63  is not.** explic
3070: 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69  itly mentioned i
3080: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
3090: 2e 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74  .  That informat
30a0: 69 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a  ion is needed.**
30b0: 20 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20   for cases like 
30c0: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  this:.**.**    S
30d0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
30e0: 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
30f0: 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31  t1.a=t2.b AND t1
3100: 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77  .x=5.**.** The w
3110: 68 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64  here clause need
3120: 73 20 74 6f 20 64 65 66 65 72 20 74 68 65 20 68  s to defer the h
3130: 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74  andling of the t
3140: 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e  1.x=5.** term un
3150: 74 69 6c 20 61 66 74 65 72 20 74 68 65 20 74 32  til after the t2
3160: 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69   loop of the joi
3170: 6e 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c  n.  In that way,
3180: 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f   a.** NULL t2 ro
3190: 77 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  w will be insert
31a0: 65 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78  ed whenever t1.x
31b0: 21 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e  !=5.  If we do n
31c0: 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20  ot.** defer the 
31d0: 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78  handling of t1.x
31e0: 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70  =5, it will be p
31f0: 72 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61  rocessed immedia
3200: 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68  tely.** after th
3210: 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f  e t1 loop and ro
3220: 77 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20  ws with t1.x!=5 
3230: 77 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61  will never appea
3240: 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70  r in.** the outp
3250: 75 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63  ut, which is inc
3260: 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  orrect..*/.stati
3270: 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78  c void setJoinEx
3280: 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  pr(Expr *p, int 
3290: 69 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65  iTable){.  while
32a0: 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53  ( p ){.    ExprS
32b0: 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  etProperty(p, EP
32c0: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
32d0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
32e0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
32f0: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
3300: 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72  ced) );.    Expr
3310: 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
3320: 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
3330: 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69      p->iRightJoi
3340: 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54  nTable = (i16)iT
3350: 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 70 2d  able;.    if( p-
3360: 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e  >op==TK_FUNCTION
3370: 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29   && p->x.pList )
3380: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
3390: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
33a0: 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  p->x.pList->nExp
33b0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
33c0: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e   setJoinExpr(p->
33d0: 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  x.pList->a[i].pE
33e0: 78 70 72 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20  xpr, iTable);.  
33f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
3400: 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70  setJoinExpr(p->p
3410: 4c 65 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20  Left, iTable);. 
3420: 20 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74     p = p->pRight
3430: 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 20 55 6e 64  ;.  } .}../* Und
3440: 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 73 65  o the work of se
3450: 74 4a 6f 69 6e 45 78 70 72 28 29 2e 20 20 49 6e  tJoinExpr().  In
3460: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
3470: 74 72 65 65 20 70 2c 20 63 6f 6e 76 65 72 74 20  tree p, convert 
3480: 65 76 65 72 79 0a 2a 2a 20 74 65 72 6d 20 74 68  every.** term th
3490: 61 74 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74  at is marked wit
34a0: 68 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 61 6e  h EP_FromJoin an
34b0: 64 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  d iRightJoinTabl
34c0: 65 3d 3d 69 54 61 62 6c 65 20 69 6e 74 6f 0a 2a  e==iTable into.*
34d0: 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 74 65  * an ordinary te
34e0: 72 6d 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68  rm that omits th
34f0: 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 6d 61  e EP_FromJoin ma
3500: 72 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 68  rk..**.** This h
3510: 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20 4c 45  appens when a LE
3520: 46 54 20 4a 4f 49 4e 20 69 73 20 73 69 6d 70 6c  FT JOIN is simpl
3530: 69 66 69 65 64 20 69 6e 74 6f 20 61 6e 20 6f 72  ified into an or
3540: 64 69 6e 61 72 79 20 4a 4f 49 4e 2e 0a 2a 2f 0a  dinary JOIN..*/.
3550: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 73 65  static void unse
3560: 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a  tJoinExpr(Expr *
3570: 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a  p, int iTable){.
3580: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
3590: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
35a0: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
35b0: 4a 6f 69 6e 29 0a 20 20 20 20 20 26 26 20 28 69  Join).     && (i
35c0: 54 61 62 6c 65 3c 30 20 7c 7c 20 70 2d 3e 69 52  Table<0 || p->iR
35d0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69  ightJoinTable==i
35e0: 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20  Table) ){.      
35f0: 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74  ExprClearPropert
3600: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
3610: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
3620: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54   p->op==TK_FUNCT
3630: 49 4f 4e 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73  ION && p->x.pLis
3640: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
3650: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
3660: 20 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e   i<p->x.pList->n
3670: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
3680: 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70      unsetJoinExp
3690: 72 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  r(p->x.pList->a[
36a0: 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65  i].pExpr, iTable
36b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
36c0: 0a 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78  .    unsetJoinEx
36d0: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61  pr(p->pLeft, iTa
36e0: 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  ble);.    p = p-
36f0: 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a  >pRight;.  } .}.
3700: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3710: 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68  ine processes th
3720: 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69  e join informati
3730: 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20  on for a SELECT 
3740: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e  statement..** ON
3750: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
3760: 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  es are converted
3770: 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d   into extra term
3780: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
3790: 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41  lause..** NATURA
37a0: 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65  L joins also cre
37b0: 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20  ate extra WHERE 
37c0: 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
37d0: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66  .** The terms of
37e0: 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61   a FROM clause a
37f0: 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  re contained in 
3800: 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20  the Select.pSrc 
3810: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68  structure..** Th
3820: 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c  e left most tabl
3830: 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65  e is the first e
3840: 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70  ntry in Select.p
3850: 53 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d  Src.  The right-
3860: 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73  most.** table is
3870: 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e   the last entry.
3880: 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61    The join opera
3890: 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74  tor is held in t
38a0: 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74  he entry to.** t
38b0: 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65  he left.  Thus e
38c0: 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20  ntry 0 contains 
38d0: 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
38e0: 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62  r for the join b
38f0: 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65  etween.** entrie
3900: 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20  s 0 and 1.  Any 
3910: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
3920: 73 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ses associated w
3930: 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65  ith the join are
3940: 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65  .** also attache
3950: 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e  d to the left en
3960: 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  try..**.** This 
3970: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
3980: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
3990: 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rors encountered
39a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
39b0: 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
39c0: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
39d0: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53   Select *p){.  S
39e0: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
39f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3a00: 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  * All tables in 
3a10: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
3a20: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
3a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a40: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
3a50: 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63  nters */.  struc
3a60: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
3a70: 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65  pLeft;     /* Le
3a80: 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ft table being j
3a90: 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  oined */.  struc
3aa0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
3ab0: 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69  pRight;    /* Ri
3ac0: 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20  ght table being 
3ad0: 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72  joined */..  pSr
3ae0: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  c = p->pSrc;.  p
3af0: 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b  Left = &pSrc->a[
3b00: 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26  0];.  pRight = &
3b10: 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28  pLeft[1];.  for(
3b20: 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
3b30: 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74  c-1; i++, pRight
3b40: 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20  ++, pLeft++){.  
3b50: 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54    Table *pRightT
3b60: 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61  ab = pRight->pTa
3b70: 62 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75 74  b;.    int isOut
3b80: 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45 56  er;..    if( NEV
3b90: 45 52 28 70 4c 65 66 74 2d 3e 70 54 61 62 3d 3d  ER(pLeft->pTab==
3ba0: 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d  0 || pRightTab==
3bb0: 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  0) ) continue;. 
3bc0: 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52     isOuter = (pR
3bd0: 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  ight->fg.jointyp
3be0: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
3bf0: 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74  ;..    /* When t
3c00: 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
3c10: 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61  rd is present, a
3c20: 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  dd WHERE clause 
3c30: 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a  terms for.    **
3c40: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68   every column th
3c50: 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  at the two table
3c60: 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e  s have in common
3c70: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
3c80: 20 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e   pRight->fg.join
3c90: 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
3ca0: 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  L ){.      if( p
3cb0: 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52  Right->pOn || pR
3cc0: 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a  ight->pUsing ){.
3cd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
3ce0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3cf0: 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20  "a NATURAL join 
3d00: 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20  may not have ". 
3d10: 20 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e            "an ON
3d20: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
3d30: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72  ", 0);.        r
3d40: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
3d50: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
3d60: 6a 3c 70 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f  j<pRightTab->nCo
3d70: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
3d80: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
3d90: 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d  /* Name of colum
3da0: 6e 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 74  n in the right t
3db0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
3dc0: 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20 2f  int iLeft;     /
3dd0: 2a 20 4d 61 74 63 68 69 6e 67 20 6c 65 66 74 20  * Matching left 
3de0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
3df0: 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20   int iLeftCol;  
3e00: 2f 2a 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75  /* Matching colu
3e10: 6d 6e 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74  mn in the left t
3e20: 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20  able */..       
3e30: 20 7a 4e 61 6d 65 20 3d 20 70 52 69 67 68 74 54   zName = pRightT
3e40: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
3e50: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74  e;.        if( t
3e60: 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64  ableAndColumnInd
3e70: 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e  ex(pSrc, i+1, zN
3e80: 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c  ame, &iLeft, &iL
3e90: 65 66 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20  eftCol) ){.     
3ea0: 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72       addWhereTer
3eb0: 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20  m(pParse, pSrc, 
3ec0: 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c  iLeft, iLeftCol,
3ed0: 20 69 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20   i+1, j,.       
3ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ef0: 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68  isOuter, &p->pWh
3f00: 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ere);.        }.
3f10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
3f20: 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62     /* Disallow b
3f30: 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  oth ON and USING
3f40: 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20   clauses in the 
3f50: 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f  same join.    */
3f60: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
3f70: 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e  >pOn && pRight->
3f80: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
3f90: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
3fa0: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
3fb0: 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64  have both ON and
3fc0: 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20   USING ".       
3fd0: 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65   "clauses in the
3fe0: 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20   same join");.  
3ff0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
4000: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
4010: 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f  the ON clause to
4020: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
4030: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f  WHERE clause, co
4040: 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a  nnected by.    *
4050: 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  * an AND operato
4060: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
4070: 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b  ( pRight->pOn ){
4080: 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 75 74  .      if( isOut
4090: 65 72 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72  er ) setJoinExpr
40a0: 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52  (pRight->pOn, pR
40b0: 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  ight->iCursor);.
40c0: 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20        p->pWhere 
40d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
40e0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
40f0: 70 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e  pWhere, pRight->
4100: 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67  pOn);.      pRig
4110: 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20  ht->pOn = 0;.   
4120: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
4130: 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e  e extra terms on
4140: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
4150: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
4160: 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69  n named.    ** i
4170: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
4180: 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66  se.  Example: If
4190: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
41a0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65  to be joined are
41b0: 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42   .    ** A and B
41c0: 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63   and the USING c
41d0: 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59  lause names X, Y
41e0: 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64  , and Z, then ad
41f0: 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f  d this.    ** to
4200: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
4210: 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e  e:    A.X=B.X AN
4220: 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e  D A.Y=B.Y AND A.
4230: 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70  Z=B.Z.    ** Rep
4240: 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ort an error if 
4250: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69  any column menti
4260: 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e  oned in the USIN
4270: 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20  G clause is.    
4280: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  ** not contained
4290: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20   in both tables 
42a0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20  to be joined..  
42b0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
42c0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
42d0: 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69       IdList *pLi
42e0: 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73  st = pRight->pUs
42f0: 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  ing;.      for(j
4300: 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; j<pList->nId
4310: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
4320: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
4330: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
4340: 74 65 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e  term in the USIN
4350: 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  G clause */.    
4360: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20      int iLeft;  
4370: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e       /* Table on
4380: 20 74 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d   the left with m
4390: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e  atching column n
43a0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ame */.        i
43b0: 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20  nt iLeftCol;    
43c0: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  /* Column number
43d0: 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c   of matching col
43e0: 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  umn on the left 
43f0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
4400: 52 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43  RightCol;   /* C
4410: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
4420: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
4430: 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
4440: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
4450: 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61   pList->a[j].zNa
4460: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67  me;.        iRig
4470: 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e  htCol = columnIn
4480: 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a  dex(pRightTab, z
4490: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Name);.        i
44a0: 66 28 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20  f( iRightCol<0. 
44b0: 20 20 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c          || !tabl
44c0: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
44d0: 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65  pSrc, i+1, zName
44e0: 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74  , &iLeft, &iLeft
44f0: 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  Col).        ){.
4500: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
4510: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
4520: 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75  , "cannot join u
4530: 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d  sing column %s -
4540: 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20   column ".      
4550: 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65        "not prese
4560: 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  nt in both table
4570: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
4580: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
4590: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
45a0: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
45b0: 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65  Parse, pSrc, iLe
45c0: 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b  ft, iLeftCol, i+
45d0: 31 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20  1, iRightCol,.  
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45f0: 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e     isOuter, &p->
4600: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d  pWhere);.      }
4610: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4620: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
4630: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
4640: 68 69 73 20 6f 62 6a 65 63 74 20 68 6f 6c 64 73  his object holds
4650: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 28 62 65   information (be
4660: 79 6f 6e 64 20 70 50 61 72 73 65 20 61 6e 64 20  yond pParse and 
4670: 70 53 65 6c 65 63 74 29 0a 2a 2a 20 6e 65 65 64  pSelect).** need
4680: 65 64 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 6e  ed to load the n
4690: 65 78 74 20 72 65 73 75 6c 74 20 72 6f 77 20 74  ext result row t
46a0: 68 61 74 20 69 73 20 74 6f 20 62 65 20 61 64 64  hat is to be add
46b0: 65 64 20 74 6f 20 74 68 65 20 73 6f 72 74 65 72  ed to the sorter
46c0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
46d0: 75 63 74 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20  uct RowLoadInfo 
46e0: 52 6f 77 4c 6f 61 64 49 6e 66 6f 3b 0a 73 74 72  RowLoadInfo;.str
46f0: 75 63 74 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20  uct RowLoadInfo 
4700: 7b 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c  {.  int regResul
4710: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4720: 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74   /* Store result
4730: 73 20 69 6e 20 61 72 72 61 79 20 6f 66 20 72 65  s in array of re
4740: 67 69 73 74 65 72 73 20 68 65 72 65 20 2a 2f 0a  gisters here */.
4750: 20 20 75 38 20 65 63 65 6c 46 6c 61 67 73 3b 20    u8 ecelFlags; 
4760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4770: 2a 20 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  * Flag argument 
4780: 74 6f 20 45 78 70 72 43 6f 64 65 45 78 70 72 4c  to ExprCodeExprL
4790: 69 73 74 28 29 20 2a 2f 0a 23 69 66 64 65 66 20  ist() */.#ifdef 
47a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
47b0: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
47c0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 78 74    ExprList *pExt
47d0: 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ra;            /
47e0: 2a 20 45 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20  * Extra columns 
47f0: 6e 65 65 64 65 64 20 62 79 20 73 6f 72 74 65 72  needed by sorter
4800: 20 72 65 66 73 20 2a 2f 0a 20 20 69 6e 74 20 72   refs */.  int r
4810: 65 67 45 78 74 72 61 52 65 73 75 6c 74 3b 20 20  egExtraResult;  
4820: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
4830: 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 65 78 74   to load the ext
4840: 72 61 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 65  ra columns */.#e
4850: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  ndif.};../*.** T
4860: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
4870: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6c 6f 61   the work of loa
4880: 64 69 6e 67 20 71 75 65 72 79 20 64 61 74 61 20  ding query data 
4890: 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  into an array of
48a0: 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73 6f  .** registers so
48b0: 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 20   that it can be 
48c0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 6f 72  added to the sor
48d0: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
48e0: 6f 69 64 20 69 6e 6e 65 72 4c 6f 6f 70 4c 6f 61  oid innerLoopLoa
48f0: 64 52 6f 77 28 0a 20 20 50 61 72 73 65 20 2a 70  dRow(.  Parse *p
4900: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
4910: 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
4920: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
4930: 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
4940: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20  pSelect,        
4950: 20 20 20 2f 2a 20 54 68 65 20 71 75 65 72 79 20     /* The query 
4960: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
4970: 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20 2a 70 49   RowLoadInfo *pI
4980: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 49  nfo         /* I
4990: 6e 66 6f 20 6e 65 65 64 65 64 20 74 6f 20 63 6f  nfo needed to co
49a0: 6d 70 6c 65 74 65 20 74 68 65 20 72 6f 77 20 6c  mplete the row l
49b0: 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  oad */.){.  sqli
49c0: 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
49d0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
49e0: 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 70 49 6e  ect->pEList, pIn
49f0: 66 6f 2d 3e 72 65 67 52 65 73 75 6c 74 2c 0a 20  fo->regResult,. 
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a10: 20 20 20 20 20 20 20 20 20 30 2c 20 70 49 6e 66           0, pInf
4a20: 6f 2d 3e 65 63 65 6c 46 6c 61 67 73 29 3b 0a 23  o->ecelFlags);.#
4a30: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
4a40: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
4a50: 45 4e 43 45 53 0a 20 20 69 66 28 20 70 49 6e 66  ENCES.  if( pInf
4a60: 6f 2d 3e 70 45 78 74 72 61 20 29 7b 0a 20 20 20  o->pExtra ){.   
4a70: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
4a80: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
4a90: 20 70 49 6e 66 6f 2d 3e 70 45 78 74 72 61 2c 20   pInfo->pExtra, 
4aa0: 70 49 6e 66 6f 2d 3e 72 65 67 45 78 74 72 61 52  pInfo->regExtraR
4ab0: 65 73 75 6c 74 2c 20 30 2c 20 30 29 3b 0a 20 20  esult, 0, 0);.  
4ac0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
4ad0: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
4ae0: 64 62 2c 20 70 49 6e 66 6f 2d 3e 70 45 78 74 72  db, pInfo->pExtr
4af0: 61 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  a);.  }.#endif.}
4b00: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 74 68 65  ../*.** Code the
4b10: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 69   OP_MakeRecord i
4b20: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
4b30: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 65 6e  generates the en
4b40: 74 72 79 20 74 6f 20 62 65 0a 2a 2a 20 61 64 64  try to be.** add
4b50: 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74  ed into the sort
4b60: 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
4b70: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 6e   the register in
4b80: 20 77 68 69 63 68 20 74 68 65 20 72 65 73 75 6c   which the resul
4b90: 74 20 69 73 20 73 74 6f 72 65 64 2e 0a 2a 2f 0a  t is stored..*/.
4ba0: 73 74 61 74 69 63 20 69 6e 74 20 6d 61 6b 65 53  static int makeS
4bb0: 6f 72 74 65 72 52 65 63 6f 72 64 28 0a 20 20 50  orterRecord(.  P
4bc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
4bd0: 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 0a  SortCtx *pSort,.
4be0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
4bf0: 74 2c 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65  t,.  int regBase
4c00: 2c 0a 20 20 69 6e 74 20 6e 42 61 73 65 0a 29 7b  ,.  int nBase.){
4c10: 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20  .  int nOBSat = 
4c20: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20  pSort->nOBSat;. 
4c30: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
4c40: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
4c50: 72 65 67 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73  regOut = ++pPars
4c60: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 69 66 28 20 70  e->nMem;.  if( p
4c70: 53 6f 72 74 2d 3e 70 44 65 66 65 72 72 65 64 52  Sort->pDeferredR
4c80: 6f 77 4c 6f 61 64 20 29 7b 0a 20 20 20 20 69 6e  owLoad ){.    in
4c90: 6e 65 72 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28 70  nerLoopLoadRow(p
4ca0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
4cb0: 70 53 6f 72 74 2d 3e 70 44 65 66 65 72 72 65 64  pSort->pDeferred
4cc0: 52 6f 77 4c 6f 61 64 29 3b 0a 20 20 7d 0a 20 20  RowLoad);.  }.  
4cd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4ce0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
4cf0: 72 64 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53  rd, regBase+nOBS
4d00: 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74  at, nBase-nOBSat
4d10: 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 72 65 74  , regOut);.  ret
4d20: 75 72 6e 20 72 65 67 4f 75 74 3b 0a 7d 0a 0a 2f  urn regOut;.}../
4d30: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
4d40: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73  de that will pus
4d50: 68 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 20  h the record in 
4d60: 72 65 67 69 73 74 65 72 73 20 72 65 67 44 61 74  registers regDat
4d70: 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72 65 67  a.** through reg
4d80: 44 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e 74  Data+nData-1 ont
4d90: 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f  o the sorter..*/
4da0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73  .static void pus
4db0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50  hOntoSorter(.  P
4dc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4dd0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
4de0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f 72  context */.  Sor
4df0: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20  tCtx *pSort,    
4e00: 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
4e10: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52 44  on about the ORD
4e20: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
4e30: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
4e40: 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
4e50: 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61  whole SELECT sta
4e60: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
4e70: 72 65 67 44 61 74 61 2c 20 20 20 20 20 20 20 20  regData,        
4e80: 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69     /* First regi
4e90: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74  ster holding dat
4ea0: 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a  a to be sorted *
4eb0: 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67 44  /.  int regOrigD
4ec0: 61 74 61 2c 20 20 20 20 20 20 20 2f 2a 20 46 69  ata,       /* Fi
4ed0: 72 73 74 20 72 65 67 69 73 74 65 72 20 68 6f 6c  rst register hol
4ee0: 64 69 6e 67 20 64 61 74 61 20 62 65 66 6f 72 65  ding data before
4ef0: 20 70 61 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e   packing */.  in
4f00: 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20 20 20  t nData,        
4f10: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4f20: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  f elements in th
4f30: 65 20 72 65 67 44 61 74 61 20 64 61 74 61 20 61  e regData data a
4f40: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  rray */.  int nP
4f50: 72 65 66 69 78 52 65 67 20 20 20 20 20 20 20 20  refixReg        
4f60: 20 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65 67 20 70   /* No. of reg p
4f70: 72 69 6f 72 20 74 6f 20 72 65 67 44 61 74 61 20  rior to regData 
4f80: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
4f90: 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  e */.){.  Vdbe *
4fa0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
4fb0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
4fc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
4fd0: 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  mt under constru
4fe0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62  ction */.  int b
4ff0: 53 65 71 20 3d 20 28 28 70 53 6f 72 74 2d 3e 73  Seq = ((pSort->s
5000: 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46  ortFlags & SORTF
5010: 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29 3d 3d  LAG_UseSorter)==
5020: 30 29 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20  0);.  int nExpr 
5030: 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  = pSort->pOrderB
5040: 79 2d 3e 6e 45 78 70 72 3b 20 20 20 20 20 20 20  y->nExpr;       
5050: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66         /* No. of
5060: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
5070: 2a 2f 0a 20 20 69 6e 74 20 6e 42 61 73 65 20 3d  */.  int nBase =
5080: 20 6e 45 78 70 72 20 2b 20 62 53 65 71 20 2b 20   nExpr + bSeq + 
5090: 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  nData;          
50a0: 20 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 73 20        /* Fields 
50b0: 69 6e 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  in sorter record
50c0: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73   */.  int regBas
50d0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50f0: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 73 20 66         /* Regs f
5100: 6f 72 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  or sorter record
5110: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63   */.  int regRec
5120: 6f 72 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ord = 0;        
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5140: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 65 6d 62         /* Assemb
5150: 6c 65 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72  led sorter recor
5160: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61  d */.  int nOBSa
5170: 74 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  t = pSort->nOBSa
5180: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
5190: 20 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52          /* ORDER
51a0: 20 42 59 20 74 65 72 6d 73 20 74 6f 20 73 6b 69   BY terms to ski
51b0: 70 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  p */.  int op;  
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63            /* Opc
51e0: 6f 64 65 20 74 6f 20 61 64 64 20 73 6f 72 74 65  ode to add sorte
51f0: 72 20 72 65 63 6f 72 64 20 74 6f 20 73 6f 72 74  r record to sort
5200: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6d  er */.  int iLim
5210: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
5220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49             /* LI
5230: 4d 49 54 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  MIT counter */. 
5240: 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 30 3b 20   int iSkip = 0; 
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5260: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68      /* End of th
5270: 65 20 73 6f 72 74 65 72 20 69 6e 73 65 72 74 20  e sorter insert 
5280: 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 61 73 73 65 72  loop */..  asser
5290: 74 28 20 62 53 65 71 3d 3d 30 20 7c 7c 20 62 53  t( bSeq==0 || bS
52a0: 65 71 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54  eq==1 );..  /* T
52b0: 68 72 65 65 20 63 61 73 65 73 3a 0a 20 20 2a 2a  hree cases:.  **
52c0: 20 20 20 28 31 29 20 54 68 65 20 64 61 74 61 20     (1) The data 
52d0: 74 6f 20 62 65 20 73 6f 72 74 65 64 20 68 61 73  to be sorted has
52e0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 61   already been pa
52f0: 63 6b 65 64 20 69 6e 74 6f 20 61 20 52 65 63 6f  cked into a Reco
5300: 72 64 0a 20 20 2a 2a 20 20 20 20 20 20 20 62 79  rd.  **       by
5310: 20 61 20 70 72 69 6f 72 20 4f 50 5f 4d 61 6b 65   a prior OP_Make
5320: 52 65 63 6f 72 64 2e 20 20 49 6e 20 74 68 69 73  Record.  In this
5330: 20 63 61 73 65 20 6e 44 61 74 61 3d 3d 31 20 61   case nData==1 a
5340: 6e 64 20 72 65 67 44 61 74 61 0a 20 20 2a 2a 20  nd regData.  ** 
5350: 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20 63 6f        will be co
5360: 6d 70 6c 65 74 65 6c 79 20 75 6e 72 65 6c 61 74  mpletely unrelat
5370: 65 64 20 74 6f 20 72 65 67 4f 72 69 67 44 61 74  ed to regOrigDat
5380: 61 2e 0a 20 20 2a 2a 20 20 20 28 32 29 20 41 6c  a..  **   (2) Al
5390: 6c 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73  l output columns
53a0: 20 61 72 65 20 69 6e 63 6c 75 64 65 64 20 69 6e   are included in
53b0: 20 74 68 65 20 73 6f 72 74 20 72 65 63 6f 72 64   the sort record
53c0: 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 2a 2a 20  .  In that.  ** 
53d0: 20 20 20 20 20 20 63 61 73 65 20 72 65 67 44 61        case regDa
53e0: 74 61 3d 3d 72 65 67 4f 72 69 67 44 61 74 61 2e  ta==regOrigData.
53f0: 0a 20 20 2a 2a 20 20 20 28 33 29 20 53 6f 6d 65  .  **   (3) Some
5400: 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 20   output columns 
5410: 61 72 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  are omitted from
5420: 20 74 68 65 20 73 6f 72 74 20 72 65 63 6f 72 64   the sort record
5430: 20 64 75 65 20 74 6f 0a 20 20 2a 2a 20 20 20 20   due to.  **    
5440: 20 20 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e     the SQLITE_EN
5450: 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45  ABLE_SORTER_REFE
5460: 52 45 4e 43 45 20 6f 70 74 69 6d 69 7a 61 74 69  RENCE optimizati
5470: 6f 6e 2c 20 6f 72 20 64 75 65 20 74 6f 20 74 68  on, or due to th
5480: 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 53 51 4c  e.  **       SQL
5490: 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46  ITE_ECEL_OMITREF
54a0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 6f   optimization, o
54b0: 72 20 64 75 65 20 74 6f 20 74 68 65 20 0a 20 20  r due to the .  
54c0: 2a 2a 20 20 20 20 20 20 20 53 6f 72 74 43 74 78  **       SortCtx
54d0: 2e 70 44 65 66 65 72 72 65 64 52 6f 77 4c 6f 61  .pDeferredRowLoa
54e0: 64 20 6f 70 74 69 6d 69 61 74 69 6f 6e 2e 20 20  d optimiation.  
54f0: 49 6e 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20  In any of these 
5500: 63 61 73 65 73 0a 20 20 2a 2a 20 20 20 20 20 20  cases.  **      
5510: 20 72 65 67 4f 72 69 67 44 61 74 61 20 69 73 20   regOrigData is 
5520: 30 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 69  0 to prevent thi
5530: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74  s routine from t
5540: 72 79 69 6e 67 20 74 6f 20 63 6f 70 79 0a 20 20  rying to copy.  
5550: 2a 2a 20 20 20 20 20 20 20 76 61 6c 75 65 73 20  **       values 
5560: 74 68 61 74 20 6d 69 67 68 74 20 6e 6f 74 20 79  that might not y
5570: 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2f 0a 20  et exist..  */. 
5580: 20 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d   assert( nData==
5590: 31 20 7c 7c 20 72 65 67 44 61 74 61 3d 3d 72 65  1 || regData==re
55a0: 67 4f 72 69 67 44 61 74 61 20 7c 7c 20 72 65 67  gOrigData || reg
55b0: 4f 72 69 67 44 61 74 61 3d 3d 30 20 29 3b 0a 0a  OrigData==0 );..
55c0: 20 20 69 66 28 20 6e 50 72 65 66 69 78 52 65 67    if( nPrefixReg
55d0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
55e0: 6e 50 72 65 66 69 78 52 65 67 3d 3d 6e 45 78 70  nPrefixReg==nExp
55f0: 72 2b 62 53 65 71 20 29 3b 0a 20 20 20 20 72 65  r+bSeq );.    re
5600: 67 42 61 73 65 20 3d 20 72 65 67 44 61 74 61 20  gBase = regData 
5610: 2d 20 6e 50 72 65 66 69 78 52 65 67 3b 0a 20 20  - nPrefixReg;.  
5620: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 42 61  }else{.    regBa
5630: 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  se = pParse->nMe
5640: 6d 20 2b 20 31 3b 0a 20 20 20 20 70 50 61 72 73  m + 1;.    pPars
5650: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 42 61 73 65  e->nMem += nBase
5660: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
5670: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
5680: 3d 3d 30 20 7c 7c 20 70 53 65 6c 65 63 74 2d 3e  ==0 || pSelect->
5690: 69 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69  iLimit!=0 );.  i
56a0: 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d  Limit = pSelect-
56b0: 3e 69 4f 66 66 73 65 74 20 3f 20 70 53 65 6c 65  >iOffset ? pSele
56c0: 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20  ct->iOffset+1 : 
56d0: 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b  pSelect->iLimit;
56e0: 0a 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44  .  pSort->labelD
56f0: 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  one = sqlite3Vdb
5700: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
5710: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
5720: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
5730: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
5740: 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67 4f 72  , regBase, regOr
5750: 69 67 44 61 74 61 2c 0a 20 20 20 20 20 20 20 20  igData,.        
5760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5770: 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55    SQLITE_ECEL_DU
5780: 50 20 7c 20 28 72 65 67 4f 72 69 67 44 61 74 61  P | (regOrigData
5790: 3f 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45  ? SQLITE_ECEL_RE
57a0: 46 20 3a 20 30 29 29 3b 0a 20 20 69 66 28 20 62  F : 0));.  if( b
57b0: 53 65 71 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Seq ){.    sqlit
57c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
57d0: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 53 6f  OP_Sequence, pSo
57e0: 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65  rt->iECursor, re
57f0: 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20 20  gBase+nExpr);.  
5800: 7d 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78 52  }.  if( nPrefixR
5810: 65 67 3d 3d 30 20 26 26 20 6e 44 61 74 61 3e 30  eg==0 && nData>0
5820: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
5830: 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
5840: 73 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65 67  se, regData, reg
5850: 42 61 73 65 2b 6e 45 78 70 72 2b 62 53 65 71 2c  Base+nExpr+bSeq,
5860: 20 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 69   nData);.  }.  i
5870: 66 28 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20  f( nOBSat>0 ){. 
5880: 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 4b 65     int regPrevKe
5890: 79 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  y;   /* The firs
58a0: 74 20 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e 73  t nOBSat columns
58b0: 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73   of the previous
58c0: 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20   row */.    int 
58d0: 61 64 64 72 46 69 72 73 74 3b 20 20 20 20 2f 2a  addrFirst;    /*
58e0: 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
58f0: 4f 50 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65 20  OP_IfNot opcode 
5900: 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4a  */.    int addrJ
5910: 6d 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  mp;      /* Addr
5920: 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a 75  ess of the OP_Ju
5930: 6d 70 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  mp opcode */.   
5940: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20   VdbeOp *pOp;   
5950: 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68 61     /* Opcode tha
5960: 74 20 6f 70 65 6e 73 20 74 68 65 20 73 6f 72 74  t opens the sort
5970: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4b  er */.    int nK
5980: 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ey;         /* N
5990: 75 6d 62 65 72 20 6f 66 20 73 6f 72 74 69 6e 67  umber of sorting
59a0: 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69 6e   key columns, in
59b0: 63 6c 75 64 69 6e 67 20 4f 50 5f 53 65 71 75 65  cluding OP_Seque
59c0: 6e 63 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e  nce */.    KeyIn
59d0: 66 6f 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a 20  fo *pKI;     /* 
59e0: 4f 72 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66 6f  Original KeyInfo
59f0: 20 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 20 74   on the sorter t
5a00: 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 65 67  able */..    reg
5a10: 52 65 63 6f 72 64 20 3d 20 6d 61 6b 65 53 6f 72  Record = makeSor
5a20: 74 65 72 52 65 63 6f 72 64 28 70 50 61 72 73 65  terRecord(pParse
5a30: 2c 20 70 53 6f 72 74 2c 20 70 53 65 6c 65 63 74  , pSort, pSelect
5a40: 2c 20 72 65 67 42 61 73 65 2c 20 6e 42 61 73 65  , regBase, nBase
5a50: 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76 4b 65  );.    regPrevKe
5a60: 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  y = pParse->nMem
5a70: 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  +1;.    pParse->
5a80: 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e 6e  nMem += pSort->n
5a90: 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65 79 20  OBSat;.    nKey 
5aa0: 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d  = nExpr - pSort-
5ab0: 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65 71 3b 0a  >nOBSat + bSeq;.
5ac0: 20 20 20 20 69 66 28 20 62 53 65 71 20 29 7b 0a      if( bSeq ){.
5ad0: 20 20 20 20 20 20 61 64 64 72 46 69 72 73 74 20        addrFirst 
5ae0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
5af0: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op1(v, OP_IfNot,
5b00: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b   regBase+nExpr);
5b10: 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20   .    }else{.   
5b20: 20 20 20 61 64 64 72 46 69 72 73 74 20 3d 20 73     addrFirst = s
5b30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
5b40: 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 54  (v, OP_SequenceT
5b50: 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75  est, pSort->iECu
5b60: 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rsor);.    }.   
5b70: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5b80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5b90: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
5ba0: 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76 4b 65  mpare, regPrevKe
5bb0: 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53 6f 72  y, regBase, pSor
5bc0: 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20  t->nOBSat);.    
5bd0: 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
5be0: 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d  eGetOp(v, pSort-
5bf0: 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b  >addrSortIndex);
5c00: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
5c10: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
5c20: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  d ) return;.    
5c30: 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20 2b  pOp->p2 = nKey +
5c40: 20 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b 49 20   nData;.    pKI 
5c50: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e  = pOp->p4.pKeyIn
5c60: 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  fo;.    memset(p
5c70: 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20  KI->aSortOrder, 
5c80: 30 2c 20 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c  0, pKI->nKeyFiel
5c90: 64 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50 5f  d); /* Makes OP_
5ca0: 4a 75 6d 70 20 74 65 73 74 61 62 6c 65 20 2a 2f  Jump testable */
5cb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5cc0: 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
5cd0: 28 63 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f 4b  (char*)pKI, P4_K
5ce0: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 74 65 73  EYINFO);.    tes
5cf0: 74 63 61 73 65 28 20 70 4b 49 2d 3e 6e 41 6c 6c  tcase( pKI->nAll
5d00: 46 69 65 6c 64 20 3e 20 70 4b 49 2d 3e 6e 4b 65  Field > pKI->nKe
5d10: 79 46 69 65 6c 64 2b 32 20 29 3b 0a 20 20 20 20  yField+2 );.    
5d20: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
5d30: 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
5d40: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
5d50: 61 72 73 65 2c 70 53 6f 72 74 2d 3e 70 4f 72 64  arse,pSort->pOrd
5d60: 65 72 42 79 2c 6e 4f 42 53 61 74 2c 0a 20 20 20  erBy,nOBSat,.   
5d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d90: 20 20 20 20 20 20 20 20 70 4b 49 2d 3e 6e 41 6c          pKI->nAl
5da0: 6c 46 69 65 6c 64 2d 70 4b 49 2d 3e 6e 4b 65 79  lField-pKI->nKey
5db0: 46 69 65 6c 64 2d 31 29 3b 0a 20 20 20 20 61 64  Field-1);.    ad
5dc0: 64 72 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33 56  drJmp = sqlite3V
5dd0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
5de0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5df0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
5e00: 75 6d 70 2c 20 61 64 64 72 4a 6d 70 2b 31 2c 20  ump, addrJmp+1, 
5e10: 30 2c 20 61 64 64 72 4a 6d 70 2b 31 29 3b 20 56  0, addrJmp+1); V
5e20: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
5e30: 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c      pSort->label
5e40: 42 6b 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 56  BkOut = sqlite3V
5e50: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
5e60: 0a 20 20 20 20 70 53 6f 72 74 2d 3e 72 65 67 52  .    pSort->regR
5e70: 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65  eturn = ++pParse
5e80: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
5e90: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5ea0: 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74   OP_Gosub, pSort
5eb0: 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f  ->regReturn, pSo
5ec0: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b  rt->labelBkOut);
5ed0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5ee0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73  AddOp1(v, OP_Res
5ef0: 65 74 53 6f 72 74 65 72 2c 20 70 53 6f 72 74 2d  etSorter, pSort-
5f00: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  >iECursor);.    
5f10: 69 66 28 20 69 4c 69 6d 69 74 20 29 7b 0a 20 20  if( iLimit ){.  
5f20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5f30: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp2(v, OP_IfNo
5f40: 74 2c 20 69 4c 69 6d 69 74 2c 20 70 53 6f 72 74  t, iLimit, pSort
5f50: 2d 3e 6c 61 62 65 6c 44 6f 6e 65 29 3b 0a 20 20  ->labelDone);.  
5f60: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
5f70: 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  (v);.    }.    s
5f80: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
5f90: 72 65 28 76 2c 20 61 64 64 72 46 69 72 73 74 29  re(v, addrFirst)
5fa0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
5fb0: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
5fc0: 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67 50 72  , regBase, regPr
5fd0: 65 76 4b 65 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f  evKey, pSort->nO
5fe0: 42 53 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  BSat);.    sqlit
5ff0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
6000: 2c 20 61 64 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a  , addrJmp);.  }.
6010: 20 20 69 66 28 20 69 4c 69 6d 69 74 20 29 7b 0a    if( iLimit ){.
6020: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
6030: 6f 69 6e 74 20 74 68 65 20 76 61 6c 75 65 73 20  oint the values 
6040: 66 6f 72 20 74 68 65 20 6e 65 77 20 73 6f 72 74  for the new sort
6050: 65 72 20 65 6e 74 72 79 20 61 72 65 20 73 74 6f  er entry are sto
6060: 72 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 61 6e  red.    ** in an
6070: 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
6080: 65 72 73 2e 20 54 68 65 79 20 6e 65 65 64 20 74  ers. They need t
6090: 6f 20 62 65 20 63 6f 6d 70 6f 73 65 64 20 69 6e  o be composed in
60a0: 74 6f 20 61 20 72 65 63 6f 72 64 0a 20 20 20 20  to a record.    
60b0: 2a 2a 20 61 6e 64 20 69 6e 73 65 72 74 65 64 20  ** and inserted 
60c0: 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 20  into the sorter 
60d0: 69 66 20 65 69 74 68 65 72 20 28 61 29 20 74 68  if either (a) th
60e0: 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ere are currentl
60f0: 79 0a 20 20 20 20 2a 2a 20 6c 65 73 73 20 74 68  y.    ** less th
6100: 61 6e 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20  an LIMIT+OFFSET 
6110: 69 74 65 6d 73 20 6f 72 20 28 62 29 20 74 68 65  items or (b) the
6120: 20 6e 65 77 20 72 65 63 6f 72 64 20 69 73 20 73   new record is s
6130: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 20 20 20  maller than .   
6140: 20 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20   ** the largest 
6150: 72 65 63 6f 72 64 20 63 75 72 72 65 6e 74 6c 79  record currently
6160: 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 2e 20   in the sorter. 
6170: 49 66 20 28 62 29 20 69 73 20 74 72 75 65 20 61  If (b) is true a
6180: 6e 64 20 74 68 65 72 65 0a 20 20 20 20 2a 2a 20  nd there.    ** 
6190: 61 72 65 20 61 6c 72 65 61 64 79 20 4c 49 4d 49  are already LIMI
61a0: 54 2b 4f 46 46 53 45 54 20 69 74 65 6d 73 20 69  T+OFFSET items i
61b0: 6e 20 74 68 65 20 73 6f 72 74 65 72 2c 20 64 65  n the sorter, de
61c0: 6c 65 74 65 20 74 68 65 20 6c 61 72 67 65 73 74  lete the largest
61d0: 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 62 65  .    ** entry be
61e0: 66 6f 72 65 20 69 6e 73 65 72 74 69 6e 67 20 74  fore inserting t
61f0: 68 65 20 6e 65 77 20 6f 6e 65 2e 20 54 68 69 73  he new one. This
6200: 20 77 61 79 20 74 68 65 72 65 20 61 72 65 20 6e   way there are n
6210: 65 76 65 72 20 6d 6f 72 65 20 0a 20 20 20 20 2a  ever more .    *
6220: 2a 20 74 68 61 6e 20 4c 49 4d 49 54 2b 4f 46 46  * than LIMIT+OFF
6230: 53 45 54 20 69 74 65 6d 73 20 69 6e 20 74 68 65  SET items in the
6240: 20 73 6f 72 74 65 72 2e 0a 20 20 20 20 2a 2a 0a   sorter..    **.
6250: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6e 65      ** If the ne
6260: 77 20 72 65 63 6f 72 64 20 64 6f 65 73 20 6e 6f  w record does no
6270: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e 73  t need to be ins
6280: 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 73  erted into the s
6290: 6f 72 74 65 72 2c 0a 20 20 20 20 2a 2a 20 6a 75  orter,.    ** ju
62a0: 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  mp to the next i
62b0: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
62c0: 6c 6f 6f 70 2e 20 49 66 20 74 68 65 20 70 53 6f  loop. If the pSo
62d0: 72 74 2d 3e 6c 61 62 65 6c 4f 42 4c 6f 70 74 0a  rt->labelOBLopt.
62e0: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 69 73 20      ** value is 
62f0: 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69  not zero, then i
6300: 74 20 69 73 20 61 20 6c 61 62 65 6c 20 6f 66 20  t is a label of 
6310: 77 68 65 72 65 20 74 6f 20 6a 75 6d 70 2e 20 20  where to jump.  
6320: 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 2a  Otherwise,.    *
6330: 2a 20 6a 75 73 74 20 62 79 70 61 73 73 20 74 68  * just bypass th
6340: 65 20 72 6f 77 20 69 6e 73 65 72 74 20 6c 6f 67  e row insert log
6350: 69 63 2e 20 20 53 65 65 20 74 68 65 20 68 65 61  ic.  See the hea
6360: 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74  der comment on t
6370: 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  he.    ** sqlite
6380: 33 57 68 65 72 65 4f 72 64 65 72 42 79 4c 69 6d  3WhereOrderByLim
6390: 69 74 4f 70 74 4c 61 62 65 6c 28 29 20 66 75 6e  itOptLabel() fun
63a0: 63 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69  ction for additi
63b0: 6f 6e 61 6c 20 69 6e 66 6f 2e 0a 20 20 20 20 2a  onal info..    *
63c0: 2f 0a 20 20 20 20 69 6e 74 20 69 43 73 72 20 3d  /.    int iCsr =
63d0: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
63e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
63f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
6400: 4e 6f 74 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c  NotZero, iLimit,
6410: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
6420: 65 6e 74 41 64 64 72 28 76 29 2b 34 29 3b 0a 20  entAddr(v)+4);. 
6430: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
6440: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
6450: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6460: 4c 61 73 74 2c 20 69 43 73 72 2c 20 30 29 3b 0a  Last, iCsr, 0);.
6470: 20 20 20 20 69 53 6b 69 70 20 3d 20 73 71 6c 69      iSkip = sqli
6480: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
6490: 28 76 2c 20 4f 50 5f 49 64 78 4c 45 2c 0a 20 20  (v, OP_IdxLE,.  
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
64c0: 43 73 72 2c 20 30 2c 20 72 65 67 42 61 73 65 2b  Csr, 0, regBase+
64d0: 6e 4f 42 53 61 74 2c 20 6e 45 78 70 72 2d 6e 4f  nOBSat, nExpr-nO
64e0: 42 53 61 74 29 3b 0a 20 20 20 20 56 64 62 65 43  BSat);.    VdbeC
64f0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
6500: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6510: 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  1(v, OP_Delete, 
6520: 69 43 73 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  iCsr);.  }.  if(
6530: 20 72 65 67 52 65 63 6f 72 64 3d 3d 30 20 29 7b   regRecord==0 ){
6540: 0a 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d  .    regRecord =
6550: 20 6d 61 6b 65 53 6f 72 74 65 72 52 65 63 6f 72   makeSorterRecor
6560: 64 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c  d(pParse, pSort,
6570: 20 70 53 65 6c 65 63 74 2c 20 72 65 67 42 61 73   pSelect, regBas
6580: 65 2c 20 6e 42 61 73 65 29 3b 0a 20 20 7d 0a 20  e, nBase);.  }. 
6590: 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74   if( pSort->sort
65a0: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
65b0: 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20  _UseSorter ){.  
65c0: 20 20 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72    op = OP_Sorter
65d0: 49 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b  Insert;.  }else{
65e0: 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78  .    op = OP_Idx
65f0: 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71  Insert;.  }.  sq
6600: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
6610: 6e 74 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d  nt(v, op, pSort-
6620: 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65  >iECursor, regRe
6630: 63 6f 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20  cord,.          
6640: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
6650: 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61  Base+nOBSat, nBa
6660: 73 65 2d 6e 4f 42 53 61 74 29 3b 0a 20 20 69 66  se-nOBSat);.  if
6670: 28 20 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 73  ( iSkip ){.    s
6680: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6690: 50 32 28 76 2c 20 69 53 6b 69 70 2c 0a 20 20 20  P2(v, iSkip,.   
66a0: 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61 62        pSort->lab
66b0: 65 6c 4f 42 4c 6f 70 74 20 3f 20 70 53 6f 72 74  elOBLopt ? pSort
66c0: 2d 3e 6c 61 62 65 6c 4f 42 4c 6f 70 74 20 3a 20  ->labelOBLopt : 
66d0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
66e0: 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 7d 0a  ntAddr(v));.  }.
66f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
6700: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
6710: 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61  he OFFSET.*/.sta
6720: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66  tic void codeOff
6730: 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  set(.  Vdbe *v, 
6740: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
6750: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
6760: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
6770: 69 4f 66 66 73 65 74 2c 20 20 20 20 20 20 2f 2a  iOffset,      /*
6780: 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
6790: 67 20 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75  g the offset cou
67a0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43  nter */.  int iC
67b0: 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a  ontinue     /* J
67c0: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
67d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63   the current rec
67e0: 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ord */.){.  if( 
67f0: 69 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20  iOffset>0 ){.   
6800: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6810: 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p3(v, OP_IfPos, 
6820: 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e  iOffset, iContin
6830: 75 65 2c 20 31 29 3b 20 56 64 62 65 43 6f 76 65  ue, 1); VdbeCove
6840: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62  rage(v);.    Vdb
6850: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46  eComment((v, "OF
6860: 46 53 45 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  FSET"));.  }.}..
6870: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
6880: 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74  hat will check t
6890: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
68a0: 4e 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  N registers star
68b0: 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20  ting at iMem.** 
68c0: 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20  form a distinct 
68d0: 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73 20  entry.  iTab is 
68e0: 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
68f0: 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69  that holds previ
6900: 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f  ously.** seen co
6910: 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68  mbinations of th
6920: 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e  e N values.  A n
6930: 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65  ew entry is made
6940: 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74   in iTab.** if t
6950: 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c  he current N val
6960: 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a  ues are new..**.
6970: 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64  ** A jump to add
6980: 72 52 65 70 65 61 74 20 69 73 20 6d 61 64 65 20  rRepeat is made 
6990: 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75  and the N+1 valu
69a0: 65 73 20 61 72 65 20 70 6f 70 70 65 64 20 66 72  es are popped fr
69b0: 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20  om the.** stack 
69c0: 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65  if the top N ele
69d0: 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69  ments are not di
69e0: 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  stinct..*/.stati
69f0: 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69  c void codeDisti
6a00: 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nct(.  Parse *pP
6a10: 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72  arse,     /* Par
6a20: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
6a30: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
6a40: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
6a50: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f           /* A so
6a60: 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64  rting index used
6a70: 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73   to test for dis
6a80: 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69  tinctness */.  i
6a90: 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c 20 20  nt addrRepeat,  
6aa0: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72    /* Jump to her
6ab0: 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63  e if not distinc
6ac0: 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20  t */.  int N,   
6ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6ae0: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
6af0: 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20  */.  int iMem   
6b00: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
6b10: 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20   element */.){. 
6b20: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
6b30: 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73  r1;..  v = pPars
6b40: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d  e->pVdbe;.  r1 =
6b50: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
6b60: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
6b70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
6b80: 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
6b90: 69 54 61 62 2c 20 61 64 64 72 52 65 70 65 61 74  iTab, addrRepeat
6ba0: 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65  , iMem, N); Vdbe
6bb0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
6bc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6bd0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
6be0: 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b  d, iMem, N, r1);
6bf0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
6c00: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64  dOp4Int(v, OP_Id
6c10: 78 49 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72  xInsert, iTab, r
6c20: 31 2c 20 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73  1, iMem, N);.  s
6c30: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6c40: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45  P5(v, OPFLAG_USE
6c50: 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73  SEEKRESULT);.  s
6c60: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
6c70: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
6c80: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
6c90: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
6ca0: 5f 52 45 46 45 52 45 4e 43 45 53 0a 2f 2a 0a 2a  _REFERENCES./*.*
6cb0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
6cc0: 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72  is called as par
6cd0: 74 20 6f 66 20 69 6e 6e 65 72 2d 6c 6f 6f 70 20  t of inner-loop 
6ce0: 67 65 6e 65 72 61 74 69 6f 6e 20 66 6f 72 20 61  generation for a
6cf0: 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
6d00: 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 4f 52 44  ment with an ORD
6d10: 45 52 20 42 59 20 74 68 61 74 20 69 73 20 6e 6f  ER BY that is no
6d20: 74 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 61  t optimized by a
6d30: 6e 20 69 6e 64 65 78 2e 20 49 74 20 0a 2a 2a 20  n index. It .** 
6d40: 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 65  determines the e
6d50: 78 70 72 65 73 73 69 6f 6e 73 2c 20 69 66 20 61  xpressions, if a
6d60: 6e 79 2c 20 74 68 61 74 20 74 68 65 20 73 6f 72  ny, that the sor
6d70: 74 65 72 2d 72 65 66 65 72 65 6e 63 65 20 0a 2a  ter-reference .*
6d80: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 73  * optimization s
6d90: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f  hould be used fo
6da0: 72 2e 20 54 68 65 20 73 6f 72 74 65 72 2d 72 65  r. The sorter-re
6db0: 66 65 72 65 6e 63 65 20 6f 70 74 69 6d 69 7a 61  ference optimiza
6dc0: 74 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 20  tion.** is used 
6dd0: 66 6f 72 20 53 45 4c 45 43 54 20 71 75 65 72 69  for SELECT queri
6de0: 65 73 20 6c 69 6b 65 3a 0a 2a 2a 0a 2a 2a 20 20  es like:.**.**  
6df0: 20 53 45 4c 45 43 54 20 61 2c 20 62 69 67 62 6c   SELECT a, bigbl
6e00: 6f 62 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52  ob FROM t1 ORDER
6e10: 20 42 59 20 61 20 4c 49 4d 49 54 20 31 30 0a 2a   BY a LIMIT 10.*
6e20: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69  *.** If the opti
6e30: 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64  mization is used
6e40: 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20   for expression 
6e50: 22 62 69 67 62 6c 6f 62 22 2c 20 74 68 65 6e 20  "bigblob", then 
6e60: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 73 74  instead of.** st
6e70: 6f 72 69 6e 67 20 76 61 6c 75 65 73 20 72 65 61  oring values rea
6e80: 64 20 66 72 6f 6d 20 74 68 61 74 20 63 6f 6c 75  d from that colu
6e90: 6d 6e 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72  mn in the sorter
6ea0: 20 72 65 63 6f 72 64 73 2c 20 74 68 65 20 50 4b   records, the PK
6eb0: 20 6f 66 0a 2a 2a 20 74 68 65 20 72 6f 77 20 66   of.** the row f
6ec0: 72 6f 6d 20 74 61 62 6c 65 20 74 31 20 69 73 20  rom table t1 is 
6ed0: 73 74 6f 72 65 64 20 69 6e 73 74 65 61 64 2e 20  stored instead. 
6ee0: 54 68 65 6e 2c 20 61 73 20 72 65 63 6f 72 64 73  Then, as records
6ef0: 20 61 72 65 20 65 78 74 72 61 63 74 65 64 20 66   are extracted f
6f00: 72 6f 6d 0a 2a 2a 20 74 68 65 20 73 6f 72 74 65  rom.** the sorte
6f10: 72 20 74 6f 20 72 65 74 75 72 6e 20 74 6f 20 74  r to return to t
6f20: 68 65 20 75 73 65 72 2c 20 74 68 65 20 72 65 71  he user, the req
6f30: 75 69 72 65 64 20 76 61 6c 75 65 20 6f 66 20 62  uired value of b
6f40: 69 67 62 6c 6f 62 20 69 73 0a 2a 2a 20 72 65 74  igblob is.** ret
6f50: 72 69 65 76 65 64 20 64 69 72 65 63 74 6c 79 20  rieved directly 
6f60: 66 72 6f 6d 20 74 61 62 6c 65 20 74 31 2e 20 49  from table t1. I
6f70: 66 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65  f the values are
6f80: 20 76 65 72 79 20 6c 61 72 67 65 2c 20 74 68 69   very large, thi
6f90: 73 20 0a 2a 2a 20 63 61 6e 20 62 65 20 6d 6f 72  s .** can be mor
6fa0: 65 20 65 66 66 69 63 69 65 6e 74 20 74 68 61 6e  e efficient than
6fb0: 20 73 74 6f 72 69 6e 67 20 74 68 65 6d 20 64 69   storing them di
6fc0: 72 65 63 74 6c 79 20 69 6e 20 74 68 65 20 73 6f  rectly in the so
6fd0: 72 74 65 72 20 72 65 63 6f 72 64 73 2e 0a 2a 2a  rter records..**
6fe0: 0a 2a 2a 20 54 68 65 20 45 78 70 72 4c 69 73 74  .** The ExprList
6ff0: 5f 69 74 65 6d 2e 62 53 6f 72 74 65 72 52 65 66  _item.bSorterRef
7000: 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72   flag is set for
7010: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
7020: 20 69 6e 20 70 45 4c 69 73 74 20 0a 2a 2a 20 66   in pEList .** f
7030: 6f 72 20 77 68 69 63 68 20 74 68 65 20 73 6f 72  or which the sor
7040: 74 65 72 2d 72 65 66 65 72 65 6e 63 65 20 6f 70  ter-reference op
7050: 74 69 6d 69 7a 61 74 69 6f 6e 20 73 68 6f 75 6c  timization shoul
7060: 64 20 62 65 20 65 6e 61 62 6c 65 64 2e 20 0a 2a  d be enabled. .*
7070: 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  * Additionally, 
7080: 74 68 65 20 70 53 6f 72 74 2d 3e 61 44 65 66 65  the pSort->aDefe
7090: 72 5b 5d 20 61 72 72 61 79 20 69 73 20 70 6f 70  r[] array is pop
70a0: 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 74 72  ulated with entr
70b0: 69 65 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 63  ies.** for all c
70c0: 75 72 73 6f 72 73 20 72 65 71 75 69 72 65 64 20  ursors required 
70d0: 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20  to evaluate all 
70e0: 73 65 6c 65 63 74 65 64 20 65 78 70 72 65 73 73  selected express
70f0: 69 6f 6e 73 2e 20 46 69 6e 61 6c 6c 79 2e 0a 2a  ions. Finally..*
7100: 2a 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  * output variabl
7110: 65 20 28 2a 70 70 45 78 74 72 61 29 20 69 73 20  e (*ppExtra) is 
7120: 73 65 74 20 74 6f 20 61 6e 20 65 78 70 72 65 73  set to an expres
7130: 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69  sion list contai
7140: 6e 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69  ning.** expressi
7150: 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 65 78 74 72  ons for all extr
7160: 61 20 50 4b 20 76 61 6c 75 65 73 20 74 68 61 74  a PK values that
7170: 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65   should be store
7180: 64 20 69 6e 20 74 68 65 0a 2a 2a 20 73 6f 72 74  d in the.** sort
7190: 65 72 20 72 65 63 6f 72 64 73 2e 0a 2a 2f 0a 73  er records..*/.s
71a0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
71b0: 74 45 78 70 72 44 65 66 65 72 28 0a 20 20 50 61  tExprDefer(.  Pa
71c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
71e0: 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72   Leave any error
71f0: 20 68 65 72 65 20 2a 2f 0a 20 20 53 6f 72 74 43   here */.  SortC
7200: 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20 20 20  tx *pSort,      
7210: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f             /* So
7220: 72 74 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rter context */.
7230: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
7240: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
7250: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
7260: 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 73 6f   destined for so
7270: 72 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69  rter */.  ExprLi
7280: 73 74 20 2a 2a 70 70 45 78 74 72 61 20 20 20 20  st **ppExtra    
7290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
72a0: 72 65 73 73 69 6f 6e 73 20 74 6f 20 61 70 70 65  ressions to appe
72b0: 6e 64 20 74 6f 20 73 6f 72 74 65 72 20 72 65 63  nd to sorter rec
72c0: 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ord */.){.  int 
72d0: 69 3b 0a 20 20 69 6e 74 20 6e 44 65 66 65 72 20  i;.  int nDefer 
72e0: 3d 20 30 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  = 0;.  ExprList 
72f0: 2a 70 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 66  *pExtra = 0;.  f
7300: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
7310: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
7320: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
7330: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
7340: 20 26 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a   &pEList->a[i];.
7350: 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75      if( pItem->u
7360: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d  .x.iOrderByCol==
7370: 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
7380: 2a 70 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e  *pExpr = pItem->
7390: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 54 61 62  pExpr;.      Tab
73a0: 6c 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72  le *pTab = pExpr
73b0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66  ->pTab;.      if
73c0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
73d0: 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d  COLUMN && pExpr-
73e0: 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70  >iColumn>=0 && p
73f0: 54 61 62 20 26 26 20 21 49 73 56 69 72 74 75 61  Tab && !IsVirtua
7400: 6c 28 70 54 61 62 29 0a 20 20 20 20 20 20 20 26  l(pTab).       &
7410: 26 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45  & (pTab->aCol[pE
7420: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 63 6f  xpr->iColumn].co
7430: 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47  lFlags & COLFLAG
7440: 5f 53 4f 52 54 45 52 52 45 46 29 0a 20 20 20 20  _SORTERREF).    
7450: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74    ){.        int
7460: 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   j;.        for(
7470: 6a 3d 30 3b 20 6a 3c 6e 44 65 66 65 72 3b 20 6a  j=0; j<nDefer; j
7480: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
7490: 66 28 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72  f( pSort->aDefer
74a0: 5b 6a 5d 2e 69 43 73 72 3d 3d 70 45 78 70 72 2d  [j].iCsr==pExpr-
74b0: 3e 69 54 61 62 6c 65 20 29 20 62 72 65 61 6b 3b  >iTable ) break;
74c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
74d0: 20 20 20 69 66 28 20 6a 3d 3d 6e 44 65 66 65 72     if( j==nDefer
74e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
74f0: 28 20 6e 44 65 66 65 72 3d 3d 41 72 72 61 79 53  ( nDefer==ArrayS
7500: 69 7a 65 28 70 53 6f 72 74 2d 3e 61 44 65 66 65  ize(pSort->aDefe
7510: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
7520: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
7530: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7540: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4b 65           int nKe
7550: 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  y = 1;.         
7560: 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
7570: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b        Index *pPk
7580: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
7590: 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28    if( !HasRowid(
75a0: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
75b0: 20 20 20 20 20 20 20 70 50 6b 20 3d 20 73 71 6c         pPk = sql
75c0: 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
75d0: 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20  dex(pTab);.     
75e0: 20 20 20 20 20 20 20 20 20 6e 4b 65 79 20 3d 20           nKey = 
75f0: 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20  pPk->nKeyCol;.  
7600: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7610: 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b          for(k=0;
7620: 20 6b 3c 6e 4b 65 79 3b 20 6b 2b 2b 29 7b 0a 20   k<nKey; k++){. 
7630: 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
7640: 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
7650: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
7660: 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30 29 3b  K_COLUMN, 0, 0);
7670: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
7680: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
7690: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d             pNew-
76a0: 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d  >iTable = pExpr-
76b0: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  >iTable;.       
76c0: 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
76d0: 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61  Tab = pExpr->pTa
76e0: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b;.             
76f0: 20 20 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e     pNew->iColumn
7700: 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 61 69   = pPk ? pPk->ai
7710: 43 6f 6c 75 6d 6e 5b 6b 5d 20 3a 20 2d 31 3b 0a  Column[k] : -1;.
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7730: 70 45 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33  pExtra = sqlite3
7740: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
7750: 50 61 72 73 65 2c 20 70 45 78 74 72 61 2c 20 70  Parse, pExtra, p
7760: 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20  New);.          
7770: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7780: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
7790: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6e 44  pSort->aDefer[nD
77a0: 65 66 65 72 5d 2e 70 54 61 62 20 3d 20 70 45 78  efer].pTab = pEx
77b0: 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  pr->pTab;.      
77c0: 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 61 44 65        pSort->aDe
77d0: 66 65 72 5b 6e 44 65 66 65 72 5d 2e 69 43 73 72  fer[nDefer].iCsr
77e0: 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
77f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  ;.            pS
7800: 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6e 44 65 66  ort->aDefer[nDef
7810: 65 72 5d 2e 6e 4b 65 79 20 3d 20 6e 4b 65 79 3b  er].nKey = nKey;
7820: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 44 65  .            nDe
7830: 66 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  fer++;.         
7840: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
7850: 20 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 6f 72       pItem->bSor
7860: 74 65 72 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  terRef = 1;.    
7870: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
7880: 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 20 3d 20  pSort->nDefer = 
7890: 28 75 38 29 6e 44 65 66 65 72 3b 0a 20 20 2a 70  (u8)nDefer;.  *p
78a0: 70 45 78 74 72 61 20 3d 20 70 45 78 74 72 61 3b  pExtra = pExtra;
78b0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
78c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
78d0: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
78e0: 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20   for the inside 
78f0: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
7900: 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54  p.** of a SELECT
7910: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61  ..**.** If srcTa
7920: 62 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  b is negative, t
7930: 68 65 6e 20 74 68 65 20 70 2d 3e 70 45 4c 69 73  hen the p->pELis
7940: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  t expressions.**
7950: 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69   are evaluated i
7960: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
7970: 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  he data for this
7980: 20 72 6f 77 2e 20 20 49 66 20 73 72 63 54 61 62   row.  If srcTab
7990: 20 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d   is.** zero or m
79a0: 6f 72 65 2c 20 74 68 65 6e 20 64 61 74 61 20 69  ore, then data i
79b0: 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72  s pulled from sr
79c0: 63 54 61 62 20 61 6e 64 20 70 2d 3e 70 45 4c 69  cTab and p->pELi
79d0: 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  st is used only 
79e0: 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20 6e  .** to get the n
79f0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
7a00: 20 61 6e 64 20 74 68 65 20 63 6f 6c 6c 61 74 69   and the collati
7a10: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  on sequence for 
7a20: 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  each column..*/.
7a30: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
7a40: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50  ctInnerLoop(.  P
7a50: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
7a60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
7a70: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
7a80: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
7a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
7aa0: 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74   complete select
7ab0: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
7ac0: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
7ad0: 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20  srcTab,         
7ae0: 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61      /* Pull data
7af0: 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65   from this table
7b00: 20 69 66 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   if non-negative
7b10: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
7b20: 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  Sort,         /*
7b30: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e   If not NULL, in
7b40: 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f  fo on how to pro
7b50: 63 65 73 73 20 4f 52 44 45 52 20 42 59 20 2a 2f  cess ORDER BY */
7b60: 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 2a  .  DistinctCtx *
7b70: 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66  pDistinct, /* If
7b80: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20   not NULL, info 
7b90: 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  on how to proces
7ba0: 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  s DISTINCT */.  
7bb0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
7bc0: 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74  t,      /* How t
7bd0: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
7be0: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
7bf0: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
7c00: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
7c10: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
7c20: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
7c30: 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
7c40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
7c50: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
7c60: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
7c70: 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64   loop */.){.  Vd
7c80: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
7c90: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
7ca0: 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63    int hasDistinc
7cb0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
7cc0: 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
7cd0: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
7ce0: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
7cf0: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
7d00: 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77  >eDest;   /* How
7d10: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72   to dispose of r
7d20: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
7d30: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
7d40: 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74  SDParm; /* First
7d50: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73   argument to dis
7d60: 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a  posal method */.
7d70: 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c    int nResultCol
7d80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7d90: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   Number of resul
7da0: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  t columns */.  i
7db0: 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20  nt nPrefixReg = 
7dc0: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  0;         /* Nu
7dd0: 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
7de0: 67 69 73 74 65 72 73 20 62 65 66 6f 72 65 20 72  gisters before r
7df0: 65 67 52 65 73 75 6c 74 20 2a 2f 0a 20 20 52 6f  egResult */.  Ro
7e00: 77 4c 6f 61 64 49 6e 66 6f 20 73 52 6f 77 4c 6f  wLoadInfo sRowLo
7e10: 61 64 49 6e 66 6f 3b 20 20 20 2f 2a 20 49 6e 66  adInfo;   /* Inf
7e20: 6f 20 66 6f 72 20 64 65 66 65 72 72 65 64 20 72  o for deferred r
7e30: 6f 77 20 6c 6f 61 64 69 6e 67 20 2a 2f 0a 0a 20  ow loading */.. 
7e40: 20 2f 2a 20 55 73 75 61 6c 6c 79 2c 20 72 65 67   /* Usually, reg
7e50: 52 65 73 75 6c 74 20 69 73 20 74 68 65 20 66 69  Result is the fi
7e60: 72 73 74 20 63 65 6c 6c 20 69 6e 20 61 6e 20 61  rst cell in an a
7e70: 72 72 61 79 20 6f 66 20 6d 65 6d 6f 72 79 20 63  rray of memory c
7e80: 65 6c 6c 73 0a 20 20 2a 2a 20 63 6f 6e 74 61 69  ells.  ** contai
7e90: 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ning the current
7ea0: 20 72 65 73 75 6c 74 20 72 6f 77 2e 20 49 6e 20   result row. In 
7eb0: 74 68 69 73 20 63 61 73 65 20 72 65 67 4f 72 69  this case regOri
7ec0: 67 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a  g is set to the.
7ed0: 20 20 2a 2a 20 73 61 6d 65 20 76 61 6c 75 65 2e    ** same value.
7ee0: 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
7ef0: 20 72 65 73 75 6c 74 73 20 61 72 65 20 62 65 69   results are bei
7f00: 6e 67 20 73 65 6e 74 20 74 6f 20 74 68 65 20 73  ng sent to the s
7f10: 6f 72 74 65 72 2c 20 74 68 65 0a 20 20 2a 2a 20  orter, the.  ** 
7f20: 76 61 6c 75 65 73 20 66 6f 72 20 61 6e 79 20 65  values for any e
7f30: 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
7f40: 61 72 65 20 61 6c 73 6f 20 70 61 72 74 20 6f 66  are also part of
7f50: 20 74 68 65 20 73 6f 72 74 2d 6b 65 79 20 61 72   the sort-key ar
7f60: 65 20 6f 6d 69 74 74 65 64 0a 20 20 2a 2a 20 66  e omitted.  ** f
7f70: 72 6f 6d 20 74 68 69 73 20 61 72 72 61 79 2e 20  rom this array. 
7f80: 49 6e 20 74 68 69 73 20 63 61 73 65 20 72 65 67  In this case reg
7f90: 4f 72 69 67 20 69 73 20 73 65 74 20 74 6f 20 7a  Orig is set to z
7fa0: 65 72 6f 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 72  ero.  */.  int r
7fb0: 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20  egResult;       
7fc0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20         /* Start 
7fd0: 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e  of memory holdin
7fe0: 67 20 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74  g current result
7ff0: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72  s */.  int regOr
8000: 69 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ig;             
8010: 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d     /* Start of m
8020: 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 66 75  emory holding fu
8030: 6c 6c 20 72 65 73 75 6c 74 20 28 6f 72 20 30 29  ll result (or 0)
8040: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76   */..  assert( v
8050: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
8060: 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  >pEList!=0 );.  
8070: 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20 70 44  hasDistinct = pD
8080: 69 73 74 69 6e 63 74 20 3f 20 70 44 69 73 74 69  istinct ? pDisti
8090: 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 3a  nct->eTnctType :
80a0: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
80b0: 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53 6f 72  NOOP;.  if( pSor
80c0: 74 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f 72 64  t && pSort->pOrd
80d0: 65 72 42 79 3d 3d 30 20 29 20 70 53 6f 72 74 20  erBy==0 ) pSort 
80e0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 53 6f 72 74  = 0;.  if( pSort
80f0: 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73 74 69  ==0 && !hasDisti
8100: 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nct ){.    asser
8110: 74 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20  t( iContinue!=0 
8120: 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  );.    codeOffse
8130: 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
8140: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d   iContinue);.  }
8150: 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20  ..  /* Pull the 
8160: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e  requested column
8170: 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73 75 6c  s..  */.  nResul
8180: 74 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74  tCol = p->pEList
8190: 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20  ->nExpr;..  if( 
81a0: 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20  pDest->iSdst==0 
81b0: 29 7b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74  ){.    if( pSort
81c0: 20 29 7b 0a 20 20 20 20 20 20 6e 50 72 65 66 69   ){.      nPrefi
81d0: 78 52 65 67 20 3d 20 70 53 6f 72 74 2d 3e 70 4f  xReg = pSort->pO
81e0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
81f0: 20 20 20 20 20 69 66 28 20 21 28 70 53 6f 72 74       if( !(pSort
8200: 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f  ->sortFlags & SO
8210: 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
8220: 29 20 29 20 6e 50 72 65 66 69 78 52 65 67 2b 2b  ) ) nPrefixReg++
8230: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
8240: 6e 4d 65 6d 20 2b 3d 20 6e 50 72 65 66 69 78 52  nMem += nPrefixR
8250: 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44  eg;.    }.    pD
8260: 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 70 50 61  est->iSdst = pPa
8270: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
8280: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
8290: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d   nResultCol;.  }
82a0: 65 6c 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e  else if( pDest->
82b0: 69 53 64 73 74 2b 6e 52 65 73 75 6c 74 43 6f 6c  iSdst+nResultCol
82c0: 20 3e 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   > pParse->nMem 
82d0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
82e0: 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69  s an error condi
82f0: 74 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 72 65  tion that can re
8300: 73 75 6c 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c  sult, for exampl
8310: 65 2c 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54  e, when a SELECT
8320: 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 72  .    ** on the r
8330: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
8340: 66 20 61 6e 20 49 4e 53 45 52 54 20 63 6f 6e 74  f an INSERT cont
8350: 61 69 6e 73 20 6d 6f 72 65 20 72 65 73 75 6c 74  ains more result
8360: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a 20 20   columns than.  
8370: 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 63    ** there are c
8380: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61  olumns in the ta
8390: 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 2e  ble on the left.
83a0: 20 20 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c    The error will
83b0: 20 62 65 20 63 61 75 67 68 74 0a 20 20 20 20 2a   be caught.    *
83c0: 2a 20 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c  * and reported l
83d0: 61 74 65 72 2e 20 20 42 75 74 20 77 65 20 6e 65  ater.  But we ne
83e0: 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
83f0: 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 69 73  enough memory is
8400: 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a   allocated.    *
8410: 2a 20 74 6f 20 61 76 6f 69 64 20 6f 74 68 65 72  * to avoid other
8420: 20 73 70 75 72 69 6f 75 73 20 65 72 72 6f 72 73   spurious errors
8430: 20 69 6e 20 74 68 65 20 6d 65 61 6e 74 69 6d 65   in the meantime
8440: 2e 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d  . */.    pParse-
8450: 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74  >nMem += nResult
8460: 43 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 73 74  Col;.  }.  pDest
8470: 2d 3e 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c  ->nSdst = nResul
8480: 74 43 6f 6c 3b 0a 20 20 72 65 67 4f 72 69 67 20  tCol;.  regOrig 
8490: 3d 20 72 65 67 52 65 73 75 6c 74 20 3d 20 70 44  = regResult = pD
84a0: 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 69 66  est->iSdst;.  if
84b0: 28 20 73 72 63 54 61 62 3e 3d 30 20 29 7b 0a 20  ( srcTab>=0 ){. 
84c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52     for(i=0; i<nR
84d0: 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  esultCol; i++){.
84e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
84f0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
8500: 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c  lumn, srcTab, i,
8510: 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20   regResult+i);. 
8520: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
8530: 28 28 76 2c 20 22 25 73 22 2c 20 70 2d 3e 70 45  ((v, "%s", p->pE
8540: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
8550: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ));.    }.  }els
8560: 65 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54  e if( eDest!=SRT
8570: 5f 45 78 69 73 74 73 20 29 7b 0a 23 69 66 64 65  _Exists ){.#ifde
8580: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8590: 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45  SORTER_REFERENCE
85a0: 53 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  S.    ExprList *
85b0: 70 45 78 74 72 61 20 3d 20 30 3b 0a 23 65 6e 64  pExtra = 0;.#end
85c0: 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  if.    /* If the
85d0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
85e0: 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29 20 65  an EXISTS(...) e
85f0: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 61  xpression, the a
8600: 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c  ctual.    ** val
8610: 75 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ues returned by 
8620: 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 6e  the SELECT are n
8630: 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  ot required..   
8640: 20 2a 2f 0a 20 20 20 20 75 38 20 65 63 65 6c 46   */.    u8 ecelF
8650: 6c 61 67 73 3b 20 20 20 20 2f 2a 20 22 65 63 65  lags;    /* "ece
8660: 6c 22 20 69 73 20 61 6e 20 61 62 62 72 65 76 69  l" is an abbrevi
8670: 61 74 69 6f 6e 20 6f 66 20 22 45 78 70 72 43 6f  ation of "ExprCo
8680: 64 65 45 78 70 72 4c 69 73 74 22 20 2a 2f 0a 20  deExprList" */. 
8690: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
86a0: 69 73 74 3b 0a 20 20 20 20 69 66 28 20 65 44 65  ist;.    if( eDe
86b0: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65  st==SRT_Mem || e
86c0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
86d0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
86e0: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
86f0: 20 20 65 63 65 6c 46 6c 61 67 73 20 3d 20 53 51    ecelFlags = SQ
8700: 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 3b 0a 20  LITE_ECEL_DUP;. 
8710: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8720: 65 63 65 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20  ecelFlags = 0;. 
8730: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f     }.    if( pSo
8740: 72 74 20 26 26 20 68 61 73 44 69 73 74 69 6e 63  rt && hasDistinc
8750: 74 3d 3d 30 20 26 26 20 65 44 65 73 74 21 3d 53  t==0 && eDest!=S
8760: 52 54 5f 45 70 68 65 6d 54 61 62 20 26 26 20 65  RT_EphemTab && e
8770: 44 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20  Dest!=SRT_Table 
8780: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ){.      /* For 
8790: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
87a0: 69 6e 20 70 2d 3e 70 45 4c 69 73 74 20 74 68 61  in p->pEList tha
87b0: 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 61  t is a copy of a
87c0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 0a  n expression in.
87d0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44        ** the ORD
87e0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 70 53  ER BY clause (pS
87f0: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 29 2c 20  ort->pOrderBy), 
8800: 73 65 74 20 74 68 65 20 61 73 73 6f 63 69 61 74  set the associat
8810: 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 69 4f 72  ed .      ** iOr
8820: 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 20 74  derByCol value t
8830: 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20  o one more than 
8840: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
8850: 20 4f 52 44 45 52 20 42 59 20 0a 20 20 20 20 20   ORDER BY .     
8860: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77   ** expression w
8870: 69 74 68 69 6e 20 74 68 65 20 73 6f 72 74 2d 6b  ithin the sort-k
8880: 65 79 20 74 68 61 74 20 70 75 73 68 4f 6e 74 6f  ey that pushOnto
8890: 53 6f 72 74 65 72 28 29 20 77 69 6c 6c 20 67 65  Sorter() will ge
88a0: 6e 65 72 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a  nerate..      **
88b0: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65   This allows the
88c0: 20 70 2d 3e 70 45 4c 69 73 74 20 66 69 65 6c 64   p->pEList field
88d0: 20 74 6f 20 62 65 20 6f 6d 69 74 74 65 64 20 66   to be omitted f
88e0: 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 64 20 72  rom the sorted r
88f0: 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 2a 2a 20  ecord,.      ** 
8900: 73 61 76 69 6e 67 20 73 70 61 63 65 20 61 6e 64  saving space and
8910: 20 43 50 55 20 63 79 63 6c 65 73 2e 20 20 2a 2f   CPU cycles.  */
8920: 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73  .      ecelFlags
8930: 20 7c 3d 20 28 53 51 4c 49 54 45 5f 45 43 45 4c   |= (SQLITE_ECEL
8940: 5f 4f 4d 49 54 52 45 46 7c 53 51 4c 49 54 45 5f  _OMITREF|SQLITE_
8950: 45 43 45 4c 5f 52 45 46 29 3b 0a 0a 20 20 20 20  ECEL_REF);..    
8960: 20 20 66 6f 72 28 69 3d 70 53 6f 72 74 2d 3e 6e    for(i=pSort->n
8970: 4f 42 53 61 74 3b 20 69 3c 70 53 6f 72 74 2d 3e  OBSat; i<pSort->
8980: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
8990: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
89a0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 69 66  nt j;.        if
89b0: 28 20 28 6a 20 3d 20 70 53 6f 72 74 2d 3e 70 4f  ( (j = pSort->pO
89c0: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78  rderBy->a[i].u.x
89d0: 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30 20  .iOrderByCol)>0 
89e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
89f0: 70 45 4c 69 73 74 2d 3e 61 5b 6a 2d 31 5d 2e 75  pEList->a[j-1].u
8a00: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d  .x.iOrderByCol =
8a10: 20 69 2b 31 2d 70 53 6f 72 74 2d 3e 6e 4f 42 53   i+1-pSort->nOBS
8a20: 61 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  at;.        }.  
8a30: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
8a40: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45  ITE_ENABLE_SORTE
8a50: 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20  R_REFERENCES.   
8a60: 20 20 20 73 65 6c 65 63 74 45 78 70 72 44 65 66     selectExprDef
8a70: 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  er(pParse, pSort
8a80: 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 26 70 45  , p->pEList, &pE
8a90: 78 74 72 61 29 3b 0a 20 20 20 20 20 20 69 66 28  xtra);.      if(
8aa0: 20 70 45 78 74 72 61 20 26 26 20 70 50 61 72 73   pExtra && pPars
8ab0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
8ac0: 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  led==0 ){.      
8ad0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
8ae0: 65 20 61 6e 79 20 65 78 74 72 61 20 50 4b 20 63  e any extra PK c
8af0: 6f 6c 75 6d 6e 73 20 74 6f 20 61 64 64 20 74 6f  olumns to add to
8b00: 20 74 68 65 20 73 6f 72 74 65 72 20 72 65 63 6f   the sorter reco
8b10: 72 64 73 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rds,.        ** 
8b20: 61 6c 6c 6f 63 61 74 65 20 65 78 74 72 61 20 6d  allocate extra m
8b30: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64 20  emory cells and 
8b40: 61 64 6a 75 73 74 20 74 68 65 20 4f 70 65 6e 45  adjust the OpenE
8b50: 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 20 20  phemeral .      
8b60: 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
8b70: 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20   to account for 
8b80: 74 68 65 20 6c 61 72 67 65 72 20 72 65 63 6f 72  the larger recor
8b90: 64 73 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c 79  ds. This is only
8ba0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 71 75  .        ** requ
8bb0: 69 72 65 64 20 69 66 20 74 68 65 72 65 20 61 72  ired if there ar
8bc0: 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 49  e one or more WI
8bd0: 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
8be0: 65 73 20 77 69 74 68 0a 20 20 20 20 20 20 20 20  es with.        
8bf0: 2a 2a 20 63 6f 6d 70 6f 73 69 74 65 20 70 72 69  ** composite pri
8c00: 6d 61 72 79 20 6b 65 79 73 20 69 6e 20 74 68 65  mary keys in the
8c10: 20 53 6f 72 74 43 74 78 2e 61 44 65 66 65 72 5b   SortCtx.aDefer[
8c20: 5d 20 61 72 72 61 79 2e 20 20 2a 2f 0a 20 20 20  ] array.  */.   
8c30: 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70       VdbeOp *pOp
8c40: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
8c50: 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d 3e 61 64  tOp(v, pSort->ad
8c60: 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20  drSortIndex);.  
8c70: 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 2b 3d        pOp->p2 +=
8c80: 20 28 70 45 78 74 72 61 2d 3e 6e 45 78 70 72 20   (pExtra->nExpr 
8c90: 2d 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 29  - pSort->nDefer)
8ca0: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
8cb0: 34 2e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c  4.pKeyInfo->nAll
8cc0: 46 69 65 6c 64 20 2b 3d 20 28 70 45 78 74 72 61  Field += (pExtra
8cd0: 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d  ->nExpr - pSort-
8ce0: 3e 6e 44 65 66 65 72 29 3b 0a 20 20 20 20 20 20  >nDefer);.      
8cf0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
8d00: 3d 20 70 45 78 74 72 61 2d 3e 6e 45 78 70 72 3b  = pExtra->nExpr;
8d10: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
8d20: 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74  .      /* Adjust
8d30: 20 6e 52 65 73 75 6c 74 43 6f 6c 20 74 6f 20 61   nResultCol to a
8d40: 63 63 6f 75 6e 74 20 66 6f 72 20 63 6f 6c 75 6d  ccount for colum
8d50: 6e 73 20 74 68 61 74 20 61 72 65 20 6f 6d 69 74  ns that are omit
8d60: 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f  ted.      ** fro
8d70: 6d 20 74 68 65 20 73 6f 72 74 65 72 20 62 79 20  m the sorter by 
8d80: 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
8d90: 73 20 69 6e 20 74 68 69 73 20 62 72 61 6e 63 68  s in this branch
8da0: 20 2a 2f 0a 20 20 20 20 20 20 70 45 4c 69 73 74   */.      pEList
8db0: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
8dc0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
8dd0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
8de0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
8df0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 75 2e 78  pEList->a[i].u.x
8e00: 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 0a 23  .iOrderByCol>0.#
8e10: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
8e20: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
8e30: 45 4e 43 45 53 0a 20 20 20 20 20 20 20 20 20 7c  ENCES.         |
8e40: 7c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 62  | pEList->a[i].b
8e50: 53 6f 72 74 65 72 52 65 66 0a 23 65 6e 64 69 66  SorterRef.#endif
8e60: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
8e70: 20 20 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c        nResultCol
8e80: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  --;.          re
8e90: 67 4f 72 69 67 20 3d 20 30 3b 0a 20 20 20 20 20  gOrig = 0;.     
8ea0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
8eb0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
8ec0: 67 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 74  gOrig );.      t
8ed0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
8ee0: 53 52 54 5f 53 65 74 20 29 3b 0a 20 20 20 20 20  SRT_Set );.     
8ef0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
8f00: 3d 3d 53 52 54 5f 4d 65 6d 20 29 3b 0a 20 20 20  ==SRT_Mem );.   
8f10: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
8f20: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
8f30: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
8f40: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
8f50: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
8f60: 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53  assert( eDest==S
8f70: 52 54 5f 53 65 74 20 7c 7c 20 65 44 65 73 74 3d  RT_Set || eDest=
8f80: 3d 53 52 54 5f 4d 65 6d 20 0a 20 20 20 20 20 20  =SRT_Mem .      
8f90: 20 20 20 20 20 7c 7c 20 65 44 65 73 74 3d 3d 53       || eDest==S
8fa0: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 7c 7c 20  RT_Coroutine || 
8fb0: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
8fc0: 74 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  t );.    }.    s
8fd0: 52 6f 77 4c 6f 61 64 49 6e 66 6f 2e 72 65 67 52  RowLoadInfo.regR
8fe0: 65 73 75 6c 74 20 3d 20 72 65 67 52 65 73 75 6c  esult = regResul
8ff0: 74 3b 0a 20 20 20 20 73 52 6f 77 4c 6f 61 64 49  t;.    sRowLoadI
9000: 6e 66 6f 2e 65 63 65 6c 46 6c 61 67 73 20 3d 20  nfo.ecelFlags = 
9010: 65 63 65 6c 46 6c 61 67 73 3b 0a 23 69 66 64 65  ecelFlags;.#ifde
9020: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
9030: 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45  SORTER_REFERENCE
9040: 53 0a 20 20 20 20 73 52 6f 77 4c 6f 61 64 49 6e  S.    sRowLoadIn
9050: 66 6f 2e 70 45 78 74 72 61 20 3d 20 70 45 78 74  fo.pExtra = pExt
9060: 72 61 3b 0a 20 20 20 20 73 52 6f 77 4c 6f 61 64  ra;.    sRowLoad
9070: 49 6e 66 6f 2e 72 65 67 45 78 74 72 61 52 65 73  Info.regExtraRes
9080: 75 6c 74 20 3d 20 72 65 67 52 65 73 75 6c 74 20  ult = regResult 
9090: 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  + nResultCol;.  
90a0: 20 20 69 66 28 20 70 45 78 74 72 61 20 29 20 6e    if( pExtra ) n
90b0: 52 65 73 75 6c 74 43 6f 6c 20 2b 3d 20 70 45 78  ResultCol += pEx
90c0: 74 72 61 2d 3e 6e 45 78 70 72 3b 0a 23 65 6e 64  tra->nExpr;.#end
90d0: 69 66 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 4c  if.    if( p->iL
90e0: 69 6d 69 74 0a 20 20 20 20 20 26 26 20 28 65 63  imit.     && (ec
90f0: 65 6c 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  elFlags & SQLITE
9100: 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 29 21 3d  _ECEL_OMITREF)!=
9110: 30 20 0a 20 20 20 20 20 26 26 20 6e 50 72 65 66  0 .     && nPref
9120: 69 78 52 65 67 3e 30 0a 20 20 20 20 29 7b 0a 20  ixReg>0.    ){. 
9130: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 6f       assert( pSo
9140: 72 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  rt!=0 );.      a
9150: 73 73 65 72 74 28 20 68 61 73 44 69 73 74 69 6e  ssert( hasDistin
9160: 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ct==0 );.      p
9170: 53 6f 72 74 2d 3e 70 44 65 66 65 72 72 65 64 52  Sort->pDeferredR
9180: 6f 77 4c 6f 61 64 20 3d 20 26 73 52 6f 77 4c 6f  owLoad = &sRowLo
9190: 61 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 72 65  adInfo;.      re
91a0: 67 4f 72 69 67 20 3d 20 30 3b 0a 20 20 20 20 7d  gOrig = 0;.    }
91b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 6e 65  else{.      inne
91c0: 72 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28 70 50 61  rLoopLoadRow(pPa
91d0: 72 73 65 2c 20 70 2c 20 26 73 52 6f 77 4c 6f 61  rse, p, &sRowLoa
91e0: 64 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  dInfo);.    }.  
91f0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44  }..  /* If the D
9200: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
9210: 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74  was present on t
9220: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
9230: 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69  ent.  ** and thi
9240: 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73  s row has been s
9250: 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e  een before, then
9260: 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69   do not make thi
9270: 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20  s row.  ** part 
9280: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20  of the result.. 
9290: 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73   */.  if( hasDis
92a0: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 77 69  tinct ){.    swi
92b0: 74 63 68 28 20 70 44 69 73 74 69 6e 63 74 2d 3e  tch( pDistinct->
92c0: 65 54 6e 63 74 54 79 70 65 20 29 7b 0a 20 20 20  eTnctType ){.   
92d0: 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49     case WHERE_DI
92e0: 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20  STINCT_ORDERED: 
92f0: 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70  {.        VdbeOp
9300: 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20   *pOp;          
9310: 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72    /* No longer r
9320: 65 71 75 69 72 65 64 20 4f 70 65 6e 45 70 68 65  equired OpenEphe
9330: 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a  meral instr. */.
9340: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d          int iJum
9350: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
9360: 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74  /* Jump destinat
9370: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ion */.        i
9380: 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20  nt regPrev;     
9390: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
93a0: 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a  us row content *
93b0: 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  /..        /* Al
93c0: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
93d0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f   the previous ro
93e0: 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67  w */.        reg
93f0: 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Prev = pParse->n
9400: 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 70  Mem+1;.        p
9410: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
9420: 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20  ResultCol;..    
9430: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68      /* Change th
9440: 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
9450: 61 6c 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72  al coded earlier
9460: 20 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20   to an OP_Null. 
9470: 20 20 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74         ** sets t
9480: 68 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62  he MEM_Cleared b
9490: 69 74 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20  it on the first 
94a0: 72 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a  register of the.
94b0: 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69          ** previ
94c0: 6f 75 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73  ous value.  This
94d0: 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20   will cause the 
94e0: 4f 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61  OP_Ne below to a
94f0: 6c 77 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a  lways.        **
9500: 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72   fail on the fir
9510: 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  st iteration of 
9520: 74 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66  the loop even if
9530: 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20   the first.     
9540: 20 20 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c     ** row is all
9550: 20 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20   NULLs..        
9560: 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
9570: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
9580: 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d  op(v, pDistinct-
9590: 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20  >addrTnct);.    
95a0: 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65      pOp = sqlite
95b0: 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44  3VdbeGetOp(v, pD
95c0: 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63  istinct->addrTnc
95d0: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  t);.        pOp-
95e0: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c  >opcode = OP_Nul
95f0: 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  l;.        pOp->
9600: 70 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  p1 = 1;.        
9610: 70 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65  pOp->p2 = regPre
9620: 76 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d  v;..        iJum
9630: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
9640: 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
9650: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20  nResultCol;.    
9660: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
9670: 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b  ResultCol; i++){
9680: 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  .          CollS
9690: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *pColl = sqli
96a0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
96b0: 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
96c0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
96d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e           if( i<n
96e0: 52 65 73 75 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20  ResultCol-1 ){. 
96f0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
9700: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
9710: 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73 75 6c 74  OP_Ne, regResult
9720: 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65 67 50 72  +i, iJump, regPr
9730: 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20  ev+i);.         
9740: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
9750: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  v);.          }e
9760: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
9770: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9780: 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67  p3(v, OP_Eq, reg
9790: 52 65 73 75 6c 74 2b 69 2c 20 69 43 6f 6e 74 69  Result+i, iConti
97a0: 6e 75 65 2c 20 72 65 67 50 72 65 76 2b 69 29 3b  nue, regPrev+i);
97b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62  .            Vdb
97c0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
97d0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
97e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
97f0: 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
9800: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43  (const char *)pC
9810: 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
9820: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
9830: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
9840: 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  v, SQLITE_NULLEQ
9850: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
9860: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
9870: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
9880: 64 64 72 28 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c  ddr(v)==iJump ||
9890: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
98a0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
98b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
98c0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
98d0: 79 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65  y, regResult, re
98e0: 67 50 72 65 76 2c 20 6e 52 65 73 75 6c 74 43 6f  gPrev, nResultCo
98f0: 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72  l-1);.        br
9900: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
9910: 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
9920: 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20  ISTINCT_UNIQUE: 
9930: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9940: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
9950: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
9960: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
9970: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9980: 7d 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  }..      default
9990: 3a 20 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  : {.        asse
99a0: 72 74 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65  rt( pDistinct->e
99b0: 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f  TnctType==WHERE_
99c0: 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52  DISTINCT_UNORDER
99d0: 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ED );.        co
99e0: 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73  deDistinct(pPars
99f0: 65 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 74 61  e, pDistinct->ta
9a00: 62 54 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65  bTnct, iContinue
9a10: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20  , nResultCol,.  
9a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a30: 20 20 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20     regResult);. 
9a40: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9a50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9a60: 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 29 7b 0a  if( pSort==0 ){.
9a70: 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74        codeOffset
9a80: 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  (v, p->iOffset, 
9a90: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  iContinue);.    
9aa0: 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  }.  }..  switch(
9ab0: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a   eDest ){.    /*
9ac0: 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77   In this mode, w
9ad0: 72 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20  rite each query 
9ae0: 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65  result to the ke
9af0: 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  y of the tempora
9b00: 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  ry.    ** table 
9b10: 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69  iParm..    */.#i
9b20: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9b30: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
9b40: 54 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55  T.    case SRT_U
9b50: 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  nion: {.      in
9b60: 74 20 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d  t r1;.      r1 =
9b70: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
9b80: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
9b90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9ba0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
9bb0: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
9bc0: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29   nResultCol, r1)
9bd0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
9be0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
9bf0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
9c00: 61 72 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75  arm, r1, regResu
9c10: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
9c20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
9c30: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
9c40: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
9c50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
9c60: 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61    /* Construct a
9c70: 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
9c80: 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62   query result, b
9c90: 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20  ut instead of.  
9ca0: 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74    ** saving that
9cb0: 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20   record, use it 
9cc0: 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65  as a key to dele
9cd0: 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d  te elements from
9ce0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70  .    ** the temp
9cf0: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72  orary table iPar
9d00: 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  m..    */.    ca
9d10: 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b  se SRT_Except: {
9d20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9d30: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
9d40: 64 78 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c  dxDelete, iParm,
9d50: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
9d60: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62  ultCol);.      b
9d70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
9d80: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
9d90: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
9da0: 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 74 6f  T */..    /* Sto
9db0: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  re the result as
9dc0: 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e   data using a un
9dd0: 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f  ique key..    */
9de0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 46 69  .    case SRT_Fi
9df0: 66 6f 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  fo:.    case SRT
9e00: 5f 44 69 73 74 46 69 66 6f 3a 0a 20 20 20 20 63  _DistFifo:.    c
9e10: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
9e20: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
9e30: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e  mTab: {.      in
9e40: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
9e50: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
9e60: 65 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29  e, nPrefixReg+1)
9e70: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
9e80: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62  ( eDest==SRT_Tab
9e90: 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  le );.      test
9ea0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
9eb0: 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20  _EphemTab );.   
9ec0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
9ed0: 73 74 3d 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a  st==SRT_Fifo );.
9ee0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9ef0: 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46  eDest==SRT_DistF
9f00: 69 66 6f 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ifo );.      sql
9f10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
9f20: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
9f30: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
9f40: 75 6c 74 43 6f 6c 2c 20 72 31 2b 6e 50 72 65 66  ultCol, r1+nPref
9f50: 69 78 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20  ixReg);.#ifndef 
9f60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
9f70: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
9f80: 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29 7b  =SRT_DistFifo ){
9f90: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
9fa0: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  he destination i
9fb0: 73 20 44 69 73 74 46 69 66 6f 2c 20 74 68 65 6e  s DistFifo, then
9fc0: 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31   cursor (iParm+1
9fd0: 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20  ) is open.      
9fe0: 20 20 2a 2a 20 6f 6e 20 61 6e 20 65 70 68 65 6d    ** on an ephem
9ff0: 65 72 61 6c 20 69 6e 64 65 78 2e 20 49 66 20 74  eral index. If t
a000: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69  he current row i
a010: 73 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e  s already presen
a020: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  t.        ** in 
a030: 74 68 65 20 69 6e 64 65 78 2c 20 64 6f 20 6e 6f  the index, do no
a040: 74 20 77 72 69 74 65 20 69 74 20 74 6f 20 74 68  t write it to th
a050: 65 20 6f 75 74 70 75 74 2e 20 49 66 20 6e 6f 74  e output. If not
a060: 2c 20 61 64 64 20 74 68 65 0a 20 20 20 20 20 20  , add the.      
a070: 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 72 6f 77    ** current row
a080: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 61 6e   to the index an
a090: 64 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 77  d proceed with w
a0a0: 72 69 74 69 6e 67 20 69 74 20 74 6f 20 74 68 65  riting it to the
a0b0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70  .        ** outp
a0c0: 75 74 20 74 61 62 6c 65 20 61 73 20 77 65 6c 6c  ut table as well
a0d0: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  .  */.        in
a0e0: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33  t addr = sqlite3
a0f0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
a100: 76 29 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20  v) + 4;.        
a110: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a120: 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
a130: 2c 20 69 50 61 72 6d 2b 31 2c 20 61 64 64 72 2c  , iParm+1, addr,
a140: 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20   r1, 0);.       
a150: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
a160: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a170: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
a180: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
a190: 69 50 61 72 6d 2b 31 2c 20 72 31 2c 72 65 67 52  iParm+1, r1,regR
a1a0: 65 73 75 6c 74 2c 6e 52 65 73 75 6c 74 43 6f 6c  esult,nResultCol
a1b0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
a1c0: 74 28 20 70 53 6f 72 74 3d 3d 30 20 29 3b 0a 20  t( pSort==0 );. 
a1d0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
a1e0: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b      if( pSort ){
a1f0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a200: 20 72 65 67 52 65 73 75 6c 74 3d 3d 72 65 67 4f   regResult==regO
a210: 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20 20 70  rig );.        p
a220: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
a230: 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20  arse, pSort, p, 
a240: 72 31 2b 6e 50 72 65 66 69 78 52 65 67 2c 20 72  r1+nPrefixReg, r
a250: 65 67 4f 72 69 67 2c 20 31 2c 20 6e 50 72 65 66  egOrig, 1, nPref
a260: 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65  ixReg);.      }e
a270: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
a280: 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
a290: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
a2a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a2b0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
a2c0: 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d  _NewRowid, iParm
a2d0: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73  , r2);.        s
a2e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
a2f0: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69  (v, OP_Insert, i
a300: 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20  Parm, r1, r2);. 
a310: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a320: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
a330: 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
a340: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
a350: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
a360: 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d  se, r2);.      }
a370: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
a380: 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
a390: 50 61 72 73 65 2c 20 72 31 2c 20 6e 50 72 65 66  Parse, r1, nPref
a3a0: 69 78 52 65 67 2b 31 29 3b 0a 20 20 20 20 20 20  ixReg+1);.      
a3b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
a3c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a3d0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f  T_SUBQUERY.    /
a3e0: 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
a3f0: 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
a400: 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
a410: 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75  CT ...)" constru
a420: 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ct,.    ** then 
a430: 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
a440: 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e  a single item on
a450: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69   the stack.  Wri
a460: 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  te this.    ** i
a470: 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74  tem into the set
a480: 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75   table with bogu
a490: 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  s data..    */. 
a4a0: 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
a4b0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f   {.      if( pSo
a4c0: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  rt ){.        /*
a4d0: 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65   At first glance
a4e0: 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b   you would think
a4f0: 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69   we could optimi
a500: 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20  ze out the.     
a510: 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69     ** ORDER BY i
a520: 6e 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63  n this case sinc
a530: 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65  e the order of e
a540: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65  ntries in the se
a550: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65  t.        ** doe
a560: 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42  s not matter.  B
a570: 75 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62  ut there might b
a580: 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  e a LIMIT clause
a590: 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20  , in which.     
a5a0: 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f     ** case the o
a5b0: 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72  rder does matter
a5c0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68   */.        push
a5d0: 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 20 20  OntoSorter(.    
a5e0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
a5f0: 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73  pSort, p, regRes
a600: 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52  ult, regOrig, nR
a610: 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65 66 69  esultCol, nPrefi
a620: 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xReg);.      }el
a630: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
a640: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
a650: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
a660: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a670: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
a680: 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 29  pDest->zAffSdst)
a690: 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c 20 29 3b 0a  ==nResultCol );.
a6a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a6b0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
a6c0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
a6d0: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
a6e0: 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  l, .            
a6f0: 72 31 2c 20 70 44 65 73 74 2d 3e 7a 41 66 66 53  r1, pDest->zAffS
a700: 64 73 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  dst, nResultCol)
a710: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a720: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
a730: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
a740: 69 50 61 72 6d 2c 20 72 31 2c 20 72 65 67 52 65  iParm, r1, regRe
a750: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
a760: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
a770: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
a780: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
a790: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
a7a0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
a7b0: 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73   If any row exis
a7c0: 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  t in the result 
a7d0: 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74  set, record that
a7e0: 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e   fact and abort.
a7f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
a800: 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20   SRT_Exists: {. 
a810: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a820: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
a830: 65 67 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b  eger, 1, iParm);
a840: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
a850: 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
a860: 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
a870: 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
a880: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a890: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
a8a0: 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65  is a scalar sele
a8b0: 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20  ct that is part 
a8c0: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
a8d0: 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74  , then.    ** st
a8e0: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
a8f0: 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  in the appropria
a900: 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6f  te memory cell o
a910: 72 20 61 72 72 61 79 20 6f 66 20 0a 20 20 20 20  r array of .    
a920: 2a 2a 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  ** memory cells 
a930: 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 20 6f 66  and break out of
a940: 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a   the scan loop..
a950: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
a960: 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
a970: 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20   if( pSort ){.  
a980: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52        assert( nR
a990: 65 73 75 6c 74 43 6f 6c 3c 3d 70 44 65 73 74 2d  esultCol<=pDest-
a9a0: 3e 6e 53 64 73 74 20 29 3b 0a 20 20 20 20 20 20  >nSdst );.      
a9b0: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
a9c0: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
a9d0: 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20  arse, pSort, p, 
a9e0: 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72  regResult, regOr
a9f0: 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20  ig, nResultCol, 
aa00: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20  nPrefixReg);.   
aa10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
aa20: 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c    assert( nResul
aa30: 74 43 6f 6c 3d 3d 70 44 65 73 74 2d 3e 6e 53 64  tCol==pDest->nSd
aa40: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  st );.        as
aa50: 73 65 72 74 28 20 72 65 67 52 65 73 75 6c 74 3d  sert( regResult=
aa60: 3d 69 50 61 72 6d 20 29 3b 0a 20 20 20 20 20 20  =iParm );.      
aa70: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
aa80: 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20  lause will jump 
aa90: 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
aaa0: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
aab0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
aac0: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23     }.#endif /* #
aad0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
aae0: 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
aaf0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72      case SRT_Cor
ab00: 6f 75 74 69 6e 65 3a 20 20 20 20 20 20 20 2f 2a  outine:       /*
ab10: 20 53 65 6e 64 20 64 61 74 61 20 74 6f 20 61 20   Send data to a 
ab20: 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  co-routine */.  
ab30: 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74 70 75    case SRT_Outpu
ab40: 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 52  t: {        /* R
ab50: 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
ab60: 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  s */.      testc
ab70: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
ab80: 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20  Coroutine );.   
ab90: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
aba0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
abb0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72  ;.      if( pSor
abc0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  t ){.        pus
abd0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
abe0: 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65  se, pSort, p, re
abf0: 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67  gResult, regOrig
ac00: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20  , nResultCol,.  
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac20: 20 20 20 20 20 6e 50 72 65 66 69 78 52 65 67 29       nPrefixReg)
ac30: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
ac40: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
ac50: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  outine ){.      
ac60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ac70: 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
ac80: 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29   pDest->iSDParm)
ac90: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
aca0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
acb0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
acc0: 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73  esultRow, regRes
acd0: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  ult, nResultCol)
ace0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
acf0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
ad00: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ad10: 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20 57 72 69  T_CTE.    /* Wri
ad20: 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  te the results i
ad30: 6e 74 6f 20 61 20 70 72 69 6f 72 69 74 79 20 71  nto a priority q
ad40: 75 65 75 65 20 74 68 61 74 20 69 73 20 6f 72 64  ueue that is ord
ad50: 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 0a  er according to.
ad60: 20 20 20 20 2a 2a 20 70 44 65 73 74 2d 3e 70 4f      ** pDest->pO
ad70: 72 64 65 72 42 79 20 28 69 6e 20 70 53 4f 29 2e  rderBy (in pSO).
ad80: 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d    pDest->iSDParm
ad90: 20 28 69 6e 20 69 50 61 72 6d 29 20 69 73 20 74   (in iParm) is t
ada0: 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 61 6e  he cursor for an
adb0: 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 77 69  .    ** index wi
adc0: 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72 2b 32 20  th pSO->nExpr+2 
add0: 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69 6c 64 20  columns.  Build 
ade0: 61 20 6b 65 79 20 75 73 69 6e 67 20 70 53 4f 20  a key using pSO 
adf0: 66 6f 72 20 74 68 65 20 66 69 72 73 74 0a 20 20  for the first.  
ae00: 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70 72 20    ** pSO->nExpr 
ae10: 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6d 61  columns, then ma
ae20: 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b 65 79 73  ke sure all keys
ae30: 20 61 72 65 20 75 6e 69 71 75 65 20 62 79 20 61   are unique by a
ae40: 64 64 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66  dding a.    ** f
ae50: 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65 6e 63 65  inal OP_Sequence
ae60: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 6c 61   column.  The la
ae70: 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65  st column is the
ae80: 20 72 65 63 6f 72 64 20 61 73 20 61 20 62 6c 6f   record as a blo
ae90: 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  b..    */.    ca
aea0: 73 65 20 53 52 54 5f 44 69 73 74 51 75 65 75 65  se SRT_DistQueue
aeb0: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 51  :.    case SRT_Q
aec0: 75 65 75 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e  ueue: {.      in
aed0: 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20 69 6e  t nKey;.      in
aee0: 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 20 20  t r1, r2, r3;.  
aef0: 20 20 20 20 69 6e 74 20 61 64 64 72 54 65 73 74      int addrTest
af00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72   = 0;.      Expr
af10: 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20 20 20 20  List *pSO;.     
af20: 20 70 53 4f 20 3d 20 70 44 65 73 74 2d 3e 70 4f   pSO = pDest->pO
af30: 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 61 73  rderBy;.      as
af40: 73 65 72 74 28 20 70 53 4f 20 29 3b 0a 20 20 20  sert( pSO );.   
af50: 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f 2d 3e 6e     nKey = pSO->n
af60: 45 78 70 72 3b 0a 20 20 20 20 20 20 72 31 20 3d  Expr;.      r1 =
af70: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
af80: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
af90: 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65    r2 = sqlite3Ge
afa0: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
afb0: 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20  e, nKey+2);.    
afc0: 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65 79 2b 31    r3 = r2+nKey+1
afd0: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  ;.      if( eDes
afe0: 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65  t==SRT_DistQueue
aff0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
b000: 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  f the destinatio
b010: 6e 20 69 73 20 44 69 73 74 51 75 65 75 65 2c 20  n is DistQueue, 
b020: 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50 61  then cursor (iPa
b030: 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20 20  rm+1) is open.  
b040: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20 73 65        ** on a se
b050: 63 6f 6e 64 20 65 70 68 65 6d 65 72 61 6c 20 69  cond ephemeral i
b060: 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20  ndex that holds 
b070: 61 6c 6c 20 76 61 6c 75 65 73 20 65 76 65 72 79  all values every
b080: 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 20 20   previously.    
b090: 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74 6f 20      ** added to 
b0a0: 74 68 65 20 71 75 65 75 65 2e 20 2a 2f 0a 20 20  the queue. */.  
b0b0: 20 20 20 20 20 20 61 64 64 72 54 65 73 74 20 3d        addrTest =
b0c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b0d0: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
b0e0: 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30 2c 20 0a  d, iParm+1, 0, .
b0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b110: 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c          regResul
b120: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
b130: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
b140: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
b150: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b160: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
b170: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
b180: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
b190: 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 69 66 28  , r3);.      if(
b1a0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74   eDest==SRT_Dist
b1b0: 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20  Queue ){.       
b1c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b1d0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
b1e0: 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 33 29  rt, iParm+1, r3)
b1f0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b200: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
b210: 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
b220: 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20 7d 0a  ESULT);.      }.
b230: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
b240: 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nKey; i++){.   
b250: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b260: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
b270: 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  py,.            
b280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
b290: 67 52 65 73 75 6c 74 20 2b 20 70 53 4f 2d 3e 61  gResult + pSO->a
b2a0: 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
b2b0: 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20 20 20 20  Col - 1,.       
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2d0: 20 20 20 72 32 2b 69 29 3b 0a 20 20 20 20 20 20     r2+i);.      
b2e0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
b2f0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b300: 53 65 71 75 65 6e 63 65 2c 20 69 50 61 72 6d 2c  Sequence, iParm,
b310: 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20 20 20 20   r2+nKey);.     
b320: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b330: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
b340: 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 2c  ord, r2, nKey+2,
b350: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
b360: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
b370: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
b380: 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 2c  , iParm, r1, r2,
b390: 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20   nKey+2);.      
b3a0: 69 66 28 20 61 64 64 72 54 65 73 74 20 29 20 73  if( addrTest ) s
b3b0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
b3c0: 72 65 28 76 2c 20 61 64 64 72 54 65 73 74 29 3b  re(v, addrTest);
b3d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
b3e0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
b3f0: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
b400: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
b410: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
b420: 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20  r2, nKey+2);.   
b430: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b440: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
b450: 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 0a 0a  _OMIT_CTE */....
b460: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
b470: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
b480: 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64  ).    /* Discard
b490: 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54   the results.  T
b4a0: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
b4b0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
b4c0: 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20  s inside.    ** 
b4d0: 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52  the body of a TR
b4e0: 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72 70  IGGER.  The purp
b4f0: 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65  ose of such sele
b500: 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20  cts is to call. 
b510: 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e     ** user-defin
b520: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61  ed functions tha
b530: 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66 65  t have side effe
b540: 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  cts.  We do not 
b550: 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75  care.    ** abou
b560: 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 73  t the actual res
b570: 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ults of the sele
b580: 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ct..    */.    d
b590: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
b5a0: 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53  assert( eDest==S
b5b0: 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20  RT_Discard );.  
b5c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b5d0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
b5e0: 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  * Jump to the en
b5f0: 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66  d of the loop if
b600: 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65   the LIMIT is re
b610: 61 63 68 65 64 2e 20 20 45 78 63 65 70 74 2c 20  ached.  Except, 
b620: 69 66 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73  if.  ** there is
b630: 20 61 20 73 6f 72 74 65 72 2c 20 69 6e 20 77 68   a sorter, in wh
b640: 69 63 68 20 63 61 73 65 20 74 68 65 20 73 6f 72  ich case the sor
b650: 74 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ter has already 
b660: 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74 68 65  limited.  ** the
b670: 20 6f 75 74 70 75 74 20 66 6f 72 20 75 73 2e 0a   output for us..
b680: 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 6f 72 74    */.  if( pSort
b690: 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69 6d 69 74  ==0 && p->iLimit
b6a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
b6b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b6c0: 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d  DecrJumpZero, p-
b6d0: 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29  >iLimit, iBreak)
b6e0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
b6f0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
b700: 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49 6e  Allocate a KeyIn
b710: 66 6f 20 6f 62 6a 65 63 74 20 73 75 66 66 69 63  fo object suffic
b720: 69 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e 64 65  ient for an inde
b730: 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f 6c 75 6d  x of N key colum
b740: 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65 78 74 72  ns and.** X extr
b750: 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65  a columns..*/.Ke
b760: 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65  yInfo *sqlite3Ke
b770: 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71 6c 69 74  yInfoAlloc(sqlit
b780: 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 2c 20 69  e3 *db, int N, i
b790: 6e 74 20 58 29 7b 0a 20 20 69 6e 74 20 6e 45 78  nt X){.  int nEx
b7a0: 74 72 61 20 3d 20 28 4e 2b 58 29 2a 28 73 69 7a  tra = (N+X)*(siz
b7b0: 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29  eof(CollSeq*)+1)
b7c0: 20 2d 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65   - sizeof(CollSe
b7d0: 71 2a 29 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  q*);.  KeyInfo *
b7e0: 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
b7f0: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
b800: 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 6e  eof(KeyInfo) + n
b810: 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 70 20  Extra);.  if( p 
b820: 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f  ){.    p->aSortO
b830: 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e  rder = (u8*)&p->
b840: 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20  aColl[N+X];.    
b850: 70 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 3d 20 28  p->nKeyField = (
b860: 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e 41  u16)N;.    p->nA
b870: 6c 6c 46 69 65 6c 64 20 3d 20 28 75 31 36 29 28  llField = (u16)(
b880: 4e 2b 58 29 3b 0a 20 20 20 20 70 2d 3e 65 6e 63  N+X);.    p->enc
b890: 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20   = ENC(db);.    
b8a0: 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  p->db = db;.    
b8b0: 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  p->nRef = 1;.   
b8c0: 20 6d 65 6d 73 65 74 28 26 70 5b 31 5d 2c 20 30   memset(&p[1], 0
b8d0: 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 7d 65 6c  , nExtra);.  }el
b8e0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  se{.    sqlite3O
b8f0: 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 7d  omFault(db);.  }
b900: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
b910: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
b920: 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63   a KeyInfo objec
b930: 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  t.*/.void sqlite
b940: 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 4b 65  3KeyInfoUnref(Ke
b950: 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28  yInfo *p){.  if(
b960: 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74   p ){.    assert
b970: 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  ( p->nRef>0 );. 
b980: 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20     p->nRef--;.  
b990: 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30    if( p->nRef==0
b9a0: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
b9b0: 4e 4e 28 70 2d 3e 64 62 2c 20 70 29 3b 0a 20 20  NN(p->db, p);.  
b9c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
b9d0: 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 74 6f  a new pointer to
b9e0: 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63   a KeyInfo objec
b9f0: 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71  t.*/.KeyInfo *sq
ba00: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28  lite3KeyInfoRef(
ba10: 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  KeyInfo *p){.  i
ba20: 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65  f( p ){.    asse
ba30: 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b  rt( p->nRef>0 );
ba40: 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a  .    p->nRef++;.
ba50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
ba60: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
ba70: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  _DEBUG./*.** Ret
ba80: 75 72 6e 20 54 52 55 45 20 69 66 20 61 20 4b 65  urn TRUE if a Ke
ba90: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 61 6e  yInfo object can
baa0: 20 62 65 20 63 68 61 6e 67 65 2e 20 20 54 68 65   be change.  The
bab0: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a   KeyInfo object.
bac0: 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 63  ** can only be c
bad0: 68 61 6e 67 65 64 20 69 66 20 74 68 69 73 20 69  hanged if this i
bae0: 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20  s just a single 
baf0: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
bb00: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
bb10: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
bb20: 73 65 64 20 6f 6e 6c 79 20 69 6e 73 69 64 65 20  sed only inside 
bb30: 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74  of assert() stat
bb40: 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ements..*/.int s
bb50: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
bb60: 72 69 74 65 61 62 6c 65 28 4b 65 79 49 6e 66 6f  riteable(KeyInfo
bb70: 20 2a 70 29 7b 20 72 65 74 75 72 6e 20 70 2d 3e   *p){ return p->
bb80: 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69  nRef==1; }.#endi
bb90: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
bba0: 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  G */../*.** Give
bbb0: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  n an expression 
bbc0: 6c 69 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61  list, generate a
bbd0: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
bbe0: 72 65 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a  re that records.
bbf0: 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** the collating
bc00: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61   sequence for ea
bc10: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
bc20: 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e   that expression
bc30: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   list..**.** If 
bc40: 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20  the ExprList is 
bc50: 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47  an ORDER BY or G
bc60: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74  ROUP BY clause t
bc70: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e  hen the resultin
bc80: 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72  g.** KeyInfo str
bc90: 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70  ucture is approp
bca0: 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61  riate for initia
bcb0: 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c  lizing a virtual
bcc0: 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70   index to.** imp
bcd0: 6c 65 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75  lement that clau
bce0: 73 65 2e 20 20 49 66 20 74 68 65 20 45 78 70 72  se.  If the Expr
bcf0: 4c 69 73 74 20 69 73 20 74 68 65 20 72 65 73 75  List is the resu
bd00: 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45  lt set of a SELE
bd10: 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b  CT.** then the K
bd20: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
bd30: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
bd40: 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  for initializing
bd50: 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e   a virtual.** in
bd60: 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  dex to implement
bd70: 20 61 20 44 49 53 54 49 4e 43 54 20 74 65 73 74   a DISTINCT test
bd80: 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
bd90: 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66   hold the KeyInf
bda0: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  o structure is o
bdb0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
bdc0: 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  loc.  The callin
bdd0: 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  g.** function is
bde0: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
bdf0: 20 73 65 65 69 6e 67 20 74 68 61 74 20 74 68 69   seeing that thi
be00: 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  s structure is e
be10: 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65  ventually.** fre
be20: 65 64 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a  ed..*/.KeyInfo *
be30: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72  sqlite3KeyInfoFr
be40: 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  omExprList(.  Pa
be50: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
be60: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
be70: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
be80: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
be90: 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65 79 49  /* Form the KeyI
bea0: 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20  nfo object from 
beb0: 74 68 69 73 20 45 78 70 72 4c 69 73 74 20 2a 2f  this ExprList */
bec0: 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20 20  .  int iStart,  
bed0: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
bee0: 20 77 69 74 68 20 74 68 69 73 20 63 6f 6c 75 6d   with this colum
bef0: 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a 20 20  n of pList */.  
bf00: 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20 20 20  int nExtra      
bf10: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
bf20: 20 6d 61 6e 79 20 65 78 74 72 61 20 63 6f 6c 75   many extra colu
bf30: 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e 64 20 2a  mns to the end *
bf40: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 78 70 72  /.){.  int nExpr
bf50: 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e  ;.  KeyInfo *pIn
bf60: 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  fo;.  struct Exp
bf70: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
bf80: 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
bf90: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
bfa0: 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72   int i;..  nExpr
bfb0: 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
bfc0: 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74  .  pInfo = sqlit
bfd0: 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
bfe0: 62 2c 20 6e 45 78 70 72 2d 69 53 74 61 72 74 2c  b, nExpr-iStart,
bff0: 20 6e 45 78 74 72 61 2b 31 29 3b 0a 20 20 69 66   nExtra+1);.  if
c000: 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 61  ( pInfo ){.    a
c010: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
c020: 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
c030: 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 66  (pInfo) );.    f
c040: 6f 72 28 69 3d 69 53 74 61 72 74 2c 20 70 49 74  or(i=iStart, pIt
c050: 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69 53 74 61  em=pList->a+iSta
c060: 72 74 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  rt; i<nExpr; i++
c070: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
c080: 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69    pInfo->aColl[i
c090: 2d 69 53 74 61 72 74 5d 20 3d 20 73 71 6c 69 74  -iStart] = sqlit
c0a0: 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28  e3ExprNNCollSeq(
c0b0: 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
c0c0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70 49 6e  Expr);.      pIn
c0d0: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
c0e0: 2d 69 53 74 61 72 74 5d 20 3d 20 70 49 74 65 6d  -iStart] = pItem
c0f0: 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ->sortOrder;.   
c100: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
c110: 70 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pInfo;.}../*.** 
c120: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e  Name of the conn
c130: 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c  ection operator,
c140: 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20   used for error 
c150: 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61  messages..*/.sta
c160: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
c170: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74  selectOpName(int
c180: 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b   id){.  char *z;
c190: 0a 20 20 73 77 69 74 63 68 28 20 69 64 20 29 7b  .  switch( id ){
c1a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c  .    case TK_ALL
c1b0: 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49  :       z = "UNI
c1c0: 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b  ON ALL";   break
c1d0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  ;.    case TK_IN
c1e0: 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e  TERSECT: z = "IN
c1f0: 54 45 52 53 45 43 54 22 3b 20 20 20 62 72 65 61  TERSECT";   brea
c200: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  k;.    case TK_E
c210: 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45  XCEPT:    z = "E
c220: 58 43 45 50 54 22 3b 20 20 20 20 20 20 62 72 65  XCEPT";      bre
c230: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
c240: 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22             z = "
c250: 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72  UNION";       br
c260: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
c270: 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  n z;.}..#ifndef 
c280: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
c290: 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73  AIN./*.** Unless
c2a0: 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45   an "EXPLAIN QUE
c2b0: 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64  RY PLAN" command
c2c0: 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73   is being proces
c2d0: 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  sed, this functi
c2e0: 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  on.** is a no-op
c2f0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
c300: 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  adds a single ro
c310: 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74  w of output to t
c320: 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a  he EQP result,.*
c330: 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70 74  * where the capt
c340: 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
c350: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55 53 45  rm:.**.**   "USE
c360: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52   TEMP B-TREE FOR
c370: 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72   xxx".**.** wher
c380: 65 20 78 78 78 20 69 73 20 6f 6e 65 20 6f 66 20  e xxx is one of 
c390: 22 44 49 53 54 49 4e 43 54 22 2c 20 22 4f 52 44  "DISTINCT", "ORD
c3a0: 45 52 20 42 59 22 20 6f 72 20 22 47 52 4f 55 50  ER BY" or "GROUP
c3b0: 20 42 59 22 2e 20 45 78 61 63 74 6c 79 20 77 68   BY". Exactly wh
c3c0: 69 63 68 0a 2a 2a 20 69 73 20 64 65 74 65 72 6d  ich.** is determ
c3d0: 69 6e 65 64 20 62 79 20 74 68 65 20 7a 55 73 61  ined by the zUsa
c3e0: 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ge argument..*/.
c3f0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
c400: 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 50 61 72  ainTempTable(Par
c410: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
c420: 74 20 63 68 61 72 20 2a 7a 55 73 61 67 65 29 7b  t char *zUsage){
c430: 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50  .  ExplainQueryP
c440: 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c 20  lan((pParse, 0, 
c450: 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45  "USE TEMP B-TREE
c460: 20 46 4f 52 20 25 73 22 2c 20 7a 55 73 61 67 65   FOR %s", zUsage
c470: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  ));.}../*.** Ass
c480: 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62  ign expression b
c490: 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41 20   to lvalue a. A 
c4a0: 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76  second, no-op, v
c4b0: 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d  ersion of this m
c4c0: 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69  acro.** is provi
c4d0: 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f  ded when SQLITE_
c4e0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20  OMIT_EXPLAIN is 
c4f0: 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61 6c  defined. This al
c500: 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a  lows the code.**
c510: 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63   in sqlite3Selec
c520: 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76 61  t() to assign va
c530: 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74 75 72  lues to structur
c540: 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c  e member variabl
c550: 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20  es that.** only 
c560: 65 78 69 73 74 20 69 66 20 53 51 4c 49 54 45 5f  exist if SQLITE_
c570: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20  OMIT_EXPLAIN is 
c580: 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74 68  not defined with
c590: 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68  out polluting th
c5a0: 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20 23  e.** code with #
c5b0: 69 66 6e 64 65 66 20 64 69 72 65 63 74 69 76 65  ifndef directive
c5c0: 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s..*/.# define e
c5d0: 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
c5e0: 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23 65  (a, b) a = b..#e
c5f0: 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72  lse./* No-op ver
c600: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70  sions of the exp
c610: 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69  lainXXX() functi
c620: 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20  ons and macros. 
c630: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  */.# define expl
c640: 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a  ainTempTable(y,z
c650: 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  ).# define expla
c660: 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a  inSetInteger(y,z
c670: 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  ).#endif.../*.**
c680: 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   If the inner lo
c690: 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74 65 64  op was generated
c6a0: 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c   using a non-nul
c6b0: 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d  l pOrderBy argum
c6c0: 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ent,.** then the
c6d0: 20 72 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c   results were pl
c6e0: 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72  aced in a sorter
c6f0: 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f  .  After the loo
c700: 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a  p is terminated.
c710: 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75  ** we need to ru
c720: 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64  n the sorter and
c730: 20 6f 75 74 70 75 74 20 74 68 65 20 72 65 73 75   output the resu
c740: 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  lts.  The follow
c750: 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  ing.** routine g
c760: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
c770: 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74  e needed to do t
c780: 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  hat..*/.static v
c790: 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74  oid generateSort
c7a0: 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70  Tail(.  Parse *p
c7b0: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
c7c0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
c7d0: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
c7e0: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
c7f0: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
c800: 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c   SortCtx *pSort,
c810: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
c820: 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42  n on the ORDER B
c830: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
c840: 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t nColumn,      
c850: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
c860: 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a  umns of data */.
c870: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
c880: 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68 65  est /* Write the
c890: 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20   sorted results 
c8a0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  here */.){.  Vdb
c8b0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
c8c0: 56 64 62 65 3b 20 20 20 20 20 20 20 20 20 20 20  Vdbe;           
c8d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
c8e0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
c8f0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ent */.  int add
c900: 72 42 72 65 61 6b 20 3d 20 70 53 6f 72 74 2d 3e  rBreak = pSort->
c910: 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20  labelDone;      
c920: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
c930: 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20  re to exit loop 
c940: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e  */.  int addrCon
c950: 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
c960: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
c970: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 66    /* Jump here f
c980: 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f  or next cycle */
c990: 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20  .  int addr;    
c9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9b0: 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 6f 75 74     /* Top of out
c9c0: 70 75 74 20 6c 6f 6f 70 2e 20 4a 75 6d 70 20 66  put loop. Jump f
c9d0: 6f 72 20 4e 65 78 74 2e 20 2a 2f 0a 20 20 69 6e  or Next. */.  in
c9e0: 74 20 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b 0a  t addrOnce = 0;.
c9f0: 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 45 78    int iTab;.  Ex
ca00: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
ca10: 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72   = pSort->pOrder
ca20: 42 79 3b 0a 20 20 69 6e 74 20 65 44 65 73 74 20  By;.  int eDest 
ca30: 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a  = pDest->eDest;.
ca40: 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44    int iParm = pD
ca50: 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a 20 20  est->iSDParm;.  
ca60: 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e  int regRow;.  in
ca70: 74 20 72 65 67 52 6f 77 69 64 3b 0a 20 20 69 6e  t regRowid;.  in
ca80: 74 20 69 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e 4b  t iCol;.  int nK
ca90: 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ey;             
caa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
cab0: 62 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d  ber of key colum
cac0: 6e 73 20 69 6e 20 73 6f 72 74 65 72 20 72 65 63  ns in sorter rec
cad0: 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f  ord */.  int iSo
cae0: 72 74 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  rtTab;          
caf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74           /* Sort
cb00: 65 72 20 63 75 72 73 6f 72 20 74 6f 20 72 65 61  er cursor to rea
cb10: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  d from */.  int 
cb20: 69 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b 20 20  i;.  int bSeq;  
cb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb40: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
cb50: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 69 6e  sorter record in
cb60: 63 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f 2e 20  cludes seq. no. 
cb70: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 4b 65 79  */.  int nRefKey
cb80: 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 45   = 0;.  struct E
cb90: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4f  xprList_item *aO
cba0: 75 74 45 78 20 3d 20 70 2d 3e 70 45 4c 69 73 74  utEx = p->pEList
cbb0: 2d 3e 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ->a;..  assert( 
cbc0: 61 64 64 72 42 72 65 61 6b 3c 30 20 29 3b 0a 20  addrBreak<0 );. 
cbd0: 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65   if( pSort->labe
cbe0: 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73 71  lBkOut ){.    sq
cbf0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
cc00: 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f  v, OP_Gosub, pSo
cc10: 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70  rt->regReturn, p
cc20: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
cc30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
cc40: 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 42 72  beGoto(v, addrBr
cc50: 65 61 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eak);.    sqlite
cc60: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
cc70: 6c 28 76 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65  l(v, pSort->labe
cc80: 6c 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a 0a 23 69  lBkOut);.  }..#i
cc90: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
cca0: 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45  LE_SORTER_REFERE
ccb0: 4e 43 45 53 0a 20 20 2f 2a 20 4f 70 65 6e 20 61  NCES.  /* Open a
ccc0: 6e 79 20 63 75 72 73 6f 72 73 20 6e 65 65 64 65  ny cursors neede
ccd0: 64 20 66 6f 72 20 73 6f 72 74 65 72 2d 72 65 66  d for sorter-ref
cce0: 65 72 65 6e 63 65 20 65 78 70 72 65 73 73 69 6f  erence expressio
ccf0: 6e 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  ns */.  for(i=0;
cd00: 20 69 3c 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72   i<pSort->nDefer
cd10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  ; i++){.    Tabl
cd20: 65 20 2a 70 54 61 62 20 3d 20 70 53 6f 72 74 2d  e *pTab = pSort-
cd30: 3e 61 44 65 66 65 72 5b 69 5d 2e 70 54 61 62 3b  >aDefer[i].pTab;
cd40: 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73  .    int iDb = s
cd50: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
cd60: 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
cd70: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
cd80: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
cd90: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 53 6f  able(pParse, pSo
cda0: 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 69 43  rt->aDefer[i].iC
cdb0: 73 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f  sr, iDb, pTab, O
cdc0: 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20  P_OpenRead);.   
cdd0: 20 6e 52 65 66 4b 65 79 20 3d 20 4d 41 58 28 6e   nRefKey = MAX(n
cde0: 52 65 66 4b 65 79 2c 20 70 53 6f 72 74 2d 3e 61  RefKey, pSort->a
cdf0: 44 65 66 65 72 5b 69 5d 2e 6e 4b 65 79 29 3b 0a  Defer[i].nKey);.
ce00: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 54    }.#endif..  iT
ce10: 61 62 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75  ab = pSort->iECu
ce20: 72 73 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73  rsor;.  if( eDes
ce30: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c  t==SRT_Output ||
ce40: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
ce50: 75 74 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d 3d  utine || eDest==
ce60: 53 52 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 72  SRT_Mem ){.    r
ce70: 65 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20  egRowid = 0;.   
ce80: 20 72 65 67 52 6f 77 20 3d 20 70 44 65 73 74 2d   regRow = pDest-
ce90: 3e 69 53 64 73 74 3b 0a 20 20 7d 65 6c 73 65 7b  >iSdst;.  }else{
cea0: 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20  .    regRowid = 
ceb0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
cec0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72  g(pParse);.    r
ced0: 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 47  egRow = sqlite3G
cee0: 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
cef0: 73 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  se, nColumn);.  
cf00: 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72 64 65  }.  nKey = pOrde
cf10: 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f  rBy->nExpr - pSo
cf20: 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 69 66  rt->nOBSat;.  if
cf30: 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ( pSort->sortFla
cf40: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
cf50: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 69  eSorter ){.    i
cf60: 6e 74 20 72 65 67 53 6f 72 74 4f 75 74 20 3d 20  nt regSortOut = 
cf70: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
cf80: 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 70      iSortTab = p
cf90: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
cfa0: 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61     if( pSort->la
cfb0: 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20  belBkOut ){.    
cfc0: 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c    addrOnce = sql
cfd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
cfe0: 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65  , OP_Once); Vdbe
cff0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
d000: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
d010: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
d020: 70 65 6e 50 73 65 75 64 6f 2c 20 69 53 6f 72 74  penPseudo, iSort
d030: 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c  Tab, regSortOut,
d040: 20 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 2b 31   .        nKey+1
d050: 2b 6e 43 6f 6c 75 6d 6e 2b 6e 52 65 66 4b 65 79  +nColumn+nRefKey
d060: 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4f  );.    if( addrO
d070: 6e 63 65 20 29 20 73 71 6c 69 74 65 33 56 64 62  nce ) sqlite3Vdb
d080: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
d090: 72 4f 6e 63 65 29 3b 0a 20 20 20 20 61 64 64 72  rOnce);.    addr
d0a0: 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64   = 1 + sqlite3Vd
d0b0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
d0c0: 6f 72 74 65 72 53 6f 72 74 2c 20 69 54 61 62 2c  orterSort, iTab,
d0d0: 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20   addrBreak);.   
d0e0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
d0f0: 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74  ;.    codeOffset
d100: 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  (v, p->iOffset, 
d110: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
d120: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d130: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp3(v, OP_Sorte
d140: 72 44 61 74 61 2c 20 69 54 61 62 2c 20 72 65 67  rData, iTab, reg
d150: 53 6f 72 74 4f 75 74 2c 20 69 53 6f 72 74 54 61  SortOut, iSortTa
d160: 62 29 3b 0a 20 20 20 20 62 53 65 71 20 3d 20 30  b);.    bSeq = 0
d170: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
d180: 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  ddr = 1 + sqlite
d190: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d1a0: 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64  P_Sort, iTab, ad
d1b0: 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f  drBreak); VdbeCo
d1c0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63  verage(v);.    c
d1d0: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e  odeOffset(v, p->
d1e0: 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e  iOffset, addrCon
d1f0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 69 53 6f 72  tinue);.    iSor
d200: 74 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20  tTab = iTab;.   
d210: 20 62 53 65 71 20 3d 20 31 3b 0a 20 20 7d 0a 20   bSeq = 1;.  }. 
d220: 20 66 6f 72 28 69 3d 30 2c 20 69 43 6f 6c 3d 6e   for(i=0, iCol=n
d230: 4b 65 79 2b 62 53 65 71 2d 31 3b 20 69 3c 6e 43  Key+bSeq-1; i<nC
d240: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 23 69 66  olumn; i++){.#if
d250: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
d260: 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
d270: 43 45 53 0a 20 20 20 20 69 66 28 20 61 4f 75 74  CES.    if( aOut
d280: 45 78 5b 69 5d 2e 62 53 6f 72 74 65 72 52 65 66  Ex[i].bSorterRef
d290: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 65 6e   ) continue;.#en
d2a0: 64 69 66 0a 20 20 20 20 69 66 28 20 61 4f 75 74  dif.    if( aOut
d2b0: 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  Ex[i].u.x.iOrder
d2c0: 42 79 43 6f 6c 3d 3d 30 20 29 20 69 43 6f 6c 2b  ByCol==0 ) iCol+
d2d0: 2b 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  +;.  }.#ifdef SQ
d2e0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
d2f0: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
d300: 69 66 28 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65  if( pSort->nDefe
d310: 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4b 65  r ){.    int iKe
d320: 79 20 3d 20 69 43 6f 6c 2b 31 3b 0a 20 20 20 20  y = iCol+1;.    
d330: 69 6e 74 20 72 65 67 4b 65 79 20 3d 20 73 71 6c  int regKey = sql
d340: 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
d350: 28 70 50 61 72 73 65 2c 20 6e 52 65 66 4b 65 79  (pParse, nRefKey
d360: 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  );..    for(i=0;
d370: 20 69 3c 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72   i<pSort->nDefer
d380: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
d390: 74 20 69 43 73 72 20 3d 20 70 53 6f 72 74 2d 3e  t iCsr = pSort->
d3a0: 61 44 65 66 65 72 5b 69 5d 2e 69 43 73 72 3b 0a  aDefer[i].iCsr;.
d3b0: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
d3c0: 62 20 3d 20 70 53 6f 72 74 2d 3e 61 44 65 66 65  b = pSort->aDefe
d3d0: 72 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  r[i].pTab;.     
d3e0: 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 53 6f 72   int nKey = pSor
d3f0: 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 6e 4b 65  t->aDefer[i].nKe
d400: 79 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  y;..      sqlite
d410: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
d420: 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 73 72 29  P_NullRow, iCsr)
d430: 3b 0a 20 20 20 20 20 20 69 66 28 20 48 61 73 52  ;.      if( HasR
d440: 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
d450: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d460: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
d470: 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20  lumn, iSortTab, 
d480: 69 4b 65 79 2b 2b 2c 20 72 65 67 4b 65 79 29 3b  iKey++, regKey);
d490: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d4a0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
d4b0: 5f 53 65 65 6b 52 6f 77 69 64 2c 20 69 43 73 72  _SeekRowid, iCsr
d4c0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  , .            s
d4d0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
d4e0: 74 41 64 64 72 28 76 29 2b 31 2c 20 72 65 67 4b  tAddr(v)+1, regK
d4f0: 65 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ey);.      }else
d500: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b  {.        int k;
d510: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a 6d  .        int iJm
d520: 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  p;.        asser
d530: 74 28 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72  t( sqlite3Primar
d540: 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 2d  yKeyIndex(pTab)-
d550: 3e 6e 4b 65 79 43 6f 6c 3d 3d 6e 4b 65 79 20 29  >nKeyCol==nKey )
d560: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d  ;.        for(k=
d570: 30 3b 20 6b 3c 6e 4b 65 79 3b 20 6b 2b 2b 29 7b  0; k<nKey; k++){
d580: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d590: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d5a0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74  OP_Column, iSort
d5b0: 54 61 62 2c 20 69 4b 65 79 2b 2b 2c 20 72 65 67  Tab, iKey++, reg
d5c0: 4b 65 79 2b 6b 29 3b 0a 20 20 20 20 20 20 20 20  Key+k);.        
d5d0: 7d 0a 20 20 20 20 20 20 20 20 69 4a 6d 70 20 3d  }.        iJmp =
d5e0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
d5f0: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
d600: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d610: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53  ddOp4Int(v, OP_S
d620: 65 65 6b 47 45 2c 20 69 43 73 72 2c 20 69 4a 6d  eekGE, iCsr, iJm
d630: 70 2b 32 2c 20 72 65 67 4b 65 79 2c 20 6e 4b 65  p+2, regKey, nKe
d640: 79 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  y);.        sqli
d650: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
d660: 28 76 2c 20 4f 50 5f 49 64 78 4c 45 2c 20 69 43  (v, OP_IdxLE, iC
d670: 73 72 2c 20 69 4a 6d 70 2b 33 2c 20 72 65 67 4b  sr, iJmp+3, regK
d680: 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20 20  ey, nKey);.     
d690: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d6a0: 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  dOp1(v, OP_NullR
d6b0: 6f 77 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20  ow, iCsr);.     
d6c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
d6d0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
d6e0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
d6f0: 4b 65 79 2c 20 6e 52 65 66 4b 65 79 29 3b 0a 20  Key, nRefKey);. 
d700: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28   }.#endif.  for(
d710: 69 3d 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 69 3e 3d  i=nColumn-1; i>=
d720: 30 3b 20 69 2d 2d 29 7b 0a 23 69 66 64 65 66 20  0; i--){.#ifdef 
d730: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
d740: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
d750: 20 20 20 20 69 66 28 20 61 4f 75 74 45 78 5b 69      if( aOutEx[i
d760: 5d 2e 62 53 6f 72 74 65 72 52 65 66 20 29 7b 0a  ].bSorterRef ){.
d770: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
d780: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4f  rCode(pParse, aO
d790: 75 74 45 78 5b 69 5d 2e 70 45 78 70 72 2c 20 72  utEx[i].pExpr, r
d7a0: 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20 7d 65  egRow+i);.    }e
d7b0: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b  lse.#endif.    {
d7c0: 0a 20 20 20 20 20 20 69 6e 74 20 69 52 65 61 64  .      int iRead
d7d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4f 75 74  ;.      if( aOut
d7e0: 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  Ex[i].u.x.iOrder
d7f0: 42 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  ByCol ){.       
d800: 20 69 52 65 61 64 20 3d 20 61 4f 75 74 45 78 5b   iRead = aOutEx[
d810: 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  i].u.x.iOrderByC
d820: 6f 6c 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ol-1;.      }els
d830: 65 7b 0a 20 20 20 20 20 20 20 20 69 52 65 61 64  e{.        iRead
d840: 20 3d 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20 20   = iCol--;.     
d850: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
d860: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
d870: 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61  _Column, iSortTa
d880: 62 2c 20 69 52 65 61 64 2c 20 72 65 67 52 6f 77  b, iRead, regRow
d890: 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +i);.      VdbeC
d8a0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
d8b0: 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65   aOutEx[i].zName
d8c0: 3f 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65  ?aOutEx[i].zName
d8d0: 20 3a 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 53 70   : aOutEx[i].zSp
d8e0: 61 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  an));.    }.  }.
d8f0: 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
d900: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  ){.    case SRT_
d910: 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
d920: 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
d930: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d940: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
d950: 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72  wRowid, iParm, r
d960: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
d970: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d980: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
d990: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72  iParm, regRow, r
d9a0: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
d9b0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
d9c0: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
d9d0: 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72 65  PEND);.      bre
d9e0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
d9f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
da00: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
da10: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
da20: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
da30: 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ==sqlite3Strlen3
da40: 30 28 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73  0(pDest->zAffSds
da50: 74 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t) );.      sqli
da60: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
da70: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
da80: 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 2c  regRow, nColumn,
da90: 20 72 65 67 52 6f 77 69 64 2c 0a 20 20 20 20 20   regRowid,.     
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dab0: 20 20 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64     pDest->zAffSd
dac0: 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  st, nColumn);.  
dad0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
dae0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
daf0: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
db00: 20 72 65 67 52 6f 77 69 64 2c 20 72 65 67 52 6f   regRowid, regRo
db10: 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  w, nColumn);.   
db20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
db30: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
db40: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
db50: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
db60: 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
db70: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
db80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
db90: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
dba0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
dbb0: 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52  ssert( eDest==SR
dbc0: 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73  T_Output || eDes
dbd0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
dbe0: 20 29 3b 20 0a 20 20 20 20 20 20 74 65 73 74 63   ); .      testc
dbf0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
dc00: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
dc10: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
dc20: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
dc30: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  ;.      if( eDes
dc40: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
dc50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
dc60: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
dc70: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44 65 73  _ResultRow, pDes
dc80: 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d  t->iSdst, nColum
dc90: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
dca0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
dcb0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
dcc0: 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
dcd0: 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d  SDParm);.      }
dce0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
dcf0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 65    }.  }.  if( re
dd00: 67 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 69 66  gRowid ){.    if
dd10: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74  ( eDest==SRT_Set
dd20: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
dd30: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
dd40: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  e(pParse, regRow
dd50: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
dd60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
dd70: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
dd80: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  eg(pParse, regRo
dd90: 77 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  w);.    }.    sq
dda0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
ddb0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
ddc0: 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  owid);.  }.  /* 
ddd0: 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68  The bottom of th
dde0: 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71  e loop.  */.  sq
ddf0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
de00: 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e  Label(v, addrCon
de10: 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20 70 53  tinue);.  if( pS
de20: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
de30: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
de40: 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ter ){.    sqlit
de50: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
de60: 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69  OP_SorterNext, i
de70: 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62 65  Tab, addr); Vdbe
de80: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
de90: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
dea0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
deb0: 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  P_Next, iTab, ad
dec0: 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  dr); VdbeCoverag
ded0: 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  e(v);.  }.  if( 
dee0: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
def0: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   ) sqlite3VdbeAd
df00: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
df10: 6e 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74  n, pSort->regRet
df20: 75 72 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  urn);.  sqlite3V
df30: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
df40: 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 7d  v, addrBreak);.}
df50: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
df60: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
df70: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
df80: 74 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e  the 'declaration
df90: 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a   type' of the.**
dfa0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
dfb0: 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61  r. The string ma
dfc0: 79 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20  y be treated as 
dfd0: 73 74 61 74 69 63 20 62 79 20 74 68 65 20 63 61  static by the ca
dfe0: 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  ller..**.** Also
dff0: 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65   try to estimate
e000: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
e010: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
e020: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74 0a  and return that.
e030: 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 2a 70 45  ** result in *pE
e040: 73 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54  stWidth..**.** T
e050: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
e060: 79 70 65 20 69 73 20 74 68 65 20 65 78 61 63 74  ype is the exact
e070: 20 64 61 74 61 74 79 70 65 20 64 65 66 69 6e 69   datatype defini
e080: 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20 66  tion extracted f
e090: 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69  rom the.** origi
e0a0: 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c 45  nal CREATE TABLE
e0b0: 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74 68   statement if th
e0c0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
e0d0: 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a  a column. The.**
e0e0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
e0f0: 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69  e for a ROWID fi
e100: 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e 20  eld is INTEGER. 
e110: 45 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e 20  Exactly when an 
e120: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
e130: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f   considered a co
e140: 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70  lumn can be comp
e150: 6c 65 78 20 69 6e 20 74 68 65 20 70 72 65 73 65  lex in the prese
e160: 6e 63 65 20 6f 66 20 73 75 62 71 75 65 72 69 65  nce of subquerie
e170: 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74  s. The.** result
e180: 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20  -set expression 
e190: 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  in all of the fo
e1a0: 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20 73  llowing SELECT s
e1b0: 74 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a  tatements is .**
e1c0: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f   considered a co
e1d0: 6c 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75 6e  lumn by this fun
e1e0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53  ction..**.**   S
e1f0: 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74  ELECT col FROM t
e200: 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  bl;.**   SELECT 
e210: 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d  (SELECT col FROM
e220: 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43   tbl;.**   SELEC
e230: 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52  T (SELECT col FR
e240: 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45  OM tbl);.**   SE
e250: 4c 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28 53  LECT abc FROM (S
e260: 45 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62 63  ELECT col AS abc
e270: 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a   FROM tbl);.** .
e280: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
e290: 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79 20  on type for any 
e2a0: 65 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65 72  expression other
e2b0: 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69   than a column i
e2c0: 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  s NULL..**.** Th
e2d0: 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 65  is routine has e
e2e0: 69 74 68 65 72 20 33 20 6f 72 20 36 20 70 61 72  ither 3 or 6 par
e2f0: 61 6d 65 74 65 72 73 20 64 65 70 65 6e 64 69 6e  ameters dependin
e300: 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
e310: 6e 6f 74 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54  not.** the SQLIT
e320: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
e330: 4d 45 54 41 44 41 54 41 20 63 6f 6d 70 69 6c 65  METADATA compile
e340: 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  -time option is 
e350: 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  used..*/.#ifdef 
e360: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
e370: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 23 20  LUMN_METADATA.# 
e380: 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70  define columnTyp
e390: 65 28 41 2c 42 2c 43 2c 44 2c 45 29 20 63 6f 6c  e(A,B,C,D,E) col
e3a0: 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c  umnTypeImpl(A,B,
e3b0: 43 2c 44 2c 45 29 0a 23 65 6c 73 65 20 2f 2a 20  C,D,E).#else /* 
e3c0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
e3d0: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
e3e0: 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 23 20  _METADATA) */.# 
e3f0: 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70  define columnTyp
e400: 65 28 41 2c 42 2c 43 2c 44 2c 45 29 20 63 6f 6c  e(A,B,C,D,E) col
e410: 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 29  umnTypeImpl(A,B)
e420: 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 63  .#endif.static c
e430: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d  onst char *colum
e440: 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d  nTypeImpl(.  Nam
e450: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a  eContext *pNC, .
e460: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45  #ifndef SQLITE_E
e470: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
e480: 41 44 41 54 41 0a 20 20 45 78 70 72 20 2a 70 45  ADATA.  Expr *pE
e490: 78 70 72 0a 23 65 6c 73 65 0a 20 20 45 78 70 72  xpr.#else.  Expr
e4a0: 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74   *pExpr,.  const
e4b0: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62   char **pzOrigDb
e4c0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
e4d0: 2a 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f  *pzOrigTab,.  co
e4e0: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
e4f0: 67 43 6f 6c 0a 23 65 6e 64 69 66 0a 29 7b 0a 20  gCol.#endif.){. 
e500: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79   char const *zTy
e510: 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b  pe = 0;.  int j;
e520: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
e530: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
e540: 41 44 41 54 41 0a 20 20 63 68 61 72 20 63 6f 6e  ADATA.  char con
e550: 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b  st *zOrigDb = 0;
e560: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
e570: 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 63  OrigTab = 0;.  c
e580: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
e590: 43 6f 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  Col = 0;.#endif.
e5a0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
e5b0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e5c0: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d   pNC->pSrcList!=
e5d0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
e5e0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
e5f0: 5f 43 4f 4c 55 4d 4e 20 29 3b 20 20 2f 2a 20 54  _COLUMN );  /* T
e600: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 65  his routine rune
e610: 73 20 62 65 66 6f 72 65 20 61 67 67 72 65 67 61  s before aggrega
e620: 74 65 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  tes.            
e630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e640: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 72             ** ar
e650: 65 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  e processed */. 
e660: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
e670: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
e680: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
e690: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
e6a0: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
e6b0: 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
e6c0: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  e the column is 
e6d0: 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65  being.      ** e
e6e0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e  xtracted from in
e6f0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72   NameContext.pSr
e700: 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c  cList. This tabl
e710: 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20  e may be real.  
e720: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
e730: 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75  table or a subqu
e740: 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ery..      */.  
e750: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
e760: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
e770: 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  /* Table structu
e780: 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  re column is ext
e790: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
e7a0: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20       Select *pS 
e7b0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
e7c0: 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63   /* Select the c
e7d0: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
e7e0: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
e7f0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70   int iCol = pExp
e800: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20  r->iColumn;  /* 
e810: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
e820: 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20  in pTab */.     
e830: 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21   while( pNC && !
e840: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
e850: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
e860: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
e870: 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  t;.        for(j
e880: 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  =0;j<pTabList->n
e890: 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d  Src && pTabList-
e8a0: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70  >a[j].iCursor!=p
e8b0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b  Expr->iTable;j++
e8c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  );.        if( j
e8d0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
e8e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  ){.          pTa
e8f0: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
e900: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  j].pTab;.       
e910: 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74     pS = pTabList
e920: 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a  ->a[j].pSelect;.
e930: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
e940: 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70           pNC = p
e950: 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  NC->pNext;.     
e960: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
e970: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
e980: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74  ){.        /* At
e990: 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64 65 20   one time, code 
e9a0: 73 75 63 68 20 61 73 20 22 53 45 4c 45 43 54 20  such as "SELECT 
e9b0: 6e 65 77 2e 78 22 20 77 69 74 68 69 6e 20 61 20  new.x" within a 
e9c0: 74 72 69 67 67 65 72 20 77 6f 75 6c 64 0a 20 20  trigger would.  
e9d0: 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74        ** cause t
e9e0: 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f  his condition to
e9f0: 20 72 75 6e 2e 20 20 53 69 6e 63 65 20 74 68 65   run.  Since the
ea00: 6e 2c 20 77 65 20 68 61 76 65 20 72 65 73 74 72  n, we have restr
ea10: 75 63 74 75 72 65 64 20 68 6f 77 0a 20 20 20 20  uctured how.    
ea20: 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 63      ** trigger c
ea30: 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
ea40: 20 61 6e 64 20 73 6f 20 74 68 69 73 20 63 6f 6e   and so this con
ea50: 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e  dition is no lon
ea60: 67 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ger .        ** 
ea70: 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65 76 65  possible. Howeve
ea80: 72 2c 20 69 74 20 63 61 6e 20 73 74 69 6c 6c 20  r, it can still 
ea90: 62 65 20 74 72 75 65 20 66 6f 72 20 73 74 61 74  be true for stat
eaa0: 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20  ements like.    
eab0: 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f      ** the follo
eac0: 77 69 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a  wing:.        **
ead0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 43 52  .        **   CR
eae0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 63 6f  EATE TABLE t1(co
eaf0: 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 20 20  l INTEGER);.    
eb00: 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
eb10: 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20  (SELECT t1.col) 
eb20: 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20  FROM FROM t1;.  
eb30: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
eb40: 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54   ** when columnT
eb50: 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ype() is called 
eb60: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
eb70: 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68  n "t1.col" in th
eb80: 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75  e .        ** su
eb90: 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74 68 69  b-select. In thi
eba0: 73 20 63 61 73 65 2c 20 73 65 74 20 74 68 65 20  s case, set the 
ebb0: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e  column type to N
ebc0: 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20 20 20  ULL, even.      
ebd0: 20 20 2a 2a 20 74 68 6f 75 67 68 20 69 74 20 73    ** though it s
ebe0: 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62 65 20  hould really be 
ebf0: 22 49 4e 54 45 47 45 52 22 2e 0a 20 20 20 20 20  "INTEGER"..     
ec00: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
ec10: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 70   This is not a p
ec20: 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65 20 63  roblem, as the c
ec30: 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20 22 74  olumn type of "t
ec40: 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a  1.col" is never.
ec50: 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 64 2e          ** used.
ec60: 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65   When columnType
ec70: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
ec80: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a  the expression .
ec90: 20 20 20 20 20 20 20 20 2a 2a 20 22 28 53 45 4c          ** "(SEL
eca0: 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68  ECT t1.col)", th
ecb0: 65 20 63 6f 72 72 65 63 74 20 74 79 70 65 20 69  e correct type i
ecc0: 73 20 72 65 74 75 72 6e 65 64 20 28 73 65 65 20  s returned (see 
ecd0: 74 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20  the TK_SELECT.  
ece0: 20 20 20 20 20 20 2a 2a 20 62 72 61 6e 63 68 20        ** branch 
ecf0: 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20  below.  */.     
ed00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ed10: 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
ed20: 20 70 54 61 62 20 26 26 20 70 45 78 70 72 2d 3e   pTab && pExpr->
ed30: 70 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20  pTab==pTab );.  
ed40: 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20      if( pS ){.  
ed50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61        /* The "ta
ed60: 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79  ble" is actually
ed70: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72   a sub-select or
ed80: 20 61 20 76 69 65 77 20 69 6e 20 74 68 65 20 46   a view in the F
ed90: 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20  ROM clause.     
eda0: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c     ** of the SEL
edb0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52  ECT statement. R
edc0: 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72  eturn the declar
edd0: 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f  ation type and o
ede0: 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  rigin.        **
edf0: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 72 65   data for the re
ee00: 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20  sult-set column 
ee10: 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  of the sub-selec
ee20: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
ee30: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d        if( iCol>=
ee40: 30 20 26 26 20 69 43 6f 6c 3c 70 53 2d 3e 70 45  0 && iCol<pS->pE
ee50: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
ee60: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69           /* If i
ee70: 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e  Col is less than
ee80: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
ee90: 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65  expression reque
eea0: 73 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  sts the.        
eeb0: 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68    ** rowid of th
eec0: 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  e sub-select or 
eed0: 76 69 65 77 2e 20 54 68 69 73 20 65 78 70 72 65  view. This expre
eee0: 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28  ssion is legal (
eef0: 73 65 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a  see .          *
ef00: 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69 73 63  * test case misc
ef10: 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61  2.2.2) - it alwa
ef20: 79 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  ys evaluates to 
ef30: 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20  NULL..          
ef40: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d  */.          Nam
ef50: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
ef60: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20          Expr *p 
ef70: 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  = pS->pEList->a[
ef80: 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20  iCol].pExpr;.   
ef90: 20 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c         sNC.pSrcL
efa0: 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a  ist = pS->pSrc;.
efb0: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e            sNC.pN
efc0: 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20  ext = pNC;.     
efd0: 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20       sNC.pParse 
efe0: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
eff0: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
f000: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
f010: 2c 20 70 2c 26 7a 4f 72 69 67 44 62 2c 26 7a 4f  , p,&zOrigDb,&zO
f020: 72 69 67 54 61 62 2c 26 7a 4f 72 69 67 43 6f 6c  rigTab,&zOrigCol
f030: 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ); .        }.  
f040: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f050: 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62     /* A real tab
f060: 6c 65 20 6f 72 20 61 20 43 54 45 20 74 61 62 6c  le or a CTE tabl
f070: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  e */.        ass
f080: 65 72 74 28 20 21 70 53 20 29 3b 0a 23 69 66 64  ert( !pS );.#ifd
f090: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
f0a0: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
f0b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
f0c0: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
f0d0: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
f0e0: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
f0f0: 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 28 69 43 6f  XN_ROWID || (iCo
f100: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
f110: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
f120: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
f130: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
f140: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
f150: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f           zOrigCo
f160: 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20  l = "rowid";.   
f170: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f180: 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d        zOrigCol =
f190: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
f1a0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
f1b0: 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74     zType = sqlit
f1c0: 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54  e3ColumnType(&pT
f1d0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30  ab->aCol[iCol],0
f1e0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
f1f0: 20 20 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20       zOrigTab = 
f200: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
f210: 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50       if( pNC->pP
f220: 61 72 73 65 20 26 26 20 70 54 61 62 2d 3e 70 53  arse && pTab->pS
f230: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20  chema ){.       
f240: 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
f250: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
f260: 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64  x(pNC->pParse->d
f270: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
f280: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  );.          zOr
f290: 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72  igDb = pNC->pPar
f2a0: 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
f2b0: 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 20  .zDbSName;.     
f2c0: 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20     }.#else.     
f2d0: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
f2e0: 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 28 69 43  =XN_ROWID || (iC
f2f0: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
f300: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20  ab->nCol) );.   
f310: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
f320: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  ){.          zTy
f330: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
f340: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
f350: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
f360: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79   sqlite3ColumnTy
f370: 70 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  pe(&pTab->aCol[i
f380: 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20  Col],0);.       
f390: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
f3a0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
f3b0: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
f3c0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
f3d0: 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  Y.    case TK_SE
f3e0: 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LECT: {.      /*
f3f0: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
f400: 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e  is a sub-select.
f410: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c   Return the decl
f420: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64  aration type and
f430: 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e  .      ** origin
f440: 20 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69   info for the si
f450: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ngle column in t
f460: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
f470: 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20   the SELECT.    
f480: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a    ** statement..
f490: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e        */.      N
f4a0: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
f4b0: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
f4c0: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
f4d0: 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  ect;.      Expr 
f4e0: 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d  *p = pS->pEList-
f4f0: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
f500: 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48     assert( ExprH
f510: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
f520: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
f530: 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72  );.      sNC.pSr
f540: 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63  cList = pS->pSrc
f550: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78  ;.      sNC.pNex
f560: 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73  t = pNC;.      s
f570: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  NC.pParse = pNC-
f580: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a  >pParse;.      z
f590: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
f5a0: 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69  e(&sNC, p, &zOri
f5b0: 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20  gDb, &zOrigTab, 
f5c0: 26 7a 4f 72 69 67 43 6f 6c 29 3b 20 0a 20 20 20  &zOrigCol); .   
f5d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f5e0: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64  #endif.  }..#ifd
f5f0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
f600: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
f610: 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44    .  if( pzOrigD
f620: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
f630: 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a   pzOrigTab && pz
f640: 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a  OrigCol );.    *
f650: 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67  pzOrigDb = zOrig
f660: 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54  Db;.    *pzOrigT
f670: 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20  ab = zOrigTab;. 
f680: 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20     *pzOrigCol = 
f690: 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65  zOrigCol;.  }.#e
f6a0: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 7a 54  ndif.  return zT
f6b0: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ype;.}../*.** Ge
f6c0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
f6d0: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
f6e0: 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61 74  DBE the declarat
f6f0: 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c  ion types of col
f700: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
f710: 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74  esult set..*/.st
f720: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
f730: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20  teColumnTypes(. 
f740: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
f750: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
f760: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
f770: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
f780: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
f790: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
f7a0: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
f7b0: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
f7c0: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
f7d0: 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20  t */.){.#ifndef 
f7e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
f7f0: 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d  TYPE.  Vdbe *v =
f800: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
f810: 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43    int i;.  NameC
f820: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e  ontext sNC;.  sN
f830: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61  C.pSrcList = pTa
f840: 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61  bList;.  sNC.pPa
f850: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
f860: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  sNC.pNext = 0;. 
f870: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
f880: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
f890: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70  .    Expr *p = p
f8a0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
f8b0: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  r;.    const cha
f8c0: 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66  r *zType;.#ifdef
f8d0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
f8e0: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
f8f0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
f900: 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20  OrigDb = 0;.    
f910: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
f920: 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  gTab = 0;.    co
f930: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43  nst char *zOrigC
f940: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70  ol = 0;.    zTyp
f950: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
f960: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62  sNC, p, &zOrigDb
f970: 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f  , &zOrigTab, &zO
f980: 72 69 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a  rigCol);..    /*
f990: 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d   The vdbe must m
f9a0: 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79  ake its own copy
f9b0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74   of the column-t
f9c0: 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20  ype and other . 
f9d0: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65     ** column spe
f9e0: 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69  cific strings, i
f9f0: 6e 20 63 61 73 65 20 74 68 65 20 73 63 68 65 6d  n case the schem
fa00: 61 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72  a is reset befor
fa10: 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69  e this.    ** vi
fa20: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73  rtual machine is
fa30: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
fa40: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
fa50: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
fa60: 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53   COLNAME_DATABAS
fa70: 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49  E, zOrigDb, SQLI
fa80: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
fa90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
faa0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
fab0: 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f  OLNAME_TABLE, zO
fac0: 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54  rigTab, SQLITE_T
fad0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
fae0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
faf0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
fb00: 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67  ME_COLUMN, zOrig
fb10: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Col, SQLITE_TRAN
fb20: 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20  SIENT);.#else.  
fb30: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
fb40: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c  Type(&sNC, p, 0,
fb50: 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20   0, 0);.#endif. 
fb60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
fb70: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
fb80: 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c  OLNAME_DECLTYPE,
fb90: 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54   zType, SQLITE_T
fba0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23  RANSIENT);.  }.#
fbb0: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
fbc0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  d(SQLITE_OMIT_DE
fbd0: 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 0a 2f  CLTYPE) */.}.../
fbe0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
fbf0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f   column names fo
fc00: 72 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  r a SELECT state
fc10: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
fc20: 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 20 74  only guarantee t
fc30: 68 61 74 20 53 51 4c 69 74 65 20 6d 61 6b 65 73  hat SQLite makes
fc40: 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61   about column na
fc50: 6d 65 73 20 69 73 20 74 68 61 74 20 69 66 20 74  mes is that if t
fc60: 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73  he.** column has
fc70: 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20 61 73   an AS clause as
fc80: 73 69 67 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d  signing it a nam
fc90: 65 2c 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  e, that will be 
fca0: 74 68 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a  the name used..*
fcb0: 2a 20 54 68 61 74 20 69 73 20 74 68 65 20 6f 6e  * That is the on
fcc0: 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64 20 67 75  ly documented gu
fcd0: 61 72 61 6e 74 65 65 2e 20 20 48 6f 77 65 76 65  arantee.  Howeve
fce0: 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61 70 70  r, countless app
fcf0: 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76  lications.** dev
fd00: 65 6c 6f 70 65 64 20 6f 76 65 72 20 74 68 65 20  eloped over the 
fd10: 79 65 61 72 73 20 68 61 76 65 20 6d 61 64 65 20  years have made 
fd20: 62 61 73 65 6c 65 73 73 20 61 73 73 75 6d 70 74  baseless assumpt
fd30: 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d  ions about colum
fd40: 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77  n names.** and w
fd50: 69 6c 6c 20 62 72 65 61 6b 20 69 66 20 74 68 6f  ill break if tho
fd60: 73 65 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 63  se assumptions c
fd70: 68 61 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c 20  hanges.  Hence, 
fd80: 75 73 65 20 65 78 74 72 65 6d 65 20 63 61 75 74  use extreme caut
fd90: 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69  ion.** when modi
fda0: 66 79 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  fying this routi
fdb0: 6e 65 20 74 6f 20 61 76 6f 69 64 20 62 72 65 61  ne to avoid brea
fdc0: 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a  king legacy..**.
fdd0: 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20 73 71 6c  ** See Also: sql
fde0: 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
fdf0: 78 70 72 4c 69 73 74 28 29 0a 2a 2a 0a 2a 2a 20  xprList().**.** 
fe00: 54 68 65 20 50 52 41 47 4d 41 20 73 68 6f 72 74  The PRAGMA short
fe10: 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 61 6e  _column_names an
fe20: 64 20 50 52 41 47 4d 41 20 66 75 6c 6c 5f 63 6f  d PRAGMA full_co
fe30: 6c 75 6d 6e 5f 6e 61 6d 65 73 20 73 65 74 74 69  lumn_names setti
fe40: 6e 67 73 20 61 72 65 0a 2a 2a 20 64 65 70 72 65  ngs are.** depre
fe50: 63 61 74 65 64 2e 20 20 54 68 65 20 64 65 66 61  cated.  The defa
fe60: 75 6c 74 20 73 65 74 74 69 6e 67 20 69 73 20 73  ult setting is s
fe70: 68 6f 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f 46  hort=ON, full=OF
fe80: 46 2e 20 20 39 39 2e 39 25 20 6f 66 20 61 6c 6c  F.  99.9% of all
fe90: 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  .** applications
fea0: 20 73 68 6f 75 6c 64 20 6f 70 65 72 61 74 65 20   should operate 
feb0: 74 68 69 73 20 77 61 79 2e 20 20 4e 65 76 65 72  this way.  Never
fec0: 74 68 65 6c 65 73 73 2c 20 77 65 20 6e 65 65 64  theless, we need
fed0: 20 74 6f 20 73 75 70 70 6f 72 74 20 74 68 65 0a   to support the.
fee0: 2a 2a 20 6f 74 68 65 72 20 6d 6f 64 65 73 20 66  ** other modes f
fef0: 6f 72 20 6c 65 67 61 63 79 3a 0a 2a 2a 0a 2a 2a  or legacy:.**.**
ff00: 20 20 20 20 73 68 6f 72 74 3d 4f 46 46 2c 20 66      short=OFF, f
ff10: 75 6c 6c 3d 4f 46 46 3a 20 20 20 20 20 20 43 6f  ull=OFF:      Co
ff20: 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 74 68 65  lumn name is the
ff30: 20 74 65 78 74 20 6f 66 20 74 68 65 20 65 78 70   text of the exp
ff40: 72 65 73 73 69 6f 6e 20 68 61 73 20 69 74 0a 2a  ression has it.*
ff50: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
ff60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
ff70: 72 69 67 69 6e 61 6c 6c 79 20 61 70 70 65 61 72  riginally appear
ff80: 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20  s in the SELECT 
ff90: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 0a 2a  statement.  In.*
ffa0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
ffb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
ffc0: 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
ffd0: 7a 53 70 61 6e 20 6f 66 20 74 68 65 20 72 65 73  zSpan of the res
ffe0: 75 6c 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ult expression..
fff0: 2a 2a 0a 2a 2a 20 20 20 20 73 68 6f 72 74 3d 4f  **.**    short=O
10000 4e 2c 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20 20  N, full=OFF:    
10010 20 20 20 28 54 68 69 73 20 69 73 20 74 68 65 20     (This is the 
10020 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 29  default setting)
10030 2e 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74  .  If the result
10040 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
10050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10060 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79   refers directly
10070 20 74 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c 75   to a table colu
10080 6d 6e 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  mn, then the.** 
10090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100a0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
100b0 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ult column name 
100c0 69 73 20 6a 75 73 74 20 74 68 65 20 74 61 62 6c  is just the tabl
100d0 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 20 20  e column.**     
100e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100f0 20 20 20 20 20 20 20 20 20 6e 61 6d 65 3a 20 43           name: C
10100 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65 72 77 69 73  OLUMN.  Otherwis
10110 65 20 75 73 65 20 7a 53 70 61 6e 2e 0a 2a 2a 0a  e use zSpan..**.
10120 2a 2a 20 20 20 20 66 75 6c 6c 3d 4f 4e 2c 20 73  **    full=ON, s
10130 68 6f 72 74 3d 41 4e 59 3a 20 20 20 20 20 20 20  hort=ANY:       
10140 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72 65  If the result re
10150 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f  fers directly to
10160 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c   a table column,
10170 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
10180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10190 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
101a0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 69 74   column name wit
101b0 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  h the table name
101c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
101d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101e0 20 70 72 65 66 69 78 2c 20 65 78 3a 20 54 41 42   prefix, ex: TAB
101f0 4c 45 2e 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65  LE.COLUMN.  Othe
10200 72 77 69 73 65 20 75 73 65 20 7a 53 70 61 6e 2e  rwise use zSpan.
10210 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10220 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
10230 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  mes(.  Parse *pP
10240 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
10250 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
10260 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
10270 74 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  t     /* Generat
10280 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  e column names f
10290 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 73  or this SELECT s
102a0 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  tatement */.){. 
102b0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
102c0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
102d0 69 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  i;.  Table *pTab
102e0 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
102f0 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73  bList;.  ExprLis
10300 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c  t *pEList;.  sql
10310 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
10320 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c  e->db;.  int ful
10330 6c 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 54 41 42  lName;    /* TAB
10340 4c 45 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f 20  LE.COLUMN if no 
10350 41 53 20 63 6c 61 75 73 65 20 61 6e 64 20 69 73  AS clause and is
10360 20 61 20 64 69 72 65 63 74 20 74 61 62 6c 65 20   a direct table 
10370 72 65 66 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63  ref */.  int src
10380 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 43 4f 4c  Name;     /* COL
10390 55 4d 4e 20 6f 72 20 54 41 42 4c 45 2e 43 4f 4c  UMN or TABLE.COL
103a0 55 4d 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c 61  UMN if no AS cla
103b0 75 73 65 20 61 6e 64 20 69 73 20 64 69 72 65 63  use and is direc
103c0 74 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  t */..#ifndef SQ
103d0 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
103e0 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  N.  /* If this i
103f0 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b  s an EXPLAIN, sk
10400 69 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a  ip this step */.
10410 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
10420 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74  plain ){.    ret
10430 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
10440 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
10450 6f 6c 4e 61 6d 65 73 53 65 74 20 29 20 72 65 74  olNamesSet ) ret
10460 75 72 6e 3b 0a 20 20 2f 2a 20 43 6f 6c 75 6d 6e  urn;.  /* Column
10470 20 6e 61 6d 65 73 20 61 72 65 20 64 65 74 65 72   names are deter
10480 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6c 65 66  mined by the lef
10490 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 61  t-most term of a
104a0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
104b0 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 53 65   */.  while( pSe
104c0 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  lect->pPrior ) p
104d0 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
104e0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 53 45 4c 45  ->pPrior;.  SELE
104f0 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65  CTTRACE(1,pParse
10500 2c 70 53 65 6c 65 63 74 2c 28 22 67 65 6e 65 72  ,pSelect,("gener
10510 61 74 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ating column nam
10520 65 73 5c 6e 22 29 29 3b 0a 20 20 70 54 61 62 4c  es\n"));.  pTabL
10530 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
10540 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  Src;.  pEList = 
10550 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
10560 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
10570 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  );.  assert( pTa
10580 62 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 70 50  bList!=0 );.  pP
10590 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
105a0 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d  t = 1;.  fullNam
105b0 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  e = (db->flags &
105c0 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e   SQLITE_FullColN
105d0 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 72 63 4e  ames)!=0;.  srcN
105e0 61 6d 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  ame = (db->flags
105f0 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43   & SQLITE_ShortC
10600 6f 6c 4e 61 6d 65 73 29 21 3d 30 20 7c 7c 20 66  olNames)!=0 || f
10610 75 6c 6c 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74  ullName;.  sqlit
10620 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
10630 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  (v, pEList->nExp
10640 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
10650 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
10660 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
10670 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  p = pEList->a[i]
10680 2e 70 45 78 70 72 3b 0a 0a 20 20 20 20 61 73 73  .pExpr;..    ass
10690 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 20  ert( p!=0 );.   
106a0 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d   assert( p->op!=
106b0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
106c0 20 20 2f 2a 20 41 67 67 20 70 72 6f 63 65 73 73    /* Agg process
106d0 69 6e 67 20 68 61 73 20 6e 6f 74 20 72 75 6e 20  ing has not run 
106e0 79 65 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  yet */.    asser
106f0 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  t( p->op!=TK_COL
10700 55 4d 4e 20 7c 7c 20 70 2d 3e 70 54 61 62 21 3d  UMN || p->pTab!=
10710 30 20 29 3b 20 2f 2a 20 43 6f 76 65 72 69 6e 67  0 ); /* Covering
10720 20 69 64 78 20 6e 6f 74 20 79 65 74 20 63 6f 64   idx not yet cod
10730 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 45  ed */.    if( pE
10740 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
10750 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20   ){.      /* An 
10760 41 53 20 63 6c 61 75 73 65 20 61 6c 77 61 79 73  AS clause always
10770 20 74 61 6b 65 73 20 66 69 72 73 74 20 70 72 69   takes first pri
10780 6f 72 69 74 79 20 2a 2f 0a 20 20 20 20 20 20 63  ority */.      c
10790 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c  har *zName = pEL
107a0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  ist->a[i].zName;
107b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
107c0 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
107d0 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
107e0 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54   zName, SQLITE_T
107f0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
10800 65 6c 73 65 20 69 66 28 20 73 72 63 4e 61 6d 65  else if( srcName
10810 20 26 26 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f   && p->op==TK_CO
10820 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63 68  LUMN ){.      ch
10830 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
10840 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43  int iCol = p->iC
10850 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54 61  olumn;.      pTa
10860 62 20 3d 20 70 2d 3e 70 54 61 62 3b 0a 20 20 20  b = p->pTab;.   
10870 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21     assert( pTab!
10880 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
10890 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
108a0 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
108b0 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
108c0 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  =-1 || (iCol>=0 
108d0 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
108e0 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ol) );.      if(
108f0 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
10900 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64     zCol = "rowid
10910 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
10920 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70          zCol = p
10930 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
10940 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20  zName;.      }. 
10950 20 20 20 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d       if( fullNam
10960 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  e ){.        cha
10970 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
10980 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
10990 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
109a0 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e   "%s.%s", pTab->
109b0 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20  zName, zCol);.  
109c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
109d0 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
109e0 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
109f0 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59  zName, SQLITE_DY
10a00 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65  NAMIC);.      }e
10a10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
10a20 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
10a30 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
10a40 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c  _NAME, zCol, SQL
10a50 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
10a60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
10a70 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  e{.      const c
10a80 68 61 72 20 2a 7a 20 3d 20 70 45 4c 69 73 74 2d  har *z = pEList-
10a90 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20  >a[i].zSpan;.   
10aa0 20 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20 73 71     z = z==0 ? sq
10ab0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
10ac0 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31   "column%d", i+1
10ad0 29 20 3a 20 73 71 6c 69 74 65 33 44 62 53 74 72  ) : sqlite3DbStr
10ae0 44 75 70 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  Dup(db, z);.    
10af0 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
10b00 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
10b10 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53  LNAME_NAME, z, S
10b20 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
10b30 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65      }.  }.  gene
10b40 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
10b50 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
10b60 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  , pEList);.}../*
10b70 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70  .** Given an exp
10b80 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28 77 68  ression list (wh
10b90 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 74 68  ich is really th
10ba0 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73  e list of expres
10bb0 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f  sions.** that fo
10bc0 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  rm the result se
10bd0 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  t of a SELECT st
10be0 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65  atement) compute
10bf0 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
10c00 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72  column names for
10c10 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 77 6f   a table that wo
10c20 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 78 70  uld hold the exp
10c30 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
10c40 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e  .** All column n
10c50 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 69  ames will be uni
10c60 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  que..**.** Only 
10c70 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
10c80 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e 20 20   are computed.  
10c90 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f  Column.zType, Co
10ca0 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61  lumn.zColl,.** a
10cb0 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  nd other fields 
10cc0 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65  of Column are ze
10cd0 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  roed..**.** Retu
10ce0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
10cf0 73 75 63 63 65 73 73 2e 20 20 49 66 20 61 20 6d  success.  If a m
10d00 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
10d10 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a   error occurs,.*
10d20 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20  * store NULL in 
10d30 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20  *paCol and 0 in 
10d40 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75 72  *pnCol and retur
10d50 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a  n SQLITE_NOMEM..
10d60 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 67  **.** The only g
10d70 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 53 51  uarantee that SQ
10d80 4c 69 74 65 20 6d 61 6b 65 73 20 61 62 6f 75 74  Lite makes about
10d90 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 73   column names is
10da0 20 74 68 61 74 20 69 66 20 74 68 65 0a 2a 2a 20   that if the.** 
10db0 63 6f 6c 75 6d 6e 20 68 61 73 20 61 6e 20 41 53  column has an AS
10dc0 20 63 6c 61 75 73 65 20 61 73 73 69 67 6e 69 6e   clause assignin
10dd0 67 20 69 74 20 61 20 6e 61 6d 65 2c 20 74 68 61  g it a name, tha
10de0 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20 6e 61  t will be the na
10df0 6d 65 20 75 73 65 64 2e 0a 2a 2a 20 54 68 61 74  me used..** That
10e00 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63   is the only doc
10e10 75 6d 65 6e 74 65 64 20 67 75 61 72 61 6e 74 65  umented guarante
10e20 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 63 6f 75  e.  However, cou
10e30 6e 74 6c 65 73 73 20 61 70 70 6c 69 63 61 74 69  ntless applicati
10e40 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c 6f 70 65 64  ons.** developed
10e50 20 6f 76 65 72 20 74 68 65 20 79 65 61 72 73 20   over the years 
10e60 68 61 76 65 20 6d 61 64 65 20 62 61 73 65 6c 65  have made basele
10e70 73 73 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 61  ss assumptions a
10e80 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  bout column name
10e90 73 0a 2a 2a 20 61 6e 64 20 77 69 6c 6c 20 62 72  s.** and will br
10ea0 65 61 6b 20 69 66 20 74 68 6f 73 65 20 61 73 73  eak if those ass
10eb0 75 6d 70 74 69 6f 6e 73 20 63 68 61 6e 67 65 73  umptions changes
10ec0 2e 20 20 48 65 6e 63 65 2c 20 75 73 65 20 65 78  .  Hence, use ex
10ed0 74 72 65 6d 65 20 63 61 75 74 69 6f 6e 0a 2a 2a  treme caution.**
10ee0 20 77 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20   when modifying 
10ef0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
10f00 61 76 6f 69 64 20 62 72 65 61 6b 69 6e 67 20 6c  avoid breaking l
10f10 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  egacy..**.** See
10f20 20 41 6c 73 6f 3a 20 67 65 6e 65 72 61 74 65 43   Also: generateC
10f30 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 0a 2a 2f 0a  olumnNames().*/.
10f40 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  int sqlite3Colum
10f50 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a  nsFromExprList(.
10f60 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
10f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
10f80 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
10f90 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
10fa0 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78 70  st,       /* Exp
10fb0 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69 63  r list from whic
10fc0 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c 75  h to derive colu
10fd0 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 31  mn names */.  i1
10fe0 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20  6 *pnCol,       
10ff0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
11000 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
11010 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20 43  umns here */.  C
11020 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20 20  olumn **paCol   
11030 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
11040 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c  the new column l
11050 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ist here */.){. 
11060 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
11070 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20  Parse->db;   /* 
11080 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
11090 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  ion */.  int i, 
110a0 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
110b0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
110c0 6e 74 65 72 73 20 2a 2f 0a 20 20 75 33 32 20 63  nters */.  u32 c
110d0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
110e0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
110f0 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68  added to make th
11100 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a 2f  e name unique */
11110 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c  .  Column *aCol,
11120 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20 2f   *pCol;        /
11130 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
11140 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  er result column
11150 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  s */.  int nCol;
11160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11170 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11180 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
11190 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 63  esult set */.  c
111a0 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
111b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
111c0 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  lumn name */.  i
111d0 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
111e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
111f0 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a 4e  ze of name in zN
11200 61 6d 65 5b 5d 20 2a 2f 0a 20 20 48 61 73 68 20  ame[] */.  Hash 
11210 68 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ht;             
11220 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74         /* Hash t
11230 61 62 6c 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e  able of column n
11240 61 6d 65 73 20 2a 2f 0a 0a 20 20 73 71 6c 69 74  ames */..  sqlit
11250 65 33 48 61 73 68 49 6e 69 74 28 26 68 74 29 3b  e3HashInit(&ht);
11260 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20 29 7b  .  if( pEList ){
11270 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 45 4c 69  .    nCol = pELi
11280 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61  st->nExpr;.    a
11290 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Col = sqlite3DbM
112a0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
112b0 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43  zeof(aCol[0])*nC
112c0 6f 6c 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ol);.    testcas
112d0 65 28 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20  e( aCol==0 );.  
112e0 20 20 69 66 28 20 6e 43 6f 6c 3e 33 32 37 36 37    if( nCol>32767
112f0 20 29 20 6e 43 6f 6c 20 3d 20 33 32 37 36 37 3b   ) nCol = 32767;
11300 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
11310 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43 6f 6c  ol = 0;.    aCol
11320 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
11330 72 74 28 20 6e 43 6f 6c 3d 3d 28 69 31 36 29 6e  rt( nCol==(i16)n
11340 43 6f 6c 20 29 3b 0a 20 20 2a 70 6e 43 6f 6c 20  Col );.  *pnCol 
11350 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43 6f 6c  = nCol;.  *paCol
11360 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f 72 28   = aCol;..  for(
11370 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20  i=0, pCol=aCol; 
11380 69 3c 6e 43 6f 6c 20 26 26 20 21 64 62 2d 3e 6d  i<nCol && !db->m
11390 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 20 69 2b 2b  allocFailed; i++
113a0 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f  , pCol++){.    /
113b0 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72  * Get an appropr
113c0 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  iate name for th
113d0 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a  e column.    */.
113e0 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d      if( (zName =
113f0 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
11400 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
11410 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
11420 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41  n contains an "A
11430 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65  S <name>" phrase
11440 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20  , use <name> as 
11450 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  the name */.    
11460 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
11470 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20 73 71  r *pColExpr = sq
11480 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
11490 6c 61 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69  late(pEList->a[i
114a0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
114b0 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d  while( pColExpr-
114c0 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20  >op==TK_DOT ){. 
114d0 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20         pColExpr 
114e0 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67  = pColExpr->pRig
114f0 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ht;.        asse
11500 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20  rt( pColExpr!=0 
11510 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11520 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45 78 70   assert( pColExp
11530 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f  r->op!=TK_AGG_CO
11540 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 69 66  LUMN );.      if
11550 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
11560 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
11570 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75       /* For colu
11580 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75  mns use the colu
11590 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a  mn name name */.
115a0 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
115b0 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f   = pColExpr->iCo
115c0 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 54 61  lumn;.        Ta
115d0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 43 6f 6c  ble *pTab = pCol
115e0 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Expr->pTab;.    
115f0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
11600 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !=0 );.        i
11610 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
11620 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
11630 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
11640 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e  iCol>=0 ? pTab->
11650 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
11660 20 3a 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20   : "rowid";.    
11670 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c    }else if( pCol
11680 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
11690 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
116a0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
116b0 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50  rty(pColExpr, EP
116c0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
116d0 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 43        zName = pC
116e0 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  olExpr->u.zToken
116f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11700 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68         /* Use th
11710 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20  e original text 
11720 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78  of the column ex
11730 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20  pression as its 
11740 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
11750 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
11760 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[i].zSpan;.    
11770 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
11780 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ( zName ){.     
11790 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
117a0 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61  DbStrDup(db, zNa
117b0 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
117c0 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
117d0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
117e0 22 63 6f 6c 75 6d 6e 25 64 22 2c 69 2b 31 29 3b  "column%d",i+1);
117f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
11800 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c  ake sure the col
11810 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71  umn name is uniq
11820 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65  ue.  If the name
11830 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a   is not unique,.
11840 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 6e      ** append an
11850 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20   integer to the 
11860 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20  name so that it 
11870 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a  becomes unique..
11880 20 20 20 20 2a 2f 0a 20 20 20 20 63 6e 74 20 3d      */.    cnt =
11890 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a   0;.    while( z
118a0 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 48  Name && sqlite3H
118b0 61 73 68 46 69 6e 64 28 26 68 74 2c 20 7a 4e 61  ashFind(&ht, zNa
118c0 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
118d0 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
118e0 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
118f0 20 20 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3e        if( nName>
11900 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  0 ){.        for
11910 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20 6a 3e 30 20  (j=nName-1; j>0 
11920 26 26 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  && sqlite3Isdigi
11930 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d  t(zName[j]); j--
11940 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ){}.        if( 
11950 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a 27 20 29 20  zName[j]==':' ) 
11960 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20 20 20 20 20  nName = j;.     
11970 20 7d 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d   }.      zName =
11980 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
11990 64 62 2c 20 22 25 2e 2a 7a 3a 25 75 22 2c 20 6e  db, "%.*z:%u", n
119a0 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63  Name, zName, ++c
119b0 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  nt);.      if( c
119c0 6e 74 3e 33 20 29 20 73 71 6c 69 74 65 33 5f 72  nt>3 ) sqlite3_r
119d0 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
119e0 28 63 6e 74 29 2c 20 26 63 6e 74 29 3b 0a 20 20  (cnt), &cnt);.  
119f0 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e    }.    pCol->zN
11a00 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
11a10 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72   sqlite3ColumnPr
11a20 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65  opertiesFromName
11a30 28 30 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 69  (0, pCol);.    i
11a40 66 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69  f( zName && sqli
11a50 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 68  te3HashInsert(&h
11a60 74 2c 20 7a 4e 61 6d 65 2c 20 70 43 6f 6c 29 3d  t, zName, pCol)=
11a70 3d 70 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73  =pCol ){.      s
11a80 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
11a90 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
11aa0 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
11ab0 28 26 68 74 29 3b 0a 20 20 69 66 28 20 64 62 2d  (&ht);.  if( db-
11ac0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
11ad0 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
11ae0 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  i; j++){.      s
11af0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
11b00 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b   aCol[j].zName);
11b10 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
11b20 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f  e3DbFree(db, aCo
11b30 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d  l);.    *paCol =
11b40 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d   0;.    *pnCol =
11b50 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
11b60 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
11b70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
11b80 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11b90 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64 20  ** Add type and 
11ba0 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
11bb0 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d  ation to a colum
11bc0 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a  n list based on.
11bd0 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ** a SELECT stat
11be0 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  ement..** .** Th
11bf0 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72  e column list pr
11c00 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72  esumably came fr
11c10 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e  om selectColumnN
11c20 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  amesFromExprList
11c30 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ()..** The colum
11c40 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20  n list has only 
11c50 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73  names, not types
11c60 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20   or collations. 
11c70 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
11c80 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e   goes through an
11c90 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65 73  d adds the types
11ca0 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e   and collations.
11cb0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
11cc0 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68 61  ine requires tha
11cd0 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72  t all identifier
11ce0 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a  s in the SELECT.
11cf0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20  ** statement be 
11d00 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 76 6f 69  resolved..*/.voi
11d10 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41  d sqlite3SelectA
11d20 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
11d30 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73  ollation(.  Pars
11d40 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
11d50 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
11d60 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65  texts */.  Table
11d70 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
11d80 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74   /* Add column t
11d90 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ype information 
11da0 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
11db0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
11dc0 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45  ct       /* SELE
11dd0 43 54 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  CT used to deter
11de0 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20 63  mine types and c
11df0 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  ollations */.){.
11e00 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
11e10 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61  pParse->db;.  Na
11e20 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
11e30 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
11e40 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
11e50 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72  .  int i;.  Expr
11e60 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45 78   *p;.  struct Ex
11e70 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
11e80 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65  .  assert( pSele
11e90 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ct!=0 );.  asser
11ea0 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c  t( (pSelect->sel
11eb0 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c  Flags & SF_Resol
11ec0 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61 73 73  ved)!=0 );.  ass
11ed0 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d  ert( pTab->nCol=
11ee0 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  =pSelect->pEList
11ef0 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d  ->nExpr || db->m
11f00 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
11f10 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
11f20 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
11f30 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
11f40 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
11f50 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
11f60 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a   pSelect->pSrc;.
11f70 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70    a = pSelect->p
11f80 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28  EList->a;.  for(
11f90 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e  i=0, pCol=pTab->
11fa0 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  aCol; i<pTab->nC
11fb0 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
11fc0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
11fd0 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 69 6e 74   *zType;.    int
11fe0 20 6e 2c 20 6d 3b 0a 20 20 20 20 70 20 3d 20 61   n, m;.    p = a
11ff0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7a  [i].pExpr;.    z
12000 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
12010 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c  e(&sNC, p, 0, 0,
12020 20 30 29 3b 0a 20 20 20 20 2f 2a 20 70 43 6f 6c   0);.    /* pCol
12030 2d 3e 73 7a 45 73 74 20 3d 20 2e 2e 2e 20 2f 2f  ->szEst = ... //
12040 20 43 6f 6c 75 6d 6e 20 73 69 7a 65 20 65 73 74   Column size est
12050 20 66 6f 72 20 53 45 4c 45 43 54 20 74 61 62 6c   for SELECT tabl
12060 65 73 20 6e 65 76 65 72 20 75 73 65 64 20 2a 2f  es never used */
12070 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  .    pCol->affin
12080 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
12090 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20  rAffinity(p);.  
120a0 20 20 69 66 28 20 7a 54 79 70 65 20 29 7b 0a 20    if( zType ){. 
120b0 20 20 20 20 20 6d 20 3d 20 73 71 6c 69 74 65 33       m = sqlite3
120c0 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b  Strlen30(zType);
120d0 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  .      n = sqlit
120e0 65 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 2d  e3Strlen30(pCol-
120f0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  >zName);.      p
12100 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  Col->zName = sql
12110 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
12120 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e  ree(db, pCol->zN
12130 61 6d 65 2c 20 6e 2b 6d 2b 32 29 3b 0a 20 20 20  ame, n+m+2);.   
12140 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 7a 4e 61     if( pCol->zNa
12150 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  me ){.        me
12160 6d 63 70 79 28 26 70 43 6f 6c 2d 3e 7a 4e 61 6d  mcpy(&pCol->zNam
12170 65 5b 6e 2b 31 5d 2c 20 7a 54 79 70 65 2c 20 6d  e[n+1], zType, m
12180 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  +1);.        pCo
12190 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l->colFlags |= C
121a0 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a  OLFLAG_HASTYPE;.
121b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
121c0 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69    if( pCol->affi
121d0 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e  nity==0 ) pCol->
121e0 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
121f0 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20  E_AFF_BLOB;.    
12200 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
12210 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
12220 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  e, p);.    if( p
12230 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 2d 3e 7a 43  Coll && pCol->zC
12240 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  oll==0 ){.      
12250 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71  pCol->zColl = sq
12260 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
12270 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
12280 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61  .    }.  }.  pTa
12290 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 31 3b  b->szTabRow = 1;
122a0 20 2f 2a 20 41 6e 79 20 6e 6f 6e 2d 7a 65 72 6f   /* Any non-zero
122b0 20 76 61 6c 75 65 20 77 6f 72 6b 73 20 2a 2f 0a   value works */.
122c0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
122d0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
122e0 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54 61  t, generate a Ta
122f0 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
12300 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20  at describes.** 
12310 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
12320 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a  f that SELECT..*
12330 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
12340 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
12350 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
12360 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
12370 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
12380 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
12390 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
123a0 69 6e 74 20 73 61 76 65 64 46 6c 61 67 73 3b 0a  int savedFlags;.
123b0 0a 20 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20  .  savedFlags = 
123c0 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d  db->flags;.  db-
123d0 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
123e0 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a  E_FullColNames;.
123f0 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
12400 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
12410 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  mes;.  sqlite3Se
12420 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c  lectPrep(pParse,
12430 20 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20   pSelect, 0);.  
12440 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
12450 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77   ) return 0;.  w
12460 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70  hile( pSelect->p
12470 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20  Prior ) pSelect 
12480 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  = pSelect->pPrio
12490 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d  r;.  db->flags =
124a0 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 20 20 70   savedFlags;.  p
124b0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
124c0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
124d0 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20  zeof(Table) );. 
124e0 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
124f0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
12500 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74  }.  /* The sqlit
12510 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
12520 65 63 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73  ect() is only us
12530 65 64 20 6e 20 63 6f 6e 74 65 78 74 73 20 77 68  ed n contexts wh
12540 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65 0a 20 20  ere lookaside.  
12550 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ** is disabled *
12560 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  /.  assert( db->
12570 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62  lookaside.bDisab
12580 6c 65 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 54  le );.  pTab->nT
12590 61 62 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61  abRef = 1;.  pTa
125a0 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  b->zName = 0;.  
125b0 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
125c0 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
125d0 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
125e0 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
125f0 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46   sqlite3ColumnsF
12600 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
12610 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  se, pSelect->pEL
12620 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c  ist, &pTab->nCol
12630 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  , &pTab->aCol);.
12640 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
12650 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
12660 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
12670 20 70 54 61 62 2c 20 70 53 65 6c 65 63 74 29 3b   pTab, pSelect);
12680 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d  .  pTab->iPKey =
12690 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   -1;.  if( db->m
126a0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
126b0 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
126c0 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b  Table(db, pTab);
126d0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
126e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62   }.  return pTab
126f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  ;.}../*.** Get a
12700 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69   VDBE for the gi
12710 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65  ven parser conte
12720 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  xt.  Create a ne
12730 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
12740 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  ry..** If an err
12750 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
12760 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65  n NULL and leave
12770 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50   a message in pP
12780 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73  arse..*/.Vdbe *s
12790 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61  qlite3GetVdbe(Pa
127a0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
127b0 69 66 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62  if( pParse->pVdb
127c0 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
127d0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
127e0 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d   }.  if( pParse-
127f0 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20 20  >pToplevel==0.  
12800 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
12810 45 6e 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e  Enabled(pParse->
12820 64 62 2c 53 51 4c 49 54 45 5f 46 61 63 74 6f 72  db,SQLITE_Factor
12830 4f 75 74 43 6f 6e 73 74 29 0a 20 20 29 7b 0a 20  OutConst).  ){. 
12840 20 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e     pParse->okCon
12850 73 74 46 61 63 74 6f 72 20 3d 20 31 3b 0a 20 20  stFactor = 1;.  
12860 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
12870 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50 61  e3VdbeCreate(pPa
12880 72 73 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rse);.}.../*.** 
12890 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d  Compute the iLim
128a0 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66  it and iOffset f
128b0 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c  ields of the SEL
128c0 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ECT based on the
128d0 0a 2a 2a 20 70 4c 69 6d 69 74 20 65 78 70 72 65  .** pLimit expre
128e0 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 2d  ssions.  pLimit-
128f0 3e 70 4c 65 66 74 20 61 6e 64 20 70 4c 69 6d 69  >pLeft and pLimi
12900 74 2d 3e 70 52 69 67 68 74 20 68 6f 6c 64 20 74  t->pRight hold t
12910 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  he expressions.*
12920 2a 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  * that appear in
12930 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
12940 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65  L statement afte
12950 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20  r the LIMIT and 
12960 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72  OFFSET.** keywor
12970 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20  ds.  Or NULL if 
12980 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61  those keywords a
12990 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d  re omitted. iLim
129a0 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a  it and iOffset .
129b0 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65 67  ** are the integ
129c0 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74  er memory regist
129d0 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63  er numbers for c
129e0 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20  ounters used to 
129f0 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20  compute .** the 
12a00 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74  limit and offset
12a10 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
12a20 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f  o limit and/or o
12a30 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20  ffset, then .** 
12a40 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
12a50 65 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e  et are negative.
12a60 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
12a70 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65 20  ine changes the 
12a80 76 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74  values of iLimit
12a90 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c   and iOffset onl
12aa0 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20  y if.** a limit 
12ab0 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64 65 66  or offset is def
12ac0 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 2d 3e  ined by pLimit->
12ad0 70 4c 65 66 74 20 61 6e 64 20 70 4c 69 6d 69 74  pLeft and pLimit
12ae0 2d 3e 70 52 69 67 68 74 2e 20 20 69 4c 69 6d 69  ->pRight.  iLimi
12af0 74 0a 2a 2a 20 61 6e 64 20 69 4f 66 66 73 65 74  t.** and iOffset
12b00 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
12b10 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72  n preset to appr
12b20 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20  opriate default 
12b30 76 61 6c 75 65 73 20 28 7a 65 72 6f 29 0a 2a 2a  values (zero).**
12b40 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
12b50 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
12b60 2a 2a 0a 2a 2a 20 54 68 65 20 69 4f 66 66 73 65  **.** The iOffse
12b70 74 20 72 65 67 69 73 74 65 72 20 28 69 66 20 69  t register (if i
12b80 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 69  t exists) is ini
12b90 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20  tialized to the 
12ba0 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20  value.** of the 
12bb0 4f 46 46 53 45 54 2e 20 20 54 68 65 20 69 4c 69  OFFSET.  The iLi
12bc0 6d 69 74 20 72 65 67 69 73 74 65 72 20 69 73 20  mit register is 
12bd0 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c  initialized to L
12be0 49 4d 49 54 2e 20 20 52 65 67 69 73 74 65 72 0a  IMIT.  Register.
12bf0 2a 2a 20 69 4f 66 66 73 65 74 2b 31 20 69 73 20  ** iOffset+1 is 
12c00 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c  initialized to L
12c10 49 4d 49 54 2b 4f 46 46 53 45 54 2e 0a 2a 2a 0a  IMIT+OFFSET..**.
12c20 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69  ** Only if pLimi
12c30 74 2d 3e 70 4c 65 66 74 21 3d 30 20 64 6f 20 74  t->pLeft!=0 do t
12c40 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65  he limit registe
12c50 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69  rs get.** redefi
12c60 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20  ned.  The UNION 
12c70 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65  ALL operator use
12c80 73 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 20  s this property 
12c90 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20  to force.** the 
12ca0 72 65 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d  reuse of the sam
12cb0 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73  e limit and offs
12cc0 65 74 20 72 65 67 69 73 74 65 72 73 20 61 63 72  et registers acr
12cd0 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  oss multiple.** 
12ce0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
12cf0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
12d00 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65  d computeLimitRe
12d10 67 69 73 74 65 72 73 28 50 61 72 73 65 20 2a 70  gisters(Parse *p
12d20 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
12d30 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20  , int iBreak){. 
12d40 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20   Vdbe *v = 0;.  
12d50 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  int iLimit = 0;.
12d60 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20    int iOffset;. 
12d70 20 69 6e 74 20 6e 3b 0a 20 20 45 78 70 72 20 2a   int n;.  Expr *
12d80 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
12d90 69 74 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 4c  it;..  if( p->iL
12da0 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a  imit ) return;..
12db0 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49    /* .  ** "LIMI
12dc0 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f  T -1" always sho
12dd0 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68  ws all rows.  Th
12de0 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a  ere is some.  **
12df0 20 63 6f 6e 74 72 6f 76 65 72 73 79 20 61 62 6f   controversy abo
12e00 75 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72  ut what the corr
12e10 65 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f  ect behavior sho
12e20 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65  uld be..  ** The
12e30 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
12e40 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65  ntation interpre
12e50 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20  ts "LIMIT 0" to 
12e60 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77  mean.  ** no row
12e70 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c  s..  */.  if( pL
12e80 69 6d 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65  imit ){.    asse
12e90 72 74 28 20 70 4c 69 6d 69 74 2d 3e 6f 70 3d 3d  rt( pLimit->op==
12ea0 54 4b 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20  TK_LIMIT );.    
12eb0 61 73 73 65 72 74 28 20 70 4c 69 6d 69 74 2d 3e  assert( pLimit->
12ec0 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20  pLeft!=0 );.    
12ed0 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d  p->iLimit = iLim
12ee0 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  it = ++pParse->n
12ef0 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c  Mem;.    v = sql
12f00 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
12f10 73 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  se);.    assert(
12f20 20 76 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28   v!=0 );.    if(
12f30 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
12f40 74 65 67 65 72 28 70 4c 69 6d 69 74 2d 3e 70 4c  teger(pLimit->pL
12f50 65 66 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20  eft, &n) ){.    
12f60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12f70 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
12f80 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  r, n, iLimit);. 
12f90 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
12fa0 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e  ((v, "LIMIT coun
12fb0 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69 66  ter"));.      if
12fc0 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
12fd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
12fe0 6f 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  o(v, iBreak);.  
12ff0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e      }else if( n>
13000 3d 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74  =0 && p->nSelect
13010 52 6f 77 3e 73 71 6c 69 74 65 33 4c 6f 67 45 73  Row>sqlite3LogEs
13020 74 28 28 75 36 34 29 6e 29 20 29 7b 0a 20 20 20  t((u64)n) ){.   
13030 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
13040 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
13050 73 74 28 28 75 36 34 29 6e 29 3b 0a 20 20 20 20  st((u64)n);.    
13060 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
13070 7c 3d 20 53 46 5f 46 69 78 65 64 4c 69 6d 69 74  |= SF_FixedLimit
13080 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
13090 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
130a0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
130b0 65 2c 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74  e, pLimit->pLeft
130c0 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
130d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
130e0 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p1(v, OP_MustBeI
130f0 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64 62  nt, iLimit); Vdb
13100 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
13110 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
13120 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74  (v, "LIMIT count
13130 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  er"));.      sql
13140 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13150 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d  , OP_IfNot, iLim
13160 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  it, iBreak); Vdb
13170 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
13180 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 6d    }.    if( pLim
13190 69 74 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  it->pRight ){.  
131a0 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
131b0 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61   iOffset = ++pPa
131c0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
131d0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
131e0 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61     /* Allocate a
131f0 6e 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  n extra register
13200 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65   for limit+offse
13210 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  t */.      sqlit
13220 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
13230 65 2c 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68  e, pLimit->pRigh
13240 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  t, iOffset);.   
13250 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13260 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp1(v, OP_MustB
13270 65 49 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b 20  eInt, iOffset); 
13280 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
13290 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
132a0 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54 20 63  nt((v, "OFFSET c
132b0 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20  ounter"));.     
132c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
132d0 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c  p3(v, OP_OffsetL
132e0 69 6d 69 74 2c 20 69 4c 69 6d 69 74 2c 20 69 4f  imit, iLimit, iO
132f0 66 66 73 65 74 2b 31 2c 20 69 4f 66 66 73 65 74  ffset+1, iOffset
13300 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
13310 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b  ment((v, "LIMIT+
13320 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20 7d  OFFSET"));.    }
13330 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
13340 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
13350 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
13360 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70  * Return the app
13370 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69  ropriate collati
13380 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
13390 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
133a0 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73  mn of.** the res
133b0 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65 20  ult set for the 
133c0 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20  compound-select 
133d0 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20  statement "p".  
133e0 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a  Return NULL if.*
133f0 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73  * the column has
13400 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c   no default coll
13410 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
13420 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74  **.** The collat
13430 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
13440 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
13450 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72  lect is taken fr
13460 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d  om the.** left-m
13470 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ost term of the 
13480 73 65 6c 65 63 74 20 74 68 61 74 20 68 61 73 20  select that has 
13490 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
134a0 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ence..*/.static 
134b0 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65  CollSeq *multiSe
134c0 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73  lectCollSeq(Pars
134d0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
134e0 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b  t *p, int iCol){
134f0 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74  .  CollSeq *pRet
13500 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  ;.  if( p->pPrio
13510 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  r ){.    pRet = 
13520 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
13530 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50  eq(pParse, p->pP
13540 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d  rior, iCol);.  }
13550 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d  else{.    pRet =
13560 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
13570 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 2f  ( iCol>=0 );.  /
13580 2a 20 69 43 6f 6c 20 6d 75 73 74 20 62 65 20 6c  * iCol must be l
13590 65 73 73 20 74 68 61 6e 20 70 2d 3e 70 45 4c 69  ess than p->pELi
135a0 73 74 2d 3e 6e 45 78 70 72 2e 20 20 4f 74 68 65  st->nExpr.  Othe
135b0 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 77  rwise an error w
135c0 6f 75 6c 64 0a 20 20 2a 2a 20 68 61 76 65 20 62  ould.  ** have b
135d0 65 65 6e 20 74 68 72 6f 77 6e 20 64 75 72 69 6e  een thrown durin
135e0 67 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  g name resolutio
135f0 6e 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 6e  n and we would n
13600 6f 74 20 68 61 76 65 20 67 6f 74 74 65 6e 0a 20  ot have gotten. 
13610 20 2a 2a 20 74 68 69 73 20 66 61 72 20 2a 2f 0a   ** this far */.
13620 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26 26    if( pRet==0 &&
13630 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 2d 3e   ALWAYS(iCol<p->
13640 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  pEList->nExpr) )
13650 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  {.    pRet = sql
13660 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
13670 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73  pParse, p->pELis
13680 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72  t->a[iCol].pExpr
13690 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
136a0 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pRet;.}../*.** T
136b0 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
136c0 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ent passed as th
136d0 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
136e0 65 72 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  er is a compound
136f0 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20   SELECT.** with 
13700 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
13710 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  se. This functio
13720 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20  n allocates and 
13730 72 65 74 75 72 6e 73 20 61 20 4b 65 79 49 6e 66  returns a KeyInf
13740 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 73  o.** structure s
13750 75 69 74 61 62 6c 65 20 66 6f 72 20 69 6d 70 6c  uitable for impl
13760 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44  ementing the ORD
13770 45 52 20 42 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61  ER BY..**.** Spa
13780 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
13790 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
137a0 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
137b0 6d 20 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 63 61  m malloc. The ca
137c0 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
137d0 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  n is responsible
137e0 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68   for ensuring th
137f0 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72  at this structur
13800 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a  e is eventually.
13810 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61  ** freed..*/.sta
13820 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c  tic KeyInfo *mul
13830 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b  tiSelectOrderByK
13840 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  eyInfo(Parse *pP
13850 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
13860 20 69 6e 74 20 6e 45 78 74 72 61 29 7b 0a 20 20   int nExtra){.  
13870 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
13880 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
13890 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  ;.  int nOrderBy
138a0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e   = p->pOrderBy->
138b0 6e 45 78 70 72 3b 0a 20 20 73 71 6c 69 74 65 33  nExpr;.  sqlite3
138c0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
138d0 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 52  b;.  KeyInfo *pR
138e0 65 74 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  et = sqlite3KeyI
138f0 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72  nfoAlloc(db, nOr
13900 64 65 72 42 79 2b 6e 45 78 74 72 61 2c 20 31 29  derBy+nExtra, 1)
13910 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a  ;.  if( pRet ){.
13920 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
13930 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
13940 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
13950 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
13960 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
13970 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20  OrderBy->a[i];. 
13980 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d       Expr *pTerm
13990 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
139a0 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
139b0 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 69 66  pColl;..      if
139c0 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26  ( pTerm->flags &
139d0 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20   EP_Collate ){. 
139e0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
139f0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
13a00 71 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 29  q(pParse, pTerm)
13a10 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13a20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d         pColl = m
13a30 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
13a40 71 28 70 50 61 72 73 65 2c 20 70 2c 20 70 49 74  q(pParse, p, pIt
13a50 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
13a60 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Col-1);.        
13a70 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70  if( pColl==0 ) p
13a80 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
13a90 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f  Coll;.        pO
13aa0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
13ab0 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73  pr =.          s
13ac0 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c  qlite3ExprAddCol
13ad0 6c 61 74 65 53 74 72 69 6e 67 28 70 50 61 72 73  lateString(pPars
13ae0 65 2c 20 70 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d  e, pTerm, pColl-
13af0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  >zName);.      }
13b00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
13b10 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
13b20 72 69 74 65 61 62 6c 65 28 70 52 65 74 29 20 29  riteable(pRet) )
13b30 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 61 43  ;.      pRet->aC
13b40 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a  oll[i] = pColl;.
13b50 20 20 20 20 20 20 70 52 65 74 2d 3e 61 53 6f 72        pRet->aSor
13b60 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64  tOrder[i] = pOrd
13b70 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
13b80 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rder;.    }.  }.
13b90 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
13ba0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
13bb0 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a  E_OMIT_CTE./*.**
13bc0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
13bd0 6e 65 72 61 74 65 73 20 56 44 42 45 20 63 6f 64  nerates VDBE cod
13be0 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  e to compute the
13bf0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 49   content of a WI
13c00 54 48 20 52 45 43 55 52 53 49 56 45 0a 2a 2a 20  TH RECURSIVE.** 
13c10 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72  query of the for
13c20 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c 72 65 63 75  m:.**.**   <recu
13c30 72 73 69 76 65 2d 74 61 62 6c 65 3e 20 41 53 20  rsive-table> AS 
13c40 28 3c 73 65 74 75 70 2d 71 75 65 72 79 3e 20 55  (<setup-query> U
13c50 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 3c 72 65 63 75  NION [ALL] <recu
13c60 72 73 69 76 65 2d 71 75 65 72 79 3e 29 0a 2a 2a  rsive-query>).**
13c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c80 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
13c90 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20  _____/          
13ca0 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
13cb0 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20  ___/.**         
13cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cd0 20 20 70 2d 3e 70 50 72 69 6f 72 20 20 20 20 20    p->pPrior     
13ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cf0 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72   p.**.**.** Ther
13d00 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65  e is exactly one
13d10 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
13d20 65 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c  e recursive-tabl
13d30 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
13d40 61 75 73 65 0a 2a 2a 20 6f 66 20 72 65 63 75 72  ause.** of recur
13d50 73 69 76 65 2d 71 75 65 72 79 2c 20 6d 61 72 6b  sive-query, mark
13d60 65 64 20 77 69 74 68 20 74 68 65 20 53 72 63 4c  ed with the SrcL
13d70 69 73 74 2d 3e 61 5b 5d 2e 66 67 2e 69 73 52 65  ist->a[].fg.isRe
13d80 63 75 72 73 69 76 65 20 66 6c 61 67 2e 0a 2a 2a  cursive flag..**
13d90 0a 2a 2a 20 54 68 65 20 73 65 74 75 70 2d 71 75  .** The setup-qu
13da0 65 72 79 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f  ery runs once to
13db0 20 67 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 69   generate an ini
13dc0 74 69 61 6c 20 73 65 74 20 6f 66 20 72 6f 77 73  tial set of rows
13dd0 20 74 68 61 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f   that go.** into
13de0 20 61 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20   a Queue table. 
13df0 20 52 6f 77 73 20 61 72 65 20 65 78 74 72 61 63   Rows are extrac
13e00 74 65 64 20 66 72 6f 6d 20 74 68 65 20 51 75 65  ted from the Que
13e10 75 65 20 74 61 62 6c 65 20 6f 6e 65 20 62 79 0a  ue table one by.
13e20 2a 2a 20 6f 6e 65 2e 20 20 45 61 63 68 20 72 6f  ** one.  Each ro
13e30 77 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  w extracted from
13e40 20 51 75 65 75 65 20 69 73 20 6f 75 74 70 75 74   Queue is output
13e50 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65 6e   to pDest.  Then
13e60 20 74 68 65 20 73 69 6e 67 6c 65 0a 2a 2a 20 65   the single.** e
13e70 78 74 72 61 63 74 65 64 20 72 6f 77 20 28 6e 6f  xtracted row (no
13e80 77 20 69 6e 20 74 68 65 20 69 43 75 72 72 65 6e  w in the iCurren
13e90 74 20 74 61 62 6c 65 29 20 62 65 63 6f 6d 65 73  t table) becomes
13ea0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
13eb0 74 68 65 0a 2a 2a 20 72 65 63 75 72 73 69 76 65  the.** recursive
13ec0 2d 74 61 62 6c 65 20 66 6f 72 20 61 20 72 65 63  -table for a rec
13ed0 75 72 73 69 76 65 2d 71 75 65 72 79 20 72 75 6e  ursive-query run
13ee0 2e 20 20 54 68 65 20 6f 75 74 70 75 74 20 6f 66  .  The output of
13ef0 20 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 71   the recursive-q
13f00 75 65 72 79 0a 2a 2a 20 69 73 20 61 64 64 65 64  uery.** is added
13f10 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 51   back into the Q
13f20 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65  ueue table.  The
13f30 6e 20 61 6e 6f 74 68 65 72 20 72 6f 77 20 69 73  n another row is
13f40 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
13f50 51 75 65 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65  Queue.** and the
13f60 20 69 74 65 72 61 74 69 6f 6e 20 63 6f 6e 74 69   iteration conti
13f70 6e 75 65 73 20 75 6e 74 69 6c 20 74 68 65 20 51  nues until the Q
13f80 75 65 75 65 20 74 61 62 6c 65 20 69 73 20 65 6d  ueue table is em
13f90 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  pty..**.** If th
13fa0 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
13fb0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49   operator is UNI
13fc0 4f 4e 20 74 68 65 6e 20 6e 6f 20 64 75 70 6c 69  ON then no dupli
13fd0 63 61 74 65 20 72 6f 77 73 20 61 72 65 20 65 76  cate rows are ev
13fe0 65 72 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69  er.** inserted i
13ff0 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61  nto the Queue ta
14000 62 6c 65 2e 20 20 54 68 65 20 69 44 69 73 74 69  ble.  The iDisti
14010 6e 63 74 20 74 61 62 6c 65 20 6b 65 65 70 73 20  nct table keeps 
14020 61 20 63 6f 70 79 20 6f 66 20 61 6c 6c 20 72 6f  a copy of all ro
14030 77 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20  ws.** that have 
14040 65 76 65 72 20 62 65 65 6e 20 69 6e 73 65 72 74  ever been insert
14050 65 64 20 69 6e 74 6f 20 51 75 65 75 65 20 61 6e  ed into Queue an
14060 64 20 63 61 75 73 65 73 20 64 75 70 6c 69 63 61  d causes duplica
14070 74 65 73 20 74 6f 20 62 65 0a 2a 2a 20 64 69 73  tes to be.** dis
14080 63 61 72 64 65 64 2e 20 20 49 66 20 74 68 65 20  carded.  If the 
14090 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f  operator is UNIO
140a0 4e 20 41 4c 4c 2c 20 74 68 65 6e 20 64 75 70 6c  N ALL, then dupl
140b0 69 63 61 74 65 73 20 61 72 65 20 61 6c 6c 6f 77  icates are allow
140c0 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68  ed..** .** If th
140d0 65 20 71 75 65 72 79 20 68 61 73 20 61 6e 20 4f  e query has an O
140e0 52 44 45 52 20 42 59 2c 20 74 68 65 6e 20 65 6e  RDER BY, then en
140f0 74 72 69 65 73 20 69 6e 20 74 68 65 20 51 75 65  tries in the Que
14100 75 65 20 74 61 62 6c 65 20 61 72 65 20 6b 65 70  ue table are kep
14110 74 20 69 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59  t in.** ORDER BY
14120 20 6f 72 64 65 72 20 61 6e 64 20 74 68 65 20 66   order and the f
14130 69 72 73 74 20 65 6e 74 72 79 20 69 73 20 65 78  irst entry is ex
14140 74 72 61 63 74 65 64 20 66 6f 72 20 65 61 63 68  tracted for each
14150 20 63 79 63 6c 65 2e 20 20 57 69 74 68 6f 75 74   cycle.  Without
14160 0a 2a 2a 20 61 6e 20 4f 52 44 45 52 20 42 59 2c  .** an ORDER BY,
14170 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
14180 20 69 73 20 6a 75 73 74 20 61 20 46 49 46 4f 2e   is just a FIFO.
14190 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4c 49 4d 49  .**.** If a LIMI
141a0 54 20 63 6c 61 75 73 65 20 69 73 20 70 72 6f 76  T clause is prov
141b0 69 64 65 64 2c 20 74 68 65 6e 20 74 68 65 20 69  ided, then the i
141c0 74 65 72 61 74 69 6f 6e 20 73 74 6f 70 73 20 61  teration stops a
141d0 66 74 65 72 20 4c 49 4d 49 54 20 72 6f 77 73 0a  fter LIMIT rows.
141e0 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 6f 75 74  ** have been out
141f0 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20 41  put to pDest.  A
14200 20 4c 49 4d 49 54 20 6f 66 20 7a 65 72 6f 20 6d   LIMIT of zero m
14210 65 61 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 6e  eans to output n
14220 6f 20 72 6f 77 73 20 61 6e 64 20 61 0a 2a 2a 20  o rows and a.** 
14230 6e 65 67 61 74 69 76 65 20 4c 49 4d 49 54 20 6d  negative LIMIT m
14240 65 61 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 61  eans to output a
14250 6c 6c 20 72 6f 77 73 2e 20 20 49 66 20 74 68 65  ll rows.  If the
14260 72 65 20 69 73 20 61 6c 73 6f 20 61 6e 20 4f 46  re is also an OF
14270 46 53 45 54 20 63 6c 61 75 73 65 0a 2a 2a 20 77  FSET clause.** w
14280 69 74 68 20 61 20 70 6f 73 69 74 69 76 65 20 76  ith a positive v
14290 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 66  alue, then the f
142a0 69 72 73 74 20 4f 46 46 53 45 54 20 6f 75 74 70  irst OFFSET outp
142b0 75 74 73 20 61 72 65 20 64 69 73 63 61 72 64 65  uts are discarde
142c0 64 20 72 61 74 68 65 72 0a 2a 2a 20 74 68 61 6e  d rather.** than
142d0 20 62 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 70   being sent to p
142e0 44 65 73 74 2e 20 20 54 68 65 20 4c 49 4d 49 54  Dest.  The LIMIT
142f0 20 63 6f 75 6e 74 20 64 6f 65 73 20 6e 6f 74 20   count does not 
14300 62 65 67 69 6e 20 75 6e 74 69 6c 20 61 66 74 65  begin until afte
14310 72 20 4f 46 46 53 45 54 0a 2a 2a 20 72 6f 77 73  r OFFSET.** rows
14320 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70   have been skipp
14330 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
14340 69 64 20 67 65 6e 65 72 61 74 65 57 69 74 68 52  id generateWithR
14350 65 63 75 72 73 69 76 65 51 75 65 72 79 28 0a 20  ecursiveQuery(. 
14360 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
14370 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
14380 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
14390 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
143a0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 75       /* The recu
143b0 72 73 69 76 65 20 53 45 4c 45 43 54 20 74 6f 20  rsive SELECT to 
143c0 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
143d0 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
143e0 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
143f0 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
14400 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63  ults */.){.  Src
14410 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e  List *pSrc = p->
14420 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68  pSrc;      /* Th
14430 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
14440 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 71   the recursive q
14450 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  uery */.  int nC
14460 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ol = p->pEList->
14470 6e 45 78 70 72 3b 20 20 2f 2a 20 4e 75 6d 62 65  nExpr;  /* Numbe
14480 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
14490 74 68 65 20 72 65 63 75 72 73 69 76 65 20 74 61  the recursive ta
144a0 62 6c 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ble */.  Vdbe *v
144b0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
144c0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72  ;      /* The pr
144d0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
144e0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
144f0 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ion */.  Select 
14500 2a 70 53 65 74 75 70 20 3d 20 70 2d 3e 70 50 72  *pSetup = p->pPr
14510 69 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 73 65  ior;   /* The se
14520 74 75 70 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  tup query */.  i
14530 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20  nt addrTop;     
14540 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14550 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  Top of the loop 
14560 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e  */.  int addrCon
14570 74 2c 20 61 64 64 72 42 72 65 61 6b 3b 20 20 20  t, addrBreak;   
14580 20 20 20 2f 2a 20 43 4f 4e 54 49 4e 55 45 20 61     /* CONTINUE a
14590 6e 64 20 42 52 45 41 4b 20 61 64 64 72 65 73 73  nd BREAK address
145a0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  es */.  int iCur
145b0 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20  rent = 0;       
145c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 43 75 72        /* The Cur
145d0 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  rent table */.  
145e0 69 6e 74 20 72 65 67 43 75 72 72 65 6e 74 3b 20  int regCurrent; 
145f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14600 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
14610 67 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20  g Current table 
14620 2a 2f 0a 20 20 69 6e 74 20 69 51 75 65 75 65 3b  */.  int iQueue;
14630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14640 20 20 20 2f 2a 20 54 68 65 20 51 75 65 75 65 20     /* The Queue 
14650 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
14660 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 20 20 20  Distinct = 0;   
14670 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 65           /* To e
14680 6e 73 75 72 65 20 75 6e 69 71 75 65 20 72 65 73  nsure unique res
14690 75 6c 74 73 20 69 66 20 55 4e 49 4f 4e 20 2a 2f  ults if UNION */
146a0 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 53  .  int eDest = S
146b0 52 54 5f 46 69 66 6f 3b 20 20 20 20 20 20 20 20  RT_Fifo;        
146c0 20 2f 2a 20 48 6f 77 20 74 6f 20 77 72 69 74 65   /* How to write
146d0 20 74 6f 20 51 75 65 75 65 20 2a 2f 0a 20 20 53   to Queue */.  S
146e0 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 51 75  electDest destQu
146f0 65 75 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  eue;         /* 
14700 53 65 6c 65 63 74 44 65 73 74 20 74 61 72 67 65  SelectDest targe
14710 74 74 69 6e 67 20 74 68 65 20 51 75 65 75 65 20  tting the Queue 
14720 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
14730 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14740 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
14750 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
14760 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
14770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
14780 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
14790 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
147a0 42 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  By;           /*
147b0 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
147c0 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
147d0 70 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20  pLimit;         
147e0 20 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64          /* Saved
147f0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
14800 54 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69  T */.  int regLi
14810 6d 69 74 2c 20 72 65 67 4f 66 66 73 65 74 3b 20  mit, regOffset; 
14820 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
14830 73 20 75 73 65 64 20 62 79 20 4c 49 4d 49 54 20  s used by LIMIT 
14840 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 0a 23  and OFFSET */..#
14850 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14860 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20  IT_WINDOWFUNC.  
14870 69 66 28 20 70 2d 3e 70 57 69 6e 20 29 7b 0a 20  if( p->pWin ){. 
14880 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14890 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
148a0 6f 74 20 75 73 65 20 77 69 6e 64 6f 77 20 66 75  ot use window fu
148b0 6e 63 74 69 6f 6e 73 20 69 6e 20 72 65 63 75 72  nctions in recur
148c0 73 69 76 65 20 71 75 65 72 69 65 73 22 29 3b 0a  sive queries");.
148d0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
148e0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 62 74  #endif..  /* Obt
148f0 61 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  ain authorizatio
14900 6e 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72 73  n to do a recurs
14910 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ive query */.  i
14920 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
14930 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
14940 54 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30 2c  TE_RECURSIVE, 0,
14950 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b   0, 0) ) return;
14960 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74  ..  /* Process t
14970 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
14980 53 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66 20  SET clauses, if 
14990 74 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20 20  they exist */.  
149a0 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69  addrBreak = sqli
149b0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
149c0 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63  (v);.  p->nSelec
149d0 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20  tRow = 320;  /* 
149e0 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a  4 billion rows *
149f0 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  /.  computeLimit
14a00 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
14a10 2c 20 70 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  , p, addrBreak);
14a20 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  .  pLimit = p->p
14a30 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4c 69 6d 69  Limit;.  regLimi
14a40 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20  t = p->iLimit;. 
14a50 20 72 65 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e   regOffset = p->
14a60 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c  iOffset;.  p->pL
14a70 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69  imit = 0;.  p->i
14a80 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73  Limit = p->iOffs
14a90 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72  et = 0;.  pOrder
14aa0 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
14ab0 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  ;..  /* Locate t
14ac0 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
14ad0 20 6f 66 20 74 68 65 20 43 75 72 72 65 6e 74 20   of the Current 
14ae0 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69  table */.  for(i
14af0 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 53 72  =0; ALWAYS(i<pSr
14b00 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a  c->nSrc); i++){.
14b10 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b      if( pSrc->a[
14b20 69 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76  i].fg.isRecursiv
14b30 65 20 29 7b 0a 20 20 20 20 20 20 69 43 75 72 72  e ){.      iCurr
14b40 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d  ent = pSrc->a[i]
14b50 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  .iCursor;.      
14b60 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
14b70 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
14b80 63 75 72 73 6f 72 73 20 6e 75 6d 62 65 72 73 20  cursors numbers 
14b90 66 6f 72 20 51 75 65 75 65 20 61 6e 64 20 44 69  for Queue and Di
14ba0 73 74 69 6e 63 74 2e 20 20 54 68 65 20 63 75 72  stinct.  The cur
14bb0 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20  sor number for. 
14bc0 20 2a 2a 20 74 68 65 20 44 69 73 74 69 6e 63 74   ** the Distinct
14bd0 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 65   table must be e
14be0 78 61 63 74 6c 79 20 6f 6e 65 20 67 72 65 61 74  xactly one great
14bf0 65 72 20 74 68 61 6e 20 51 75 65 75 65 20 69 6e  er than Queue in
14c00 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20   order.  ** for 
14c10 74 68 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f  the SRT_DistFifo
14c20 20 61 6e 64 20 53 52 54 5f 44 69 73 74 51 75 65   and SRT_DistQue
14c30 75 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 20  ue destinations 
14c40 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51  to work. */.  iQ
14c50 75 65 75 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  ueue = pParse->n
14c60 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e  Tab++;.  if( p->
14c70 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
14c80 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64      eDest = pOrd
14c90 65 72 42 79 20 3f 20 53 52 54 5f 44 69 73 74 51  erBy ? SRT_DistQ
14ca0 75 65 75 65 20 3a 20 53 52 54 5f 44 69 73 74 46  ueue : SRT_DistF
14cb0 69 66 6f 3b 0a 20 20 20 20 69 44 69 73 74 69 6e  ifo;.    iDistin
14cc0 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
14cd0 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  b++;.  }else{.  
14ce0 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72    eDest = pOrder
14cf0 42 79 20 3f 20 53 52 54 5f 51 75 65 75 65 20 3a  By ? SRT_Queue :
14d00 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20   SRT_Fifo;.  }. 
14d10 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
14d20 73 74 49 6e 69 74 28 26 64 65 73 74 51 75 65 75  stInit(&destQueu
14d30 65 2c 20 65 44 65 73 74 2c 20 69 51 75 65 75 65  e, eDest, iQueue
14d40 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
14d50 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20 43 75  e cursors for Cu
14d60 72 72 65 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e  rrent, Queue, an
14d70 64 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20  d Distinct. */. 
14d80 20 72 65 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b   regCurrent = ++
14d90 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
14da0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14db0 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75  3(v, OP_OpenPseu
14dc0 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20 72 65  do, iCurrent, re
14dd0 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b  gCurrent, nCol);
14de0 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
14df0 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
14e00 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69  pKeyInfo = multi
14e10 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79  SelectOrderByKey
14e20 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20  Info(pParse, p, 
14e30 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
14e40 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
14e50 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
14e60 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d  Queue, pOrderBy-
14e70 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20  >nExpr+2, 0,.   
14e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e90 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
14ea0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
14eb0 0a 20 20 20 20 64 65 73 74 51 75 65 75 65 2e 70  .    destQueue.p
14ec0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
14ed0 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  By;.  }else{.   
14ee0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14ef0 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
14f00 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20  emeral, iQueue, 
14f10 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62  nCol);.  }.  Vdb
14f20 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75  eComment((v, "Qu
14f30 65 75 65 20 74 61 62 6c 65 22 29 29 3b 0a 20 20  eue table"));.  
14f40 69 66 28 20 69 44 69 73 74 69 6e 63 74 20 29 7b  if( iDistinct ){
14f50 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e  .    p->addrOpen
14f60 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Ephm[0] = sqlite
14f70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14f80 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
14f90 20 69 44 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a   iDistinct, 0);.
14fa0 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
14fb0 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
14fc0 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ral;.  }..  /* D
14fd0 65 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20  etach the ORDER 
14fe0 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74  BY clause from t
14ff0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  he compound SELE
15000 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65  CT */.  p->pOrde
15010 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53  rBy = 0;..  /* S
15020 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
15030 20 6f 66 20 74 68 65 20 73 65 74 75 70 2d 71 75   of the setup-qu
15040 65 72 79 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f  ery in Queue. */
15050 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74  .  pSetup->pNext
15060 20 3d 20 30 3b 0a 20 20 45 78 70 6c 61 69 6e 51   = 0;.  ExplainQ
15070 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
15080 2c 20 31 2c 20 22 53 45 54 55 50 22 29 29 3b 0a  , 1, "SETUP"));.
15090 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
150a0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
150b0 74 75 70 2c 20 26 64 65 73 74 51 75 65 75 65 29  tup, &destQueue)
150c0 3b 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78  ;.  pSetup->pNex
150d0 74 20 3d 20 70 3b 0a 20 20 69 66 28 20 72 63 20  t = p;.  if( rc 
150e0 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72 65  ) goto end_of_re
150f0 63 75 72 73 69 76 65 5f 71 75 65 72 79 3b 0a 0a  cursive_query;..
15100 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 65    /* Find the ne
15110 78 74 20 72 6f 77 20 69 6e 20 74 68 65 20 51 75  xt row in the Qu
15120 65 75 65 20 61 6e 64 20 6f 75 74 70 75 74 20 74  eue and output t
15130 68 61 74 20 72 6f 77 20 2a 2f 0a 20 20 61 64 64  hat row */.  add
15140 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
15150 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
15160 65 77 69 6e 64 2c 20 69 51 75 65 75 65 2c 20 61  ewind, iQueue, a
15170 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43  ddrBreak); VdbeC
15180 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f  overage(v);..  /
15190 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 6e  * Transfer the n
151a0 65 78 74 20 72 6f 77 20 69 6e 20 51 75 65 75 65  ext row in Queue
151b0 20 6f 76 65 72 20 74 6f 20 43 75 72 72 65 6e 74   over to Current
151c0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
151d0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75  eAddOp1(v, OP_Nu
151e0 6c 6c 52 6f 77 2c 20 69 43 75 72 72 65 6e 74 29  llRow, iCurrent)
151f0 3b 20 2f 2a 20 54 6f 20 72 65 73 65 74 20 63 6f  ; /* To reset co
15200 6c 75 6d 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20  lumn cache */.  
15210 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
15220 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15230 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
15240 6d 6e 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64  mn, iQueue, pOrd
15250 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72  erBy->nExpr+1, r
15260 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 65  egCurrent);.  }e
15270 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
15280 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15290 5f 52 6f 77 44 61 74 61 2c 20 69 51 75 65 75 65  _RowData, iQueue
152a0 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20  , regCurrent);. 
152b0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
152c0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c  AddOp1(v, OP_Del
152d0 65 74 65 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20  ete, iQueue);.. 
152e0 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 73   /* Output the s
152f0 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72  ingle row in Cur
15300 72 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 43 6f  rent */.  addrCo
15310 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
15320 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
15330 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 72 65  codeOffset(v, re
15340 67 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e  gOffset, addrCon
15350 74 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65  t);.  selectInne
15360 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
15370 20 69 43 75 72 72 65 6e 74 2c 0a 20 20 20 20 20   iCurrent,.     
15380 20 30 2c 20 30 2c 20 70 44 65 73 74 2c 20 61 64   0, 0, pDest, ad
15390 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61  drCont, addrBrea
153a0 6b 29 3b 0a 20 20 69 66 28 20 72 65 67 4c 69 6d  k);.  if( regLim
153b0 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
153c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
153d0 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20  P_DecrJumpZero, 
153e0 72 65 67 4c 69 6d 69 74 2c 20 61 64 64 72 42 72  regLimit, addrBr
153f0 65 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  eak);.    VdbeCo
15400 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20  verage(v);.  }. 
15410 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
15420 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
15430 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45 78 65  Cont);..  /* Exe
15440 63 75 74 65 20 74 68 65 20 72 65 63 75 72 73 69  cute the recursi
15450 76 65 20 53 45 4c 45 43 54 20 74 61 6b 69 6e 67  ve SELECT taking
15460 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20   the single row 
15470 69 6e 20 43 75 72 72 65 6e 74 20 61 73 0a 20 20  in Current as.  
15480 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  ** the value for
15490 20 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 74   the recursive-t
154a0 61 62 6c 65 2e 20 53 74 6f 72 65 20 74 68 65 20  able. Store the 
154b0 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 51  results in the Q
154c0 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ueue..  */.  if(
154d0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
154e0 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b 0a 20  F_Aggregate ){. 
154f0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15500 73 67 28 70 50 61 72 73 65 2c 20 22 72 65 63 75  sg(pParse, "recu
15510 72 73 69 76 65 20 61 67 67 72 65 67 61 74 65 20  rsive aggregate 
15520 71 75 65 72 69 65 73 20 6e 6f 74 20 73 75 70 70  queries not supp
15530 6f 72 74 65 64 22 29 3b 0a 20 20 7d 65 6c 73 65  orted");.  }else
15540 7b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  {.    p->pPrior 
15550 3d 20 30 3b 0a 20 20 20 20 45 78 70 6c 61 69 6e  = 0;.    Explain
15560 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
15570 65 2c 20 31 2c 20 22 52 45 43 55 52 53 49 56 45  e, 1, "RECURSIVE
15580 20 53 54 45 50 22 29 29 3b 0a 20 20 20 20 73 71   STEP"));.    sq
15590 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
155a0 73 65 2c 20 70 2c 20 26 64 65 73 74 51 75 65 75  se, p, &destQueu
155b0 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
155c0 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a  p->pPrior==0 );.
155d0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
155e0 70 53 65 74 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f  pSetup;.  }..  /
155f0 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20 74  * Keep running t
15600 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68  he loop until th
15610 65 20 51 75 65 75 65 20 69 73 20 65 6d 70 74 79  e Queue is empty
15620 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
15630 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70  eGoto(v, addrTop
15640 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
15650 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
15660 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64  addrBreak);..end
15670 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75  _of_recursive_qu
15680 65 72 79 3a 0a 20 20 73 71 6c 69 74 65 33 45 78  ery:.  sqlite3Ex
15690 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
156a0 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64  rse->db, p->pOrd
156b0 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72 64  erBy);.  p->pOrd
156c0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
156d0 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  .  p->pLimit = p
156e0 4c 69 6d 69 74 3b 0a 20 20 72 65 74 75 72 6e 3b  Limit;.  return;
156f0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
15700 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a  ITE_OMIT_CTE */.
15710 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
15720 72 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63  rences */.static
15730 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
15740 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65  OrderBy(.  Parse
15750 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
15760 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
15770 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
15780 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
15790 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
157a0 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
157b0 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
157c0 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
157d0 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
157e0 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
157f0 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a  lts */.);../*.**
15800 20 48 61 6e 64 6c 65 20 74 68 65 20 73 70 65 63   Handle the spec
15810 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 63 6f  ial case of a co
15820 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68  mpound-select th
15830 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72  at originates fr
15840 6f 6d 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63  om a.** VALUES c
15850 6c 61 75 73 65 2e 20 20 42 79 20 68 61 6e 64 6c  lause.  By handl
15860 69 6e 67 20 74 68 69 73 20 61 73 20 61 20 73 70  ing this as a sp
15870 65 63 69 61 6c 20 63 61 73 65 2c 20 77 65 20 61  ecial case, we a
15880 76 6f 69 64 20 64 65 65 70 0a 2a 2a 20 72 65 63  void deep.** rec
15890 75 72 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73  ursion, and thus
158a0 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
158b0 65 6e 66 6f 72 63 65 20 74 68 65 20 53 51 4c 49  enforce the SQLI
158c0 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e  TE_LIMIT_COMPOUN
158d0 44 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61  D_SELECT.** on a
158e0 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a   VALUES clause..
158f0 2a 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68  **.** Because th
15900 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20  e Select object 
15910 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20  originates from 
15920 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 3a  a VALUES clause:
15930 0a 2a 2a 20 20 20 28 31 29 20 54 68 65 72 65 20  .**   (1) There 
15940 69 73 20 6e 6f 20 4c 49 4d 49 54 20 6f 72 20 4f  is no LIMIT or O
15950 46 46 53 45 54 20 6f 72 20 65 6c 73 65 20 74 68  FFSET or else th
15960 65 72 65 20 69 73 20 61 20 4c 49 4d 49 54 20 6f  ere is a LIMIT o
15970 66 20 65 78 61 63 74 6c 79 20 31 0a 2a 2a 20 20  f exactly 1.**  
15980 20 28 32 29 20 41 6c 6c 20 74 65 72 6d 73 20 61   (2) All terms a
15990 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a 20  re UNION ALL.** 
159a0 20 20 28 33 29 20 54 68 65 72 65 20 69 73 20 6e    (3) There is n
159b0 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
159c0 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 4c 49 4d  e.**.** The "LIM
159d0 49 54 20 6f 66 20 65 78 61 63 74 6c 79 20 31 22  IT of exactly 1"
159e0 20 63 61 73 65 20 6f 66 20 63 6f 6e 64 69 74 69   case of conditi
159f0 6f 6e 20 28 31 29 20 63 6f 6d 65 73 20 61 62 6f  on (1) comes abo
15a00 75 74 20 77 68 65 6e 20 61 20 56 41 4c 55 45 53  ut when a VALUES
15a10 0a 2a 2a 20 63 6c 61 75 73 65 20 6f 63 63 75 72  .** clause occur
15a20 73 20 77 69 74 68 69 6e 20 73 63 61 6c 61 72 20  s within scalar 
15a30 65 78 70 72 65 73 73 69 6f 6e 20 28 65 78 3a 20  expression (ex: 
15a40 22 53 45 4c 45 43 54 20 28 56 41 4c 55 45 53 28  "SELECT (VALUES(
15a50 31 29 2c 28 32 29 2c 28 33 29 29 22 29 2e 0a 2a  1),(2),(3))")..*
15a60 2a 20 54 68 65 20 73 71 6c 69 74 65 33 43 6f 64  * The sqlite3Cod
15a70 65 53 75 62 73 65 6c 65 63 74 20 77 69 6c 6c 20  eSubselect will 
15a80 68 61 76 65 20 61 64 64 65 64 20 74 68 65 20 4c  have added the L
15a90 49 4d 49 54 20 31 20 63 6c 61 75 73 65 20 69 6e  IMIT 1 clause in
15aa0 20 74 68 74 20 63 61 73 65 2e 0a 2a 2a 20 53 69   tht case..** Si
15ab0 6e 63 65 20 74 68 65 20 6c 69 6d 69 74 20 69 73  nce the limit is
15ac0 20 65 78 61 63 74 6c 79 20 31 2c 20 77 65 20 6f   exactly 1, we o
15ad0 6e 6c 79 20 6e 65 65 64 20 74 6f 20 65 76 61 6c  nly need to eval
15ae0 75 74 65 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  utes the left-mo
15af0 73 74 20 56 41 4c 55 45 53 2e 0a 2a 2f 0a 73 74  st VALUES..*/.st
15b00 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
15b10 6c 65 63 74 56 61 6c 75 65 73 28 0a 20 20 50 61  lectValues(.  Pa
15b20 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
15b30 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
15b40 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
15b50 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
15b60 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
15b70 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
15b80 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
15b90 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
15ba0 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
15bb0 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
15bc0 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
15bd0 6e 74 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69  nt nRow = 1;.  i
15be0 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 69 6e 74  nt rc = 0;.  int
15bf0 20 62 53 68 6f 77 41 6c 6c 20 3d 20 70 2d 3e 70   bShowAll = p->p
15c00 4c 69 6d 69 74 3d 3d 30 3b 0a 20 20 61 73 73 65  Limit==0;.  asse
15c10 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
15c20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20  & SF_MultiValue 
15c30 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73  );.  do{.    ass
15c40 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ert( p->selFlags
15c50 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a   & SF_Values );.
15c60 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
15c70 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d  p==TK_ALL || (p-
15c80 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26  >op==TK_SELECT &
15c90 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20  & p->pPrior==0) 
15ca0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
15cb0 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 2d  ->pNext==0 || p-
15cc0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  >pEList->nExpr==
15cd0 70 2d 3e 70 4e 65 78 74 2d 3e 70 45 4c 69 73 74  p->pNext->pEList
15ce0 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 69  ->nExpr );.    i
15cf0 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  f( p->pPrior==0 
15d00 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73  ) break;.    ass
15d10 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 2d 3e  ert( p->pPrior->
15d20 70 4e 65 78 74 3d 3d 70 20 29 3b 0a 20 20 20 20  pNext==p );.    
15d30 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  p = p->pPrior;. 
15d40 20 20 20 6e 52 6f 77 20 2b 3d 20 62 53 68 6f 77     nRow += bShow
15d50 41 6c 6c 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29  All;.  }while(1)
15d60 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79  ;.  ExplainQuery
15d70 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c  Plan((pParse, 0,
15d80 20 22 53 43 41 4e 20 25 64 20 43 4f 4e 53 54 41   "SCAN %d CONSTA
15d90 4e 54 20 52 4f 57 25 73 22 2c 20 6e 52 6f 77 2c  NT ROW%s", nRow,
15da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15db0 20 20 20 20 20 6e 52 6f 77 3d 3d 31 20 3f 20 22       nRow==1 ? "
15dc0 22 20 3a 20 22 53 22 29 29 3b 0a 20 20 77 68 69  " : "S"));.  whi
15dd0 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 73 65 6c  le( p ){.    sel
15de0 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
15df0 72 73 65 2c 20 70 2c 20 2d 31 2c 20 30 2c 20 30  rse, p, -1, 0, 0
15e00 2c 20 70 44 65 73 74 2c 20 31 2c 20 31 29 3b 0a  , pDest, 1, 1);.
15e10 20 20 20 20 69 66 28 20 21 62 53 68 6f 77 41 6c      if( !bShowAl
15e20 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  l ) break;.    p
15e30 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e  ->nSelectRow = n
15e40 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  Row;.    p = p->
15e50 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  pNext;.  }.  ret
15e60 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
15e70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
15e80 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65   called to proce
15e90 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  ss a compound qu
15ea0 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a  ery form from.**
15eb0 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70   two or more sep
15ec0 61 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73  arate queries us
15ed0 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e  ing UNION, UNION
15ee0 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72   ALL, EXCEPT, or
15ef0 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a  .** INTERSECT.**
15f00 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74  .** "p" points t
15f10 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
15f20 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72   of the two quer
15f30 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20  ies.  the query 
15f40 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69  on the.** left i
15f50 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68  s p->pPrior.  Th
15f60 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75  e left query cou
15f70 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d  ld also be a com
15f80 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69  pound query.** i
15f90 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69  n which case thi
15fa0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62  s routine will b
15fb0 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  e called recursi
15fc0 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  vely. .**.** The
15fd0 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
15fe0 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20  total query are 
15ff0 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
16000 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e  to a destination
16010 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73  .** of type eDes
16020 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  t with parameter
16030 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78   iParm..**.** Ex
16040 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64  ample 1:  Consid
16050 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63  er a three-way c
16060 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74  ompound SQL stat
16070 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ement..**.**    
16080 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
16090 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62  1 UNION SELECT b
160a0 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53   FROM t2 UNION S
160b0 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
160c0 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65  **.** This state
160d0 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75  ment is parsed u
160e0 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  p as follows:.**
160f0 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63  .**     SELECT c
16100 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20   FROM t3.**     
16110 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d   |.**      `----
16120 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ->  SELECT b FRO
16130 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20  M t2.**         
16140 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
16150 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d             `----
16160 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52  -->  SELECT a FR
16170 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20  OM t1.**.** The 
16180 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69  arrows in the di
16190 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72  agram above repr
161a0 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74  esent the Select
161b0 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e  .pPrior pointer.
161c0 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72  .** So if this r
161d0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
161e0 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f   with p equal to
161f0 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74   the t3 query, t
16200 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69  hen.** pPrior wi
16210 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65  ll be the t2 que
16220 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20  ry.  p->op will 
16230 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74  be TK_UNION in t
16240 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
16250 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61  Notice that beca
16260 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53  use of the way S
16270 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d  QLite parses com
16280 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74  pound SELECTs, t
16290 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
162a0 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20   selects always 
162b0 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20  group from left 
162c0 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61  to right..*/.sta
162d0 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
162e0 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
162f0 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
16300 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
16310 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
16320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16330 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
16340 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
16350 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
16360 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
16370 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
16380 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
16390 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
163a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a   SQLITE_OK;   /*
163b0 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72   Success code fr
163c0 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  om a subroutine 
163d0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
163e0 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
163f0 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
16400 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
16410 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
16420 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
16430 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
16440 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
16450 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
16460 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65  st;      /* Alte
16470 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73  rnative data des
16480 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65  tination */.  Se
16490 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20  lect *pDelete = 
164a0 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20  0;  /* Chain of 
164b0 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74  simple selects t
164c0 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71  o delete */.  sq
164d0 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
164e0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
164f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20  connection */.. 
16500 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
16510 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
16520 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75  BY or LIMIT clau
16530 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45  se on prior SELE
16540 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20  CTs.  Only.  ** 
16550 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d  the last (right-
16560 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20  most) SELECT in 
16570 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68  the series may h
16580 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
16590 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20  or LIMIT..  */. 
165a0 20 61 73 73 65 72 74 28 20 70 20 26 26 20 70 2d   assert( p && p-
165b0 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43  >pPrior );  /* C
165c0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
165d0 67 75 61 72 61 6e 74 65 65 73 20 74 68 69 73 20  guarantees this 
165e0 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73 65 72 74  much */.  assert
165f0 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
16600 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d 3d   SF_Recursive)==
16610 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41  0 || p->op==TK_A
16620 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  LL || p->op==TK_
16630 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62 20 3d 20  UNION );.  db = 
16640 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50  pParse->db;.  pP
16650 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
16660 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73  ;.  dest = *pDes
16670 74 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d  t;.  if( pPrior-
16680 3e 70 4f 72 64 65 72 42 79 20 7c 7c 20 70 50 72  >pOrderBy || pPr
16690 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ior->pLimit ){. 
166a0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
166b0 73 67 28 70 50 61 72 73 65 2c 22 25 73 20 63 6c  sg(pParse,"%s cl
166c0 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65  ause should come
166d0 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65   after %s not be
166e0 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 70 50 72  fore",.      pPr
166f0 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30  ior->pOrderBy!=0
16700 20 3f 20 22 4f 52 44 45 52 20 42 59 22 20 3a 20   ? "ORDER BY" : 
16710 22 4c 49 4d 49 54 22 2c 20 73 65 6c 65 63 74 4f  "LIMIT", selectO
16720 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
16730 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
16740 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
16750 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d  _end;.  }..  v =
16760 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
16770 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
16780 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54  t( v!=0 );  /* T
16790 68 65 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  he VDBE already 
167a0 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69  created by calli
167b0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a  ng function */..
167c0 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
167d0 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70  destination temp
167e0 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e  orary table if n
167f0 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20  ecessary.  */.  
16800 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
16810 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a  SRT_EphemTab ){.
16820 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
16830 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c  EList );.    sql
16840 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16850 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
16860 61 6c 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d  al, dest.iSDParm
16870 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
16880 70 72 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44  pr);.    dest.eD
16890 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b  est = SRT_Table;
168a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69  .  }..  /* Speci
168b0 61 6c 20 68 61 6e 64 6c 69 6e 67 20 66 6f 72 20  al handling for 
168c0 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  a compound-selec
168d0 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65  t that originate
168e0 73 20 61 73 20 61 20 56 41 4c 55 45 53 20 63 6c  s as a VALUES cl
168f0 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ause..  */.  if(
16900 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
16910 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 7b 0a  F_MultiValue ){.
16920 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65      rc = multiSe
16930 6c 65 63 74 56 61 6c 75 65 73 28 70 50 61 72 73  lectValues(pPars
16940 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20  e, p, &dest);.  
16950 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
16960 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
16970 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  /* Make sure all
16980 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20   SELECTs in the 
16990 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74  statement have t
169a0 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
169b0 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20  f elements.  ** 
169c0 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20  in their result 
169d0 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sets..  */.  ass
169e0 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26  ert( p->pEList &
169f0 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  & pPrior->pEList
16a00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
16a10 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  >pEList->nExpr==
16a20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e  pPrior->pEList->
16a30 6e 45 78 70 72 20 29 3b 0a 0a 23 69 66 6e 64 65  nExpr );..#ifnde
16a40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
16a50 45 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  E.  if( p->selFl
16a60 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
16a70 76 65 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  ve ){.    genera
16a80 74 65 57 69 74 68 52 65 63 75 72 73 69 76 65 51  teWithRecursiveQ
16a90 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20  uery(pParse, p, 
16aa0 26 64 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a  &dest);.  }else.
16ab0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d  #endif..  /* Com
16ac0 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68  pound SELECTs th
16ad0 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  at have an ORDER
16ae0 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 68   BY clause are h
16af0 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c  andled separatel
16b00 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  y..  */.  if( p-
16b10 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
16b20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c   return multiSel
16b30 65 63 74 4f 72 64 65 72 42 79 28 70 50 61 72 73  ectOrderBy(pPars
16b40 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  e, p, pDest);.  
16b50 7d 65 6c 73 65 7b 0a 0a 23 69 66 6e 64 65 66 20  }else{..#ifndef 
16b60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
16b70 41 49 4e 0a 20 20 20 20 69 66 28 20 70 50 72 69  AIN.    if( pPri
16b80 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b  or->pPrior==0 ){
16b90 0a 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75  .      ExplainQu
16ba0 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
16bb0 20 31 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 51 55   1, "COMPOUND QU
16bc0 45 52 59 22 29 29 3b 0a 20 20 20 20 20 20 45 78  ERY"));.      Ex
16bd0 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
16be0 70 50 61 72 73 65 2c 20 31 2c 20 22 4c 45 46 54  pParse, 1, "LEFT
16bf0 2d 4d 4f 53 54 20 53 55 42 51 55 45 52 59 22 29  -MOST SUBQUERY")
16c00 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
16c10 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
16c20 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65   code for the le
16c30 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c  ft and right SEL
16c40 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
16c50 20 20 20 20 2a 2f 0a 20 20 20 20 73 77 69 74 63      */.    switc
16c60 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
16c70 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b    case TK_ALL: {
16c80 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
16c90 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  r = 0;.        i
16ca0 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20  nt nLimit;.     
16cb0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
16cc0 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20  or->pLimit );.  
16cd0 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c        pPrior->iL
16ce0 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74  imit = p->iLimit
16cf0 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72  ;.        pPrior
16d00 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69  ->iOffset = p->i
16d10 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
16d20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d  pPrior->pLimit =
16d30 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
16d40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16d50 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
16d60 50 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20  Prior, &dest);. 
16d70 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74         p->pLimit
16d80 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
16d90 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
16da0 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
16db0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
16dc0 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50   }.        p->pP
16dd0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
16de0 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50    p->iLimit = pP
16df0 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  rior->iLimit;.  
16e00 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
16e10 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73   = pPrior->iOffs
16e20 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  et;.        if( 
16e30 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
16e40 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
16e50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
16e60 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 70 2d 3e  v, OP_IfNot, p->
16e70 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76  iLimit); VdbeCov
16e80 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
16e90 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
16ea0 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20  (v, "Jump ahead 
16eb0 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64  if LIMIT reached
16ec0 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  "));.          i
16ed0 66 28 20 70 2d 3e 69 4f 66 66 73 65 74 20 29 7b  f( p->iOffset ){
16ee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
16ef0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
16f00 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74  , OP_OffsetLimit
16f10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f30 70 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f  p->iLimit, p->iO
16f40 66 66 73 65 74 2b 31 2c 20 70 2d 3e 69 4f 66 66  ffset+1, p->iOff
16f50 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  set);.          
16f60 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
16f70 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79      ExplainQuery
16f80 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c  Plan((pParse, 1,
16f90 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 29 29 3b 0a   "UNION ALL"));.
16fa0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
16fb0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
16fc0 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20  e, p, &dest);.  
16fd0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16fe0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
16ff0 0a 20 20 20 20 20 20 20 20 70 44 65 6c 65 74 65  .        pDelete
17000 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
17010 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
17020 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
17030 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
17040 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
17050 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  dd(p->nSelectRow
17060 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  , pPrior->nSelec
17070 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 69  tRow);.        i
17080 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  f( pPrior->pLimi
17090 74 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71  t.         && sq
170a0 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
170b0 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  er(pPrior->pLimi
170c0 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 4c 69 6d 69  t->pLeft, &nLimi
170d0 74 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 6e  t).         && n
170e0 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53  Limit>0 && p->nS
170f0 65 6c 65 63 74 52 6f 77 20 3e 20 73 71 6c 69 74  electRow > sqlit
17100 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c  e3LogEst((u64)nL
17110 69 6d 69 74 29 20 0a 20 20 20 20 20 20 20 20 29  imit) .        )
17120 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e  {.          p->n
17130 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
17140 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e  te3LogEst((u64)n
17150 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20  Limit);.        
17160 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64  }.        if( ad
17170 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  dr ){.          
17180 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
17190 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
171a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
171b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
171c0 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43       case TK_EXC
171d0 45 50 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20  EPT:.      case 
171e0 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20  TK_UNION: {.    
171f0 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62      int unionTab
17200 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e  ;    /* Cursor n
17210 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d  umber of the tem
17220 70 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20  p table holding 
17230 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20  result */.      
17240 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20    u8 op = 0;    
17250 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
17260 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73   SRT_ operations
17270 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c   to apply to sel
17280 66 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  f */.        int
17290 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a   priorOp;     /*
172a0 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   The SRT_ operat
172b0 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ion to apply to 
172c0 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f  prior selects */
172d0 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
172e0 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 53 61 76  Limit;    /* Sav
172f0 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e  ed values of p->
17300 6e 4c 69 6d 69 74 20 20 2a 2f 0a 20 20 20 20 20  nLimit  */.     
17310 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
17320 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
17330 75 6e 69 6f 6e 64 65 73 74 3b 0a 20 20 0a 20 20  uniondest;.  .  
17340 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17350 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  p->op==TK_EXCEPT
17360 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
17370 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
17380 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20  UNION );.       
17390 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55   priorOp = SRT_U
173a0 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66  nion;.        if
173b0 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72  ( dest.eDest==pr
173c0 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20  iorOp ){.       
173d0 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75     /* We can reu
173e0 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  se a temporary t
173f0 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62  able generated b
17400 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75  y a SELECT to ou
17410 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72  r.          ** r
17420 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 20 20  ight..          
17430 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
17440 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d  ert( p->pLimit==
17450 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74  0 );      /* Not
17460 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74   allowed on left
17470 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  ward elements */
17480 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  .          union
17490 54 61 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61  Tab = dest.iSDPa
174a0 72 6d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  rm;.        }els
174b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
174c0 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  We will need to 
174d0 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74  create our own t
174e0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74  emporary table t
174f0 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20  o hold the.     
17500 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64       ** intermed
17510 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20  iate results..  
17520 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
17530 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20       unionTab = 
17540 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
17550 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
17560 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
17570 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 64   );.          ad
17580 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
17590 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
175a0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f  nEphemeral, unio
175b0 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
175c0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
175d0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
175e0 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  = -1 );.        
175f0 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
17600 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[0] = addr;.   
17610 20 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74         findRight
17620 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67  most(p)->selFlag
17630 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
17640 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 20  meral;.         
17650 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
17660 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  st );.        }.
17670 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f    .        /* Co
17680 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  de the SELECT st
17690 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20  atements to our 
176a0 6c 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2f 0a  left.        */.
176b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
176c0 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42  !pPrior->pOrderB
176d0 79 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  y );.        sql
176e0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
176f0 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70  it(&uniondest, p
17700 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62  riorOp, unionTab
17710 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
17720 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
17730 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75  arse, pPrior, &u
17740 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20  niondest);.     
17750 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
17760 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
17770 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
17780 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
17790 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
177a0 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74  urrent SELECT st
177b0 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20  atement.        
177c0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
177d0 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ->op==TK_EXCEPT 
177e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 20  ){.          op 
177f0 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20  = SRT_Except;.  
17800 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17810 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
17820 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
17830 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 20 3d  ;.          op =
17840 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20   SRT_Union;.    
17850 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d      }.        p-
17860 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
17870 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
17880 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20  >pLimit;.       
17890 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
178a0 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73          uniondes
178b0 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20  t.eDest = op;.  
178c0 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65        ExplainQue
178d0 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
178e0 31 2c 20 22 25 73 20 55 53 49 4e 47 20 54 45 4d  1, "%s USING TEM
178f0 50 20 42 2d 54 52 45 45 22 2c 0a 20 20 20 20 20  P B-TREE",.     
17900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17910 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
17920 65 28 70 2d 3e 6f 70 29 29 29 3b 0a 20 20 20 20  e(p->op)));.    
17930 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17940 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
17950 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20  , &uniondest);. 
17960 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
17970 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17980 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65  ;.        /* Que
17990 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e  ry flattening in
179a0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
179b0 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d   might refill p-
179c0 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20  >pOrderBy..     
179d0 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f     ** Be sure to
179e0 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65   delete p->pOrde
179f0 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20  rBy, therefore, 
17a00 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72  to avoid a memor
17a10 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20  y leak. */.     
17a20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
17a30 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
17a40 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20  pOrderBy);.     
17a50 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
17a60 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
17a70 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
17a80 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  or;.        p->p
17a90 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
17aa0 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d       if( p->op==
17ab0 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20  TK_UNION ){.    
17ac0 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
17ad0 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
17ae0 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63  EstAdd(p->nSelec
17af0 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53  tRow, pPrior->nS
17b00 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20  electRow);.     
17b10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
17b20 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
17b30 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
17b40 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74         p->pLimit
17b50 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
17b60 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30     p->iLimit = 0
17b70 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66  ;.        p->iOf
17b80 66 73 65 74 20 3d 20 30 3b 0a 20 20 0a 20 20 20  fset = 0;.  .   
17b90 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20       /* Convert 
17ba0 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20  the data in the 
17bb0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
17bc0 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f  into whatever fo
17bd0 72 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74  rm.        ** it
17be0 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72   is that we curr
17bf0 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20  ently need..    
17c00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
17c10 73 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d  ssert( unionTab=
17c20 3d 64 65 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c  =dest.iSDParm ||
17c30 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69   dest.eDest!=pri
17c40 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20 20 20 20  orOp );.        
17c50 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d  if( dest.eDest!=
17c60 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20  priorOp ){.     
17c70 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
17c80 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
17c90 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
17ca0 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
17cb0 20 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20           iBreak 
17cc0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
17cd0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
17ce0 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c       iCont = sql
17cf0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
17d00 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  l(v);.          
17d10 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
17d20 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
17d30 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
17d40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17d50 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
17d60 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42  nd, unionTab, iB
17d70 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
17d80 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
17d90 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
17da0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
17db0 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r(v);.          
17dc0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
17dd0 70 50 61 72 73 65 2c 20 70 2c 20 75 6e 69 6f 6e  pParse, p, union
17de0 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Tab,.           
17df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
17e00 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e  , 0, &dest, iCon
17e10 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
17e20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17e30 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
17e40 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20   iCont);.       
17e50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17e60 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
17e70 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72   unionTab, iStar
17e80 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
17e90 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  (v);.          s
17ea0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
17eb0 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
17ec0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
17ed0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17ee0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f  , OP_Close, unio
17ef0 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
17f00 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
17f10 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
17f20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
17f30 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  ( p->op==TK_INTE
17f40 52 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20  RSECT ); {.     
17f50 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62     int tab1, tab
17f60 32 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  2;.        int i
17f70 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
17f80 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 45 78  tart;.        Ex
17f90 70 72 20 2a 70 4c 69 6d 69 74 3b 0a 20 20 20 20  pr *pLimit;.    
17fa0 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
17fb0 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
17fc0 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a   intersectdest;.
17fd0 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a          int r1;.
17fe0 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 4e    .        /* IN
17ff0 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65  TERSECT is diffe
18000 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74  rent from the ot
18010 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65  hers since it re
18020 71 75 69 72 65 73 0a 20 20 20 20 20 20 20 20 2a  quires.        *
18030 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20  * two temporary 
18040 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69  tables.  Hence i
18050 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61  t has its own ca
18060 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20  se.  Begin.     
18070 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74     ** by allocat
18080 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77  ing the tables w
18090 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20  e will need..   
180a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
180b0 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab1 = pParse->n
180c0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 74  Tab++;.        t
180d0 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
180e0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ab++;.        as
180f0 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
18100 79 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20 20  y==0 );.  .     
18110 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
18120 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18130 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
18140 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
18150 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
18160 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
18170 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70   -1 );.        p
18180 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
18190 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
181a0 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28    findRightmost(
181b0 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  p)->selFlags |= 
181c0 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
181d0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
181e0 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
181f0 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64   .        /* Cod
18200 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f  e the SELECTs to
18210 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74   our left into t
18220 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
18230 74 61 62 31 22 2e 0a 20 20 20 20 20 20 20 20 2a  tab1"..        *
18240 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
18250 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
18260 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20  &intersectdest, 
18270 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29  SRT_Union, tab1)
18280 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
18290 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
182a0 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e  rse, pPrior, &in
182b0 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20  tersectdest);.  
182c0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
182d0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
182e0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
182f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  .        }.  .  
18300 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
18310 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
18320 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
18330 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20  table "tab2".   
18340 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
18350 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
18360 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
18370 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
18380 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  b2, 0);.        
18390 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
183a0 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31  penEphm[1] == -1
183b0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   );.        p->a
183c0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
183d0 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 70   addr;.        p
183e0 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
183f0 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70        pLimit = p
18400 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
18410 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
18420 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 73 65  .        interse
18430 63 74 64 65 73 74 2e 69 53 44 50 61 72 6d 20 3d  ctdest.iSDParm =
18440 20 74 61 62 32 3b 0a 20 20 20 20 20 20 20 20 45   tab2;.        E
18450 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
18460 28 70 50 61 72 73 65 2c 20 31 2c 20 22 25 73 20  (pParse, 1, "%s 
18470 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45  USING TEMP B-TRE
18480 45 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E",.            
18490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
184a0 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
184b0 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  )));.        rc 
184c0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
184d0 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65  pParse, p, &inte
184e0 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20  rsectdest);.    
184f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
18500 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
18510 20 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d         pDelete =
18520 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
18530 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
18540 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
18550 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
18560 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  w>pPrior->nSelec
18570 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  tRow ){.        
18580 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
18590 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  = pPrior->nSelec
185a0 74 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tRow;.        }.
185b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
185c0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
185d0 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
185e0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
185f0 69 6d 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 20  imit;.  .       
18600 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
18610 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e  e to take the in
18620 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  tersection of th
18630 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a  e two temporary.
18640 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
18650 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
18660 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
18670 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
18680 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
18690 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
186a0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f  (v);.        iCo
186b0 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
186c0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
186d0 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
186e0 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
186f0 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
18700 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18710 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18720 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42  Rewind, tab1, iB
18730 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
18740 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
18750 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
18760 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
18770 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
18780 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18790 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61  p2(v, OP_RowData
187a0 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20  , tab1, r1);.   
187b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
187c0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
187d0 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20  NotFound, tab2, 
187e0 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 0a 20  iCont, r1, 0);. 
187f0 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
18800 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
18810 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
18820 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
18830 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63  );.        selec
18840 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
18850 65 2c 20 70 2c 20 74 61 62 31 2c 0a 20 20 20 20  e, p, tab1,.    
18860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18870 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c      0, 0, &dest,
18880 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b   iCont, iBreak);
18890 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
188a0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
188b0 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
188c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
188d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
188e0 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b  , tab1, iStart);
188f0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
18900 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18910 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
18920 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
18930 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18940 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
18950 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ose, tab2, 0);. 
18960 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18970 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
18980 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a  lose, tab1, 0);.
18990 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
189a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
189b0 20 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45    #ifndef SQLITE
189c0 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
189d0 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 3d 3d    if( p->pNext==
189e0 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 6c 61  0 ){.      Expla
189f0 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f 70 28 70  inQueryPlanPop(p
18a00 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
18a10 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20  #endif.  }.  .  
18a20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61  /* Compute colla
18a30 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75  ting sequences u
18a40 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d  sed by .  ** tem
18a50 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65  porary tables ne
18a60 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  eded to implemen
18a70 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  t the compound s
18a80 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61  elect..  ** Atta
18a90 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ch the KeyInfo s
18aa0 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20  tructure to all 
18ab0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
18ac0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
18ad0 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20   section is run 
18ae0 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  by the right-mos
18af0 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
18b00 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45  nt only..  ** SE
18b10 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
18b20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61  to the left alwa
18b30 79 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  ys skip this par
18b40 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  t.  The right-mo
18b50 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d  st.  ** SELECT m
18b60 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74  ight also skip t
18b70 68 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68  his part if it h
18b80 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  as no ORDER BY c
18b90 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e  lause and.  ** n
18ba0 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72  o temp tables ar
18bb0 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f  e required..  */
18bc0 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
18bd0 67 73 20 26 20 53 46 5f 55 73 65 73 45 70 68 65  gs & SF_UsesEphe
18be0 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  meral ){.    int
18bf0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
18c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
18c10 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
18c20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
18c30 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  nfo;            
18c40 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
18c50 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65  uence for the re
18c60 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20  sult set */.    
18c70 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20  Select *pLoop;  
18c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18c90 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
18ca0 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74  ough SELECT stat
18cb0 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f  ements */.    Co
18cc0 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20  llSeq **apColl; 
18cd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
18ce0 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
18cf0 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  gh pKeyInfo->aCo
18d00 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ll[] */.    int 
18d10 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
18d20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
18d30 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
18d40 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  n result set */.
18d50 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
18d60 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pNext==0 );.    
18d70 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74  nCol = p->pEList
18d80 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65  ->nExpr;.    pKe
18d90 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
18da0 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20  eyInfoAlloc(db, 
18db0 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66  nCol, 1);.    if
18dc0 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  ( !pKeyInfo ){. 
18dd0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
18de0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
18df0 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
18e00 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
18e10 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43      for(i=0, apC
18e20 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  oll=pKeyInfo->aC
18e30 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  oll; i<nCol; i++
18e40 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20  , apColl++){.   
18e50 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c     *apColl = mul
18e60 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
18e70 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
18e80 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43       if( 0==*apC
18e90 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  oll ){.        *
18ea0 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66  apColl = db->pDf
18eb0 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
18ec0 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70      }..    for(p
18ed0 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
18ee0 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
18ef0 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  or){.      for(i
18f00 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
18f10 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
18f20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  = pLoop->addrOpe
18f30 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  nEphm[i];.      
18f40 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
18f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
18f60 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68  [0] is unused th
18f70 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75  en [1] is also u
18f80 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61  nused.  So we ca
18f90 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  n.          ** a
18fa0 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f  lways safely abo
18fb0 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  rt as soon as th
18fc0 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73  e first unused s
18fd0 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a  lot is found */.
18fe0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
18ff0 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  ( pLoop->addrOpe
19000 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20  nEphm[1]<0 );.  
19010 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
19020 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
19030 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
19040 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43  geP2(v, addr, nC
19050 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
19060 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
19070 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a  (v, addr, (char*
19080 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  )sqlite3KeyInfoR
19090 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20  ef(pKeyInfo),.  
190a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190b0 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59            P4_KEY
190c0 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70  INFO);.        p
190d0 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
190e0 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  hm[i] = -1;.    
190f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
19100 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
19110 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d  f(pKeyInfo);.  }
19120 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  ..multi_select_e
19130 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53 64  nd:.  pDest->iSd
19140 73 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b  st = dest.iSdst;
19150 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20  .  pDest->nSdst 
19160 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20  = dest.nSdst;.  
19170 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
19180 65 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29  ete(db, pDelete)
19190 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
191a0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
191b0 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
191c0 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SELECT */../*.**
191d0 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   Error message f
191e0 6f 72 20 77 68 65 6e 20 74 77 6f 20 6f 72 20 6d  or when two or m
191f0 6f 72 65 20 74 65 72 6d 73 20 6f 66 20 61 20 63  ore terms of a c
19200 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 68  ompound select h
19210 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ave different.**
19220 20 73 69 7a 65 20 72 65 73 75 6c 74 20 73 65 74   size result set
19230 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
19240 65 33 53 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d  e3SelectWrongNum
19250 54 65 72 6d 73 45 72 72 6f 72 28 50 61 72 73 65  TermsError(Parse
19260 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
19270 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73   *p){.  if( p->s
19280 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c  elFlags & SF_Val
19290 75 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ues ){.    sqlit
192a0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
192b0 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d  e, "all VALUES m
192c0 75 73 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  ust have the sam
192d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  e number of term
192e0 73 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  s");.  }else{.  
192f0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
19300 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43  g(pParse, "SELEC
19310 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61  Ts to the left a
19320 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a  nd right of %s".
19330 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68        " do not h
19340 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
19350 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
19360 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70  lumns", selectOp
19370 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
19380 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  }.}../*.** Code 
19390 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  an output subrou
193a0 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75  tine for a corou
193b0 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tine implementat
193c0 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45  ion of a.** SELE
193d0 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a  CT statment..**.
193e0 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62  ** The data to b
193f0 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74  e output is cont
19400 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53  ained in pIn->iS
19410 64 73 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a  dst.  There are.
19420 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f  ** pIn->nSdst co
19430 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70  lumns to be outp
19440 75 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68  ut.  pDest is wh
19450 65 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73  ere the output s
19460 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74  hould.** be sent
19470 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72  ..**.** regRetur
19480 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
19490 6f 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  of the register 
194a0 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72  holding the subr
194b0 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
194c0 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
194d0 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65  If regPrev>0 the
194e0 6e 20 69 74 20 69 73 20 74 68 65 20 66 69 72 73  n it is the firs
194f0 74 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20  t register in a 
19500 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72  vector that.** r
19510 65 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69  ecords the previ
19520 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d  ous output.  mem
19530 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66  [regPrev] is a f
19540 6c 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73  lag that is fals
19550 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61  e.** if there ha
19560 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f  s been no previo
19570 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72  us output.  If r
19580 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f  egPrev>0 then co
19590 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74  de is.** generat
195a0 65 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64  ed to suppress d
195b0 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79  uplicates.  pKey
195c0 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72  Info is used for
195d0 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65   comparing.** ke
195e0 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ys..**.** If the
195f0 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20   LIMIT found in 
19600 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61  p->iLimit is rea
19610 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64  ched, jump immed
19620 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72  iately to.** iBr
19630 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  eak..*/.static i
19640 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75  nt generateOutpu
19650 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50  tSubroutine(.  P
19660 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
19670 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
19680 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
19690 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
196a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
196b0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
196c0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
196d0 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  pIn,        /* C
196e0 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69  oroutine supplyi
196f0 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c  ng data */.  Sel
19700 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
19710 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
19720 20 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a   send the data *
19730 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72  /.  int regRetur
19740 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  n,          /* T
19750 68 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  he return addres
19760 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  s register */.  
19770 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20  int regPrev,    
19780 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
19790 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73  ous result regis
197a0 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e  ter.  No uniquen
197b0 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65  ess if 0 */.  Ke
197c0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
197d0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d        /* For com
197e0 70 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76  paring with prev
197f0 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ious entry */.  
19800 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20  int iBreak      
19810 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
19820 68 65 72 65 20 69 66 20 77 65 20 68 69 74 20 74  here if we hit t
19830 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20  he LIMIT */.){. 
19840 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
19850 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
19860 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74  iContinue;.  int
19870 20 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d   addr;..  addr =
19880 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
19890 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43  entAddr(v);.  iC
198a0 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
198b0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
198c0 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73  );..  /* Suppres
198d0 73 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72  s duplicates for
198e0 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
198f0 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20  and INTERSECT . 
19900 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65   */.  if( regPre
19910 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  v ){.    int add
19920 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 61  r1, addr2;.    a
19930 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
19940 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
19950 66 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 20  fNot, regPrev); 
19960 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
19970 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c  .    addr2 = sql
19980 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
19990 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49  , OP_Compare, pI
199a0 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65  n->iSdst, regPre
199b0 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c  v+1, pIn->nSdst,
199c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
199d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
199e0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79  char*)sqlite3Key
199f0 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f  InfoRef(pKeyInfo
19a00 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  ), P4_KEYINFO);.
19a10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19a20 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
19a30 2c 20 61 64 64 72 32 2b 32 2c 20 69 43 6f 6e 74  , addr2+2, iCont
19a40 69 6e 75 65 2c 20 61 64 64 72 32 2b 32 29 3b 20  inue, addr2+2); 
19a50 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
19a60 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19a70 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
19a80 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
19a90 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
19aa0 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74  Copy, pIn->iSdst
19ab0 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e  , regPrev+1, pIn
19ac0 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20  ->nSdst-1);.    
19ad0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19ae0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
19af0 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20   1, regPrev);.  
19b00 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
19b10 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19b20 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
19b30 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68 65 20  /* Suppress the 
19b40 66 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74  first OFFSET ent
19b50 72 69 65 73 20 69 66 20 74 68 65 72 65 20 69 73  ries if there is
19b60 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73   an OFFSET claus
19b70 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66  e.  */.  codeOff
19b80 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
19b90 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a  t, iContinue);..
19ba0 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
19bb0 3e 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73  >eDest!=SRT_Exis
19bc0 74 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ts );.  assert( 
19bd0 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
19be0 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 73 77 69  T_Table );.  swi
19bf0 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73  tch( pDest->eDes
19c00 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72  t ){.    /* Stor
19c10 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
19c20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
19c30 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  que key..    */.
19c40 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68      case SRT_Eph
19c50 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69  emTab: {.      i
19c60 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
19c70 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
19c80 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20  );.      int r2 
19c90 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
19ca0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
19cb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19cc0 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
19cd0 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73  ecord, pIn->iSds
19ce0 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72  t, pIn->nSdst, r
19cf0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
19d00 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19d10 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73  P_NewRowid, pDes
19d20 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 32 29 3b  t->iSDParm, r2);
19d30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19d40 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
19d50 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53  nsert, pDest->iS
19d60 44 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a  DParm, r1, r2);.
19d70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19d80 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
19d90 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
19da0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
19db0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
19dc0 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r2);.      sqli
19dd0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
19de0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
19df0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19e00 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
19e10 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
19e20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
19e30 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
19e40 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
19e50 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a 20  (SELECT ...)".. 
19e60 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
19e70 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
19e80 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 74 65  int r1;.      te
19e90 73 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64  stcase( pIn->nSd
19ea0 73 74 3e 31 20 29 3b 0a 20 20 20 20 20 20 72 31  st>1 );.      r1
19eb0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
19ec0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
19ed0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19ee0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
19ef0 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64  Record, pIn->iSd
19f00 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20  st, pIn->nSdst, 
19f10 0a 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 70  .          r1, p
19f20 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20  Dest->zAffSdst, 
19f30 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
19f40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19f50 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64  dOp4Int(v, OP_Id
19f60 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e  xInsert, pDest->
19f70 69 53 44 50 61 72 6d 2c 20 72 31 2c 0a 20 20 20  iSDParm, r1,.   
19f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f90 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 69 53 64          pIn->iSd
19fa0 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
19fb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
19fc0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
19fd0 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
19fe0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
19ff0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1a000 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20  a scalar select 
1a010 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
1a020 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  an expression, t
1a030 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65  hen.    ** store
1a040 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
1a050 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
1a060 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
1a070 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a  break out.    **
1a080 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f   of the scan loo
1a090 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  p..    */.    ca
1a0a0 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
1a0b0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d      assert( pIn-
1a0c0 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61  >nSdst==1 || pPa
1a0d0 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 20 20  rse->nErr>0 );  
1a0e0 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e  testcase( pIn->n
1a0f0 53 64 73 74 21 3d 31 20 29 3b 0a 20 20 20 20 20  Sdst!=1 );.     
1a100 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1a110 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
1a120 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e  ->iSdst, pDest->
1a130 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20  iSDParm, 1);.   
1a140 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
1a150 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70  clause will jump
1a160 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
1a170 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
1a180 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
1a190 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
1a1a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1a1b0 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  UERY */..    /* 
1a1c0 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
1a1d0 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75  stored in a sequ
1a1e0 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
1a1f0 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e  s.    ** startin
1a200 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53 64 73  g at pDest->iSds
1a210 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d  t.  Then the co-
1a220 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a  routine yields..
1a230 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1a240 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b  SRT_Coroutine: {
1a250 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 73 74  .      if( pDest
1a260 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20  ->iSdst==0 ){.  
1a270 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64        pDest->iSd
1a280 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  st = sqlite3GetT
1a290 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
1a2a0 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
1a2b0 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64        pDest->nSd
1a2c0 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b  st = pIn->nSdst;
1a2d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1a2e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
1a2f0 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ve(pParse, pIn->
1a300 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53  iSdst, pDest->iS
1a310 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
1a320 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1a330 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
1a340 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53  Yield, pDest->iS
1a350 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72  DParm);.      br
1a360 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1a370 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68  /* If none of th
1a380 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68  e above, then th
1a390 65 20 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61  e result destina
1a3a0 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20  tion must be.   
1a3b0 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20   ** SRT_Output. 
1a3c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1a3d0 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69   never called wi
1a3e0 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20  th any other.   
1a3f0 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20   ** destination 
1a400 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f  other than the o
1a410 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76  nes handled abov
1a420 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e  e or SRT_Output.
1a430 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
1a440 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72  or SRT_Output, r
1a450 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
1a460 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20  d in a sequence 
1a470 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a  of registers.  .
1a480 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20      ** Then the 
1a490 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63  OP_ResultRow opc
1a4a0 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 63  ode is used to c
1a4b0 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ause sqlite3_ste
1a4c0 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65  p() to.    ** re
1a4d0 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f  turn the next ro
1a4e0 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20  w of result..   
1a4f0 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
1a500 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1a510 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
1a520 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
1a530 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a540 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
1a550 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74  tRow, pIn->iSdst
1a560 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
1a570 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a580 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  }.  }..  /* Jump
1a590 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
1a5a0 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c  he loop if the L
1a5b0 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e  IMIT is reached.
1a5c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
1a5d0 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
1a5e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a5f0 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72  , OP_DecrJumpZer
1a600 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42  o, p->iLimit, iB
1a610 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
1a620 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f  age(v);.  }..  /
1a630 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73  * Generate the s
1a640 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  ubroutine return
1a650 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
1a660 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1a670 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  v, iContinue);. 
1a680 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a690 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
1a6a0 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20   regReturn);..  
1a6b0 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
1a6c0 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76  /*.** Alternativ
1a6d0 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
1a6e0 74 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  t code generator
1a6f0 20 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20   for cases when 
1a700 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f  there.** is an O
1a710 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
1a720 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20  **.** We assume 
1a730 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66  a query of the f
1a740 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a  ollowing form:.*
1a750 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63  *.**      <selec
1a760 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20  tA>  <operator> 
1a770 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45   <selectB>  ORDE
1a780 52 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73  R BY <orderbylis
1a790 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74  t>.**.** <operat
1a7a0 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e  or> is one of UN
1a7b0 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20  ION ALL, UNION, 
1a7c0 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52  EXCEPT, or INTER
1a7d0 53 45 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a  SECT.  The idea.
1a7e0 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f  ** is to code bo
1a7f0 74 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64  th <selectA> and
1a800 20 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20   <selectB> with 
1a810 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1a820 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75  use as.** co-rou
1a830 74 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e  tines.  Then run
1a840 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73   the co-routines
1a850 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64   in parallel and
1a860 20 6d 65 72 67 65 20 74 68 65 20 72 65 73 75 6c   merge the resul
1a870 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f  ts.** into the o
1a880 75 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74  utput.  In addit
1a890 69 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63  ion to the two c
1a8a0 6f 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65  oroutines (calle
1a8b0 64 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a  d selectA and.**
1a8c0 20 73 65 6c 65 63 74 42 29 20 74 68 65 72 65 20   selectB) there 
1a8d0 61 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65  are 7 subroutine
1a8e0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41  s:.**.**    outA
1a8f0 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75  :    Move the ou
1a900 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65  tput of the sele
1a910 63 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e  ctA coroutine in
1a920 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  to the output.**
1a930 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
1a940 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
1a950 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74  ry..**.**    out
1a960 42 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f  B:    Move the o
1a970 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c  utput of the sel
1a980 65 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69  ectB coroutine i
1a990 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  nto the output.*
1a9a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66  *             of
1a9b0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
1a9c0 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65  ery.  (Only gene
1a9d0 72 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20  rated for UNION 
1a9e0 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
1a9f0 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45     UNION ALL.  E
1aa00 58 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54  XCEPT and INSERT
1aa10 53 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75  SECT never outpu
1aa20 74 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20  t a row that.** 
1aa30 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65              appe
1aa40 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a  ars only in B.).
1aa50 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20  **.**    AltB:  
1aa60 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
1aa70 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
1aa80 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
1aa90 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20   and A<B..**.** 
1aaa0 20 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c     AeqB:    Call
1aab0 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
1aac0 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20   data from both 
1aad0 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41  coroutines and A
1aae0 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67  ==B..**.**    Ag
1aaf0 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  tB:    Called wh
1ab00 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61  en there is data
1ab10 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75   from both corou
1ab20 74 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a  tines and A>B..*
1ab30 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20  *.**    EofA:   
1ab40 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74   Called when dat
1ab50 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66  a is exhausted f
1ab60 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a  rom selectA..**.
1ab70 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43  **    EofB:    C
1ab80 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20  alled when data 
1ab90 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f  is exhausted fro
1aba0 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a  m selectB..**.**
1abb0 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
1abc0 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65  ion of the latte
1abd0 72 20 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e  r five subroutin
1abe0 65 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69  es depend on whi
1abf0 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72  ch .** <operator
1ac00 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a  > is used:.**.**
1ac10 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1ac20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20  UNION ALL       
1ac30 20 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20    UNION         
1ac40 20 20 20 45 58 43 45 50 54 20 20 20 20 20 20 20     EXCEPT       
1ac50 20 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20     INTERSECT.** 
1ac60 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d           -------
1ac70 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ------  --------
1ac80 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  ---------  -----
1ac90 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  ---------  -----
1aca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
1acb0 20 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20    AltB:   outA, 
1acc0 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c  nextA      outA,
1acd0 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74   nextA       out
1ace0 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20  A, nextA        
1acf0 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41   nextA.**.**   A
1ad00 65 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78  eqB:   outA, nex
1ad10 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41  tA         nextA
1ad20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78               nex
1ad30 74 41 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c  tA         outA,
1ad40 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41   nextA.**.**   A
1ad50 67 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78  gtB:   outB, nex
1ad60 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65  tB      outB, ne
1ad70 78 74 42 20 20 20 20 20 20 20 20 20 20 6e 65 78  xtB          nex
1ad80 74 42 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  tB            ne
1ad90 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41  xtB.**.**   EofA
1ada0 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20  :   outB, nextB 
1adb0 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42       outB, nextB
1adc0 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 20 20            halt  
1add0 20 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a             halt.
1ade0 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20  **.**   EofB:   
1adf0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
1ae00 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
1ae10 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
1ae20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a         halt.**.*
1ae30 2a 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41  * In the AltB, A
1ae40 65 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75  eqB, and AgtB su
1ae50 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f  broutines, an EO
1ae60 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67  F on A following
1ae70 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73   nextA.** causes
1ae80 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75   an immediate ju
1ae90 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61  mp to EofA and a
1aea0 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f  n EOF on B follo
1aeb0 77 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65  wing nextB cause
1aec0 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74  s.** an immediat
1aed0 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20  e jump to EofB. 
1aee0 20 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64   Within EofA and
1aef0 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f   EofB, and EOF o
1af00 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f  n entry or.** fo
1af10 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61  llowing nextX ca
1af20 75 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74  uses a jump to t
1af30 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65  he end of the se
1af40 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e  lect processing.
1af50 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65  .**.** Duplicate
1af60 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20   removal in the 
1af70 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61  UNION, EXCEPT, a
1af80 6e 64 20 49 4e 54 45 52 53 45 43 54 20 63 61 73  nd INTERSECT cas
1af90 65 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a  es is handled.**
1afa0 20 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70   within the outp
1afb0 75 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20  ut subroutine.  
1afc0 54 68 65 20 72 65 67 50 72 65 76 20 72 65 67 69  The regPrev regi
1afd0 73 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74  ster set holds t
1afe0 68 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a  he previously.**
1aff0 20 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20   output value.  
1b000 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  A comparison is 
1b010 6d 61 64 65 20 61 67 61 69 6e 73 74 20 74 68 69  made against thi
1b020 73 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20  s value and the 
1b030 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69  output.** is ski
1b040 70 70 65 64 20 69 66 20 74 68 65 20 6e 65 78 74  pped if the next
1b050 20 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62   results would b
1b060 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
1b070 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a  e previous..**.*
1b080 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
1b090 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20  tion plan is to 
1b0a0 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77  implement the tw
1b0b0 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  o coroutines and
1b0c0 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75   seven.** subrou
1b0d0 74 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65  tines first, the
1b0e0 6e 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f  n put the contro
1b0f0 6c 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62  l logic at the b
1b100 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69  ottom.  Like thi
1b110 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
1b120 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20    goto Init.**  
1b130 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e     coA: coroutin
1b140 65 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79  e for left query
1b150 20 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a   (A).**     coB:
1b160 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72   coroutine for r
1b170 69 67 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a  ight query (B).*
1b180 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75  *    outA: outpu
1b190 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a  t one row of A.*
1b1a0 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75  *    outB: outpu
1b1b0 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28  t one row of B (
1b1c0 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20  UNION and UNION 
1b1d0 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20  ALL only).**    
1b1e0 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  EofA: ....**    
1b1f0 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  EofB: ....**    
1b200 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  AltB: ....**    
1b210 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  AeqB: ....**    
1b220 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  AgtB: ....**    
1b230 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65  Init: initialize
1b240 20 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73   coroutine regis
1b250 74 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ters.**         
1b260 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20   yield coA.**   
1b270 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 41 29         if eof(A)
1b280 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20   goto EofA.**   
1b290 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42         yield coB
1b2a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20  .**          if 
1b2b0 65 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42  eof(B) goto EofB
1b2c0 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d  .**    Cmpr: Com
1b2d0 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20  pare A, B.**    
1b2e0 20 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c        Jump AltB,
1b2f0 20 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20   AeqB, AgtB.**  
1b300 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a     End: ....**.*
1b310 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20  * We call AltB, 
1b320 41 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41  AeqB, AgtB, EofA
1b330 2c 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72  , and EofB "subr
1b340 6f 75 74 69 6e 65 73 22 20 62 75 74 20 74 68 65  outines" but the
1b350 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74  y are not.** act
1b360 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69  ually called usi
1b370 6e 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65  ng Gosub and the
1b380 79 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e  y do not Return.
1b390 20 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20    EofA and EofB 
1b3a0 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c  loop.** until al
1b3b0 6c 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73  l data is exhaus
1b3c0 74 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f  ted then jump to
1b3d0 20 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e   the "end" labe.
1b3e0 20 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a    AltB, AeqB,.**
1b3f0 20 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74   and AgtB jump t
1b400 6f 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74  o either L2 or t
1b410 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72  o one of EofA or
1b420 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65   EofB..*/.#ifnde
1b430 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
1b440 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74  MPOUND_SELECT.st
1b450 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
1b460 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50  lectOrderBy(.  P
1b470 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1b480 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
1b490 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
1b4a0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
1b4b0 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
1b4c0 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
1b4d0 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
1b4e0 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
1b4f0 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
1b500 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
1b510 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20  results */.){.  
1b520 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
1b530 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1b540 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65  unters */.  Sele
1b550 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20  ct *pPrior;     
1b560 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c    /* Another SEL
1b570 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ECT immediately 
1b580 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20  to our left */. 
1b590 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
1b5a0 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
1b5b0 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20  te code to this 
1b5c0 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74  VDBE */.  Select
1b5d0 44 65 73 74 20 64 65 73 74 41 3b 20 20 20 20 20  Dest destA;     
1b5e0 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66  /* Destination f
1b5f0 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a  or coroutine A *
1b600 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
1b610 65 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73  estB;     /* Des
1b620 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72  tination for cor
1b630 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e  outine B */.  in
1b640 74 20 72 65 67 41 64 64 72 41 3b 20 20 20 20 20  t regAddrA;     
1b650 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
1b660 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
1b670 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-A coroutine *
1b680 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 42  /.  int regAddrB
1b690 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
1b6a0 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
1b6b0 72 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75  r select-B corou
1b6c0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
1b6d0 64 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20  drSelectA;      
1b6e0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
1b6f0 65 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75  e select-A corou
1b700 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
1b710 64 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20  drSelectB;      
1b720 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
1b730 65 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75  e select-B corou
1b740 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
1b750 67 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 20  gOutA;          
1b760 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
1b770 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70  ter for the outp
1b780 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-A subroutine 
1b790 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42  */.  int regOutB
1b7a0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ;          /* Ad
1b7b0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
1b7c0 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20  or the output-B 
1b7d0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
1b7e0 69 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20  int addrOutA;   
1b7f0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1b800 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41   of the output-A
1b810 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
1b820 20 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20   int addrOutB = 
1b830 30 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  0;     /* Addres
1b840 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d  s of the output-
1b850 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
1b860 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20    int addrEofA; 
1b870 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
1b880 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
1b890 2d 41 2d 65 78 68 61 75 73 74 65 64 20 73 75 62  -A-exhausted sub
1b8a0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1b8b0 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 3b 20 20   addrEofA_noB;  
1b8c0 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 65 20     /* Alternate 
1b8d0 61 64 64 72 45 6f 66 41 20 69 66 20 42 20 69 73  addrEofA if B is
1b8e0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a   uninitialized *
1b8f0 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42  /.  int addrEofB
1b900 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
1b910 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
1b920 63 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73  ct-B-exhausted s
1b930 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
1b940 6e 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20  nt addrAltB;    
1b950 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1b960 6f 66 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f  of the A<B subro
1b970 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
1b980 64 64 72 41 65 71 42 3b 20 20 20 20 20 20 20 20  ddrAeqB;        
1b990 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
1b9a0 68 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69  he A==B subrouti
1b9b0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
1b9c0 41 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AgtB;         /*
1b9d0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
1b9e0 41 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  A>B subroutine *
1b9f0 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74  /.  int regLimit
1ba00 41 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d  A;        /* Lim
1ba10 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  it register for 
1ba20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e  select-A */.  in
1ba30 74 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20  t regLimitB;    
1ba40 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67      /* Limit reg
1ba50 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
1ba60 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50  -A */.  int regP
1ba70 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  rev;          /*
1ba80 20 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69   A range of regi
1ba90 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72  sters to hold pr
1baa0 65 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f  evious output */
1bab0 0a 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69  .  int savedLimi
1bac0 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65  t;       /* Save
1bad0 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c  d value of p->iL
1bae0 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61  imit */.  int sa
1baf0 76 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20  vedOffset;      
1bb00 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
1bb10 66 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a  f p->iOffset */.
1bb20 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b    int labelCmpr;
1bb30 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
1bb40 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f   for the start o
1bb50 66 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f  f the merge algo
1bb60 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c  rithm */.  int l
1bb70 61 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20  abelEnd;        
1bb80 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68   /* Label for th
1bb90 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65  e end of the ove
1bba0 72 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74  rall SELECT stmt
1bbb0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b   */.  int addr1;
1bbc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
1bbd0 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ump instructions
1bbe0 20 74 68 61 74 20 67 65 74 20 72 65 74 61 72 67   that get retarg
1bbf0 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  etted */.  int o
1bc00 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1bc10 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c   /* One of TK_AL
1bc20 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  L, TK_UNION, TK_
1bc30 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52  EXCEPT, TK_INTER
1bc40 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  SECT */.  KeyInf
1bc50 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b 20  o *pKeyDup = 0; 
1bc60 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e  /* Comparison in
1bc70 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75  formation for du
1bc80 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20  plicate removal 
1bc90 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
1bca0 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f  eyMerge;   /* Co
1bcb0 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61  mparison informa
1bcc0 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67  tion for merging
1bcd0 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74   rows */.  sqlit
1bce0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
1bcf0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
1bd00 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
1bd10 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
1bd20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
1bd30 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
1bd40 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20  nt nOrderBy;    
1bd50 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1bd60 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  f terms in the O
1bd70 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
1bd80 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74  /.  int *aPermut
1bd90 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70  e;        /* Map
1bda0 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20  ping from ORDER 
1bdb0 42 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75  BY terms to resu
1bdc0 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a  lt set columns *
1bdd0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  /..  assert( p->
1bde0 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20  pOrderBy!=0 );. 
1bdf0 20 61 73 73 65 72 74 28 20 70 4b 65 79 44 75 70   assert( pKeyDup
1be00 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67  ==0 ); /* "Manag
1be10 65 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74  ed" code needs t
1be20 68 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33  his.  Ticket #33
1be30 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  82. */.  db = pP
1be40 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20  arse->db;.  v = 
1be50 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1be60 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
1be70 20 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64         /* Alread
1be80 79 20 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72  y thrown the err
1be90 6f 72 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63  or if VDBE alloc
1bea0 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62   failed */.  lab
1beb0 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  elEnd = sqlite3V
1bec0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1bed0 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73  .  labelCmpr = s
1bee0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1bef0 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50  bel(v);...  /* P
1bf00 61 74 63 68 20 75 70 20 74 68 65 20 4f 52 44 45  atch up the ORDE
1bf10 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f  R BY clause.  */
1bf20 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20  .  op = p->op;  
1bf30 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
1bf40 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  Prior;.  assert(
1bf50 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
1bf60 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72  y==0 );.  pOrder
1bf70 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
1bf80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ;.  assert( pOrd
1bf90 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72  erBy );.  nOrder
1bfa0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  By = pOrderBy->n
1bfb0 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20  Expr;..  /* For 
1bfc0 6f 70 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20  operators other 
1bfd0 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77  than UNION ALL w
1bfe0 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73  e have to make s
1bff0 75 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ure that.  ** th
1c000 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1c010 65 20 63 6f 76 65 72 73 20 65 76 65 72 79 20 74  e covers every t
1c020 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c  erm of the resul
1c030 74 20 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a  t set.  Add.  **
1c040 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52   terms to the OR
1c050 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73  DER BY clause as
1c060 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
1c070 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c  .  if( op!=TK_AL
1c080 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  L ){.    for(i=1
1c090 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ; db->mallocFail
1c0a0 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70  ed==0 && i<=p->p
1c0b0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
1c0c0 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
1c0d0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
1c0e0 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72  pItem;.      for
1c0f0 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (j=0, pItem=pOrd
1c100 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65  erBy->a; j<nOrde
1c110 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; j++, pItem+
1c120 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
1c130 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  rt( pItem->u.x.i
1c140 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a  OrderByCol>0 );.
1c150 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
1c160 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
1c170 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20  ol==i ) break;. 
1c180 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1c190 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a   j==nOrderBy ){.
1c1a0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e          Expr *pN
1c1b0 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
1c1c0 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c  (db, TK_INTEGER,
1c1d0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
1c1e0 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
1c1f0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
1c200 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  KPT;.        pNe
1c210 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49  w->flags |= EP_I
1c220 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20  ntValue;.       
1c230 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20   pNew->u.iValue 
1c240 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = i;.        p->
1c250 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
1c260 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
1c270 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
1c280 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e  se, pOrderBy, pN
1c290 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ew);.        if(
1c2a0 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64   pOrderBy ) pOrd
1c2b0 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79  erBy->a[nOrderBy
1c2c0 2b 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  ++].u.x.iOrderBy
1c2d0 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20  Col = (u16)i;.  
1c2e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1c2f0 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
1c300 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72  e comparison per
1c310 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79  mutation and key
1c320 69 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73 65  info that is use
1c330 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20  d with.  ** the 
1c340 70 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64  permutation used
1c350 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
1c360 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72   the next.  ** r
1c370 6f 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f  ow of results co
1c380 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41  mes from selectA
1c390 20 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c   or selectB.  Al
1c3a0 73 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a  so add explicit.
1c3b0 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20    ** collations 
1c3c0 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
1c3d0 63 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20  clause terms so 
1c3e0 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 73 75  that when the su
1c3f0 62 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f  bqueries.  ** to
1c400 20 74 68 65 20 72 69 67 68 74 20 61 6e 64 20 74   the right and t
1c410 68 65 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c  he left are eval
1c420 75 61 74 65 64 2c 20 74 68 65 79 20 75 73 65 20  uated, they use 
1c430 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a  the correct.  **
1c440 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f   collation..  */
1c450 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71  .  aPermute = sq
1c460 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
1c470 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e  NN(db, sizeof(in
1c480 74 29 2a 28 6e 4f 72 64 65 72 42 79 20 2b 20 31  t)*(nOrderBy + 1
1c490 29 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75  ));.  if( aPermu
1c4a0 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  te ){.    struct
1c4b0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
1c4c0 70 49 74 65 6d 3b 0a 20 20 20 20 61 50 65 72 6d  pItem;.    aPerm
1c4d0 75 74 65 5b 30 5d 20 3d 20 6e 4f 72 64 65 72 42  ute[0] = nOrderB
1c4e0 79 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c 20  y;.    for(i=1, 
1c4f0 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
1c500 61 3b 20 69 3c 3d 6e 4f 72 64 65 72 42 79 3b 20  a; i<=nOrderBy; 
1c510 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
1c520 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
1c530 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
1c540 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 61  Col>0 );.      a
1c550 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e  ssert( pItem->u.
1c560 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70  x.iOrderByCol<=p
1c570 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
1c580 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74  );.      aPermut
1c590 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e  e[i] = pItem->u.
1c5a0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20  x.iOrderByCol - 
1c5b0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65  1;.    }.    pKe
1c5c0 79 4d 65 72 67 65 20 3d 20 6d 75 6c 74 69 53 65  yMerge = multiSe
1c5d0 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
1c5e0 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29  fo(pParse, p, 1)
1c5f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1c600 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20  KeyMerge = 0;.  
1c610 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68  }..  /* Reattach
1c620 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1c630 61 75 73 65 20 74 6f 20 74 68 65 20 71 75 65 72  ause to the quer
1c640 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72  y..  */.  p->pOr
1c650 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
1c660 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  ;.  pPrior->pOrd
1c670 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
1c680 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65  prListDup(pParse
1c690 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20  ->db, pOrderBy, 
1c6a0 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  0);..  /* Alloca
1c6b0 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65  te a range of te
1c6c0 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
1c6d0 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66  s and the KeyInf
1c6e0 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f  o needed.  ** fo
1c6f0 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  r the logic that
1c700 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61   removes duplica
1c710 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77  te result rows w
1c720 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65  hen the.  ** ope
1c730 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20  rator is UNION, 
1c740 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52  EXCEPT, or INTER
1c750 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e  SECT (but not UN
1c760 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20  ION ALL)..  */. 
1c770 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
1c780 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d  ){.    regPrev =
1c790 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1c7a0 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e   int nExpr = p->
1c7b0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
1c7c0 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65     assert( nOrde
1c7d0 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62  rBy>=nExpr || db
1c7e0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1c7f0 3b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20  ;.    regPrev = 
1c800 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
1c810 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
1c820 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20   += nExpr+1;.   
1c830 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c840 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1c850 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20  , 0, regPrev);. 
1c860 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c     pKeyDup = sql
1c870 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
1c880 28 64 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a  (db, nExpr, 1);.
1c890 20 20 20 20 69 66 28 20 70 4b 65 79 44 75 70 20      if( pKeyDup 
1c8a0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1c8b0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
1c8c0 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 44  sWriteable(pKeyD
1c8d0 75 70 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  up) );.      for
1c8e0 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
1c8f0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65  ++){.        pKe
1c900 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  yDup->aColl[i] =
1c910 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
1c920 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69  Seq(pParse, p, i
1c930 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  );.        pKeyD
1c940 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  up->aSortOrder[i
1c950 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
1c960 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20     }.  }. .  /* 
1c970 53 65 70 61 72 61 74 65 20 74 68 65 20 6c 65 66  Separate the lef
1c980 74 20 61 6e 64 20 74 68 65 20 72 69 67 68 74 20  t and the right 
1c990 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61  query from one a
1c9a0 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d  nother.  */.  p-
1c9b0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70  >pPrior = 0;.  p
1c9c0 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30  Prior->pNext = 0
1c9d0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
1c9e0 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  veOrderGroupBy(p
1c9f0 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72  Parse, p, p->pOr
1ca00 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b  derBy, "ORDER");
1ca10 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
1ca20 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
1ca30 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
1ca40 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
1ca50 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f  e, pPrior, pPrio
1ca60 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  r->pOrderBy, "OR
1ca70 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  DER");.  }..  /*
1ca80 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d   Compute the lim
1ca90 69 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  it registers */.
1caa0 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
1cab0 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
1cac0 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
1cad0 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26  if( p->iLimit &&
1cae0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
1caf0 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b     regLimitA = +
1cb00 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1cb10 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b     regLimitB = +
1cb20 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1cb30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1cb40 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
1cb50 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d   p->iOffset ? p-
1cb60 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e  >iOffset+1 : p->
1cb70 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20  iLimit,.        
1cb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb90 20 20 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d            regLim
1cba0 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  itA);.    sqlite
1cbb0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1cbc0 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74  P_Copy, regLimit
1cbd0 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20  A, regLimitB);. 
1cbe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c   }else{.    regL
1cbf0 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74  imitA = regLimit
1cc00 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  B = 0;.  }.  sql
1cc10 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1cc20 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
1cc30 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
1cc40 0a 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b  .  regAddrA = ++
1cc50 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1cc60 72 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61  regAddrB = ++pPa
1cc70 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
1cc80 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  OutA = ++pParse-
1cc90 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42  >nMem;.  regOutB
1cca0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1ccb0 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  m;.  sqlite3Sele
1ccc0 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
1ccd0 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  A, SRT_Coroutine
1cce0 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73  , regAddrA);.  s
1ccf0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
1cd00 49 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52 54  Init(&destB, SRT
1cd10 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  _Coroutine, regA
1cd20 64 64 72 42 29 3b 0a 0a 20 20 45 78 70 6c 61 69  ddrB);..  Explai
1cd30 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
1cd40 73 65 2c 20 31 2c 20 22 4d 45 52 47 45 20 28 25  se, 1, "MERGE (%
1cd50 73 29 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d  s)", selectOpNam
1cd60 65 28 70 2d 3e 6f 70 29 29 29 3b 0a 0a 20 20 2f  e(p->op)));..  /
1cd70 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72  * Generate a cor
1cd80 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61  outine to evalua
1cd90 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  te the SELECT st
1cda0 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20  atement to the. 
1cdb0 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20   ** left of the 
1cdc0 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f  compound operato
1cdd0 72 20 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65  r - the "A" sele
1cde0 63 74 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53  ct..  */.  addrS
1cdf0 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33  electA = sqlite3
1ce00 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1ce10 76 29 20 2b 20 31 3b 0a 20 20 61 64 64 72 31 20  v) + 1;.  addr1 
1ce20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1ce30 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
1ce40 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
1ce50 41 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74  A, 0, addrSelect
1ce60 41 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  A);.  VdbeCommen
1ce70 74 28 28 76 2c 20 22 6c 65 66 74 20 53 45 4c 45  t((v, "left SELE
1ce80 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d  CT"));.  pPrior-
1ce90 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d  >iLimit = regLim
1cea0 69 74 41 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75  itA;.  ExplainQu
1ceb0 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
1cec0 20 31 2c 20 22 4c 45 46 54 22 29 29 3b 0a 20 20   1, "LEFT"));.  
1ced0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
1cee0 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64  arse, pPrior, &d
1cef0 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  estA);.  sqlite3
1cf00 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65  VdbeEndCoroutine
1cf10 28 76 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20  (v, regAddrA);. 
1cf20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1cf30 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
1cf40 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1cf50 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76   coroutine to ev
1cf60 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43  aluate the SELEC
1cf70 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a  T statement on .
1cf80 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d    ** the right -
1cf90 20 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a   the "B" select.
1cfa0 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63    */.  addrSelec
1cfb0 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
1cfc0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
1cfd0 20 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71   1;.  addr1 = sq
1cfe0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1cff0 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  v, OP_InitCorout
1d000 69 6e 65 2c 20 72 65 67 41 64 64 72 42 2c 20 30  ine, regAddrB, 0
1d010 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a  , addrSelectB);.
1d020 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1d030 2c 20 22 72 69 67 68 74 20 53 45 4c 45 43 54 22  , "right SELECT"
1d040 29 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74  ));.  savedLimit
1d050 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20   = p->iLimit;.  
1d060 73 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d  savedOffset = p-
1d070 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69  >iOffset;.  p->i
1d080 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74  Limit = regLimit
1d090 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20  B;.  p->iOffset 
1d0a0 3d 20 30 3b 20 20 0a 20 20 45 78 70 6c 61 69 6e  = 0;  .  Explain
1d0b0 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
1d0c0 65 2c 20 31 2c 20 22 52 49 47 48 54 22 29 29 3b  e, 1, "RIGHT"));
1d0d0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1d0e0 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
1d0f0 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74  tB);.  p->iLimit
1d100 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20   = savedLimit;. 
1d110 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61   p->iOffset = sa
1d120 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c  vedOffset;.  sql
1d130 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75  ite3VdbeEndCorou
1d140 74 69 6e 65 28 76 2c 20 72 65 67 41 64 64 72 42  tine(v, regAddrB
1d150 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1d160 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
1d170 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20  hat outputs the 
1d180 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
1d190 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74  he A.  ** select
1d1a0 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74   as the next out
1d1b0 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63  put row of the c
1d1c0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
1d1d0 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
1d1e0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70  omment((v, "Outp
1d1f0 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41  ut routine for A
1d200 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20  "));.  addrOutA 
1d210 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  = generateOutput
1d220 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73  Subroutine(pPars
1d230 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1d240 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70      p, &destA, p
1d250 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20  Dest, regOutA,. 
1d260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d270 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70  regPrev, pKeyDup
1d280 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a  , labelEnd);.  .
1d290 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1d2a0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
1d2b0 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72  outputs the curr
1d2c0 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42  ent row of the B
1d2d0 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20  .  ** select as 
1d2e0 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20  the next output 
1d2f0 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  row of the compo
1d300 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  und select..  */
1d310 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
1d320 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  L || op==TK_UNIO
1d330 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f  N ){.    VdbeNoo
1d340 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75  pComment((v, "Ou
1d350 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  tput routine for
1d360 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f   B"));.    addrO
1d370 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75  utB = generateOu
1d380 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70  tputSubroutine(p
1d390 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
1d3a0 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74          p, &dest
1d3b0 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74  B, pDest, regOut
1d3c0 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  B,.             
1d3d0 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65      regPrev, pKe
1d3e0 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  yDup, labelEnd);
1d3f0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65  .  }.  sqlite3Ke
1d400 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 44  yInfoUnref(pKeyD
1d410 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  up);..  /* Gener
1d420 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
1d430 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65   to run when the
1d440 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65   results from se
1d450 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20  lect A.  ** are 
1d460 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e  exhausted and on
1d470 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63  ly data in selec
1d480 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a  t B remains..  *
1d490 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45  /.  if( op==TK_E
1d4a0 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  XCEPT || op==TK_
1d4b0 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
1d4c0 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20   addrEofA_noB = 
1d4d0 61 64 64 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c  addrEofA = label
1d4e0 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a  End;.  }else{  .
1d4f0 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
1d500 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73  ent((v, "eof-A s
1d510 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1d520 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c    addrEofA = sql
1d530 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1d540 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
1d550 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a  utB, addrOutB);.
1d560 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42      addrEofA_noB
1d570 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1d580 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1d590 2c 20 72 65 67 41 64 64 72 42 2c 20 6c 61 62 65  , regAddrB, labe
1d5a0 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20  lEnd);.         
1d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5c0 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
1d5d0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1d5e0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
1d5f0 28 76 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20  (v, addrEofA);. 
1d600 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
1d610 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1d620 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  Add(p->nSelectRo
1d630 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  w, pPrior->nSele
1d640 63 74 52 6f 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ctRow);.  }..  /
1d650 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
1d660 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77  routine to run w
1d670 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
1d680 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20  from select B.  
1d690 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64  ** are exhausted
1d6a0 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69   and only data i
1d6b0 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69  n select A remai
1d6c0 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ns..  */.  if( o
1d6d0 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
1d6e0 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20  ){.    addrEofB 
1d6f0 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20  = addrEofA;.    
1d700 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
1d710 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  w > pPrior->nSel
1d720 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c  ectRow ) p->nSel
1d730 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d  ectRow = pPrior-
1d740 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d  >nSelectRow;.  }
1d750 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65  else{  .    Vdbe
1d760 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1d770 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e  "eof-B subroutin
1d780 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f  e"));.    addrEo
1d790 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  fB = sqlite3Vdbe
1d7a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
1d7b0 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64  ub, regOutA, add
1d7c0 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69  rOutA);.    sqli
1d7d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1d7e0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1d7f0 64 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20  drA, labelEnd); 
1d800 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1d810 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1d820 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f 66 42  Goto(v, addrEofB
1d830 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
1d840 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
1d850 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
1d860 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65   A<B.  */.  Vdbe
1d870 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1d880 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69  "A-lt-B subrouti
1d890 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74  ne"));.  addrAlt
1d8a0 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
1d8b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
1d8c0 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72  b, regOutA, addr
1d8d0 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  OutA);.  sqlite3
1d8e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d8f0 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
1d900 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62  , addrEofA); Vdb
1d910 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1d920 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1d930 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a  v, labelCmpr);..
1d940 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1d950 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
1d960 20 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20   case of A==B.  
1d970 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
1d980 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41  ALL ){.    addrA
1d990 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a  eqB = addrAltB;.
1d9a0 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
1d9b0 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
1d9c0 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61      addrAeqB = a
1d9d0 64 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64  ddrAltB;.    add
1d9e0 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65  rAltB++;.  }else
1d9f0 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f  {.    VdbeNoopCo
1da00 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d  mment((v, "A-eq-
1da10 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
1da20 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a  .    addrAeqB =.
1da30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1da40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1da50 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64  d, regAddrA, add
1da60 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65  rEofA); VdbeCove
1da70 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
1da80 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1da90 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a  labelCmpr);.  }.
1daa0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1dab0 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ode to handle th
1dac0 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20 20  e case of A>B.  
1dad0 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
1dae0 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d 42  ment((v, "A-gt-B
1daf0 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
1db00 20 20 61 64 64 72 41 67 74 42 20 3d 20 73 71 6c    addrAgtB = sql
1db10 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1db20 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70  ddr(v);.  if( op
1db30 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d  ==TK_ALL || op==
1db40 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20  TK_UNION ){.    
1db50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1db60 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
1db70 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42  egOutB, addrOutB
1db80 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1db90 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1dba0 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42  _Yield, regAddrB
1dbb0 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62  , addrEofB); Vdb
1dbc0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1dbd0 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1dbe0 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a  v, labelCmpr);..
1dbf0 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72    /* This code r
1dc00 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74  uns once to init
1dc10 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e  ialize everythin
1dc20 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  g..  */.  sqlite
1dc30 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
1dc40 20 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69 74   addr1);.  sqlit
1dc50 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1dc60 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1dc70 72 41 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42  rA, addrEofA_noB
1dc80 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1dc90 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
1dca0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1dcb0 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61  eld, regAddrB, a
1dcc0 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f  ddrEofB); VdbeCo
1dcd0 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a  verage(v);..  /*
1dce0 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d   Implement the m
1dcf0 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20  ain merge loop. 
1dd00 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1dd10 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1dd20 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73   labelCmpr);.  s
1dd30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1dd40 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69  (v, OP_Permutati
1dd50 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68  on, 0, 0, 0, (ch
1dd60 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34  ar*)aPermute, P4
1dd70 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71  _INTARRAY);.  sq
1dd80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1dd90 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64  v, OP_Compare, d
1dda0 65 73 74 41 2e 69 53 64 73 74 2c 20 64 65 73 74  estA.iSdst, dest
1ddb0 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65 72 42  B.iSdst, nOrderB
1ddc0 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
1ddd0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
1dde0 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34  r*)pKeyMerge, P4
1ddf0 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c  _KEYINFO);.  sql
1de00 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
1de10 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55  (v, OPFLAG_PERMU
1de20 54 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  TE);.  sqlite3Vd
1de30 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
1de40 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61  ump, addrAltB, a
1de50 64 64 72 41 65 71 42 2c 20 61 64 64 72 41 67 74  ddrAeqB, addrAgt
1de60 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  B); VdbeCoverage
1de70 28 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  (v);..  /* Jump 
1de80 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e  to the this poin
1de90 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65  t in order to te
1dea0 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65 72  rminate the quer
1deb0 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  y..  */.  sqlite
1dec0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1ded0 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  l(v, labelEnd);.
1dee0 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79  .  /* Reassembly
1def0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
1df00 65 72 79 20 73 6f 20 74 68 61 74 20 69 74 20 77  ery so that it w
1df10 69 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f 72  ill be freed cor
1df20 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74  rectly.  ** by t
1df30 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
1df40 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ion */.  if( p->
1df50 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73 71  pPrior ){.    sq
1df60 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
1df70 65 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29  e(db, p->pPrior)
1df80 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f  ;.  }.  p->pPrio
1df90 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 70 50  r = pPrior;.  pP
1dfa0 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  rior->pNext = p;
1dfb0 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49  ..  /*** TBD:  I
1dfc0 6e 73 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65  nsert subroutine
1dfd0 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20   calls to close 
1dfe0 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d  cursors on incom
1dff0 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62  plete.  **** sub
1e000 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20  queries ****/.  
1e010 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
1e020 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 72  Pop(pParse);.  r
1e030 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45  eturn pParse->nE
1e040 72 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rr!=0;.}.#endif.
1e050 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
1e060 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1e070 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
1e080 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1e090 29 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63  )../* An instanc
1e0a0 65 20 6f 66 20 74 68 65 20 53 75 62 73 74 43 6f  e of the SubstCo
1e0b0 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 64 65 73  ntext object des
1e0c0 63 72 69 62 65 73 20 61 6e 20 73 75 62 73 74 69  cribes an substi
1e0d0 74 75 74 69 6f 6e 20 65 64 69 74 0a 2a 2a 20 74  tution edit.** t
1e0e0 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 6f  o be performed o
1e0f0 6e 20 61 20 70 61 72 73 65 20 74 72 65 65 2e 0a  n a parse tree..
1e100 2a 2a 0a 2a 2a 20 41 6c 6c 20 72 65 66 65 72 65  **.** All refere
1e110 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20  nces to columns 
1e120 69 6e 20 74 61 62 6c 65 20 69 54 61 62 6c 65 20  in table iTable 
1e130 61 72 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63  are to be replac
1e140 65 64 20 62 79 20 63 6f 72 72 65 73 70 6f 6e 64  ed by correspond
1e150 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ing.** expressio
1e160 6e 73 20 69 6e 20 70 45 4c 69 73 74 2e 0a 2a 2f  ns in pEList..*/
1e170 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1e180 53 75 62 73 74 43 6f 6e 74 65 78 74 20 7b 0a 20  SubstContext {. 
1e190 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
1e1a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1e1b0 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
1e1c0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  t */.  int iTabl
1e1d0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1e1e0 20 2f 2a 20 52 65 70 6c 61 63 65 20 72 65 66 65   /* Replace refe
1e1f0 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74  rences to this t
1e200 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e  able */.  int iN
1e210 65 77 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20  ewTable;        
1e220 20 20 20 20 2f 2a 20 4e 65 77 20 74 61 62 6c 65      /* New table
1e230 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
1e240 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 20 20 20 20   isLeftJoin;    
1e250 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 54 4b         /* Add TK
1e260 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 6f 70 63  _IF_NULL_ROW opc
1e270 6f 64 65 73 20 6f 6e 20 65 61 63 68 20 72 65 70  odes on each rep
1e280 6c 61 63 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78  lacement */.  Ex
1e290 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
1e2a0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61          /* Repla
1e2b0 63 65 6d 65 6e 74 20 65 78 70 72 65 73 73 69 6f  cement expressio
1e2c0 6e 73 20 2a 2f 0a 7d 20 53 75 62 73 74 43 6f 6e  ns */.} SubstCon
1e2d0 74 65 78 74 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72  text;../* Forwar
1e2e0 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a  d Declarations *
1e2f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  /.static void su
1e300 62 73 74 45 78 70 72 4c 69 73 74 28 53 75 62 73  bstExprList(Subs
1e310 74 43 6f 6e 74 65 78 74 2a 2c 20 45 78 70 72 4c  tContext*, ExprL
1e320 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f  ist*);.static vo
1e330 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 53  id substSelect(S
1e340 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20 53 65  ubstContext*, Se
1e350 6c 65 63 74 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a  lect*, int);../*
1e360 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68  .** Scan through
1e370 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1e380 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20  pExpr.  Replace 
1e390 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20  every reference 
1e3a0 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69  to.** a column i
1e3b0 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69  n table number i
1e3c0 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70  Table with a cop
1e3d0 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e  y of the iColumn
1e3e0 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20  -th.** entry in 
1e3f0 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65  pEList.  (But le
1e400 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ave references t
1e410 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75  o the ROWID colu
1e420 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64  mn .** unchanged
1e430 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .).**.** This ro
1e440 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66  utine is part of
1e450 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20   the flattening 
1e460 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75  procedure.  A su
1e470 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20  bquery.** whose 
1e480 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65  result set is de
1e490 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20  fined by pEList 
1e4a0 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79  appears as entry
1e4b0 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20   in the.** FROM 
1e4c0 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
1e4d0 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65  CT such that the
1e4e0 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73   VDBE cursor ass
1e4f0 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a  igned to that.**
1e500 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74   FORM clause ent
1e510 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54  ry is iTable.  T
1e520 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  his routine make
1e530 73 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  s the necessary 
1e540 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70  .** changes to p
1e550 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20  Expr so that it 
1e560 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20  refers directly 
1e570 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61  to the source ta
1e580 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75  ble.** of the su
1e590 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68  bquery rather th
1e5a0 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
1e5b0 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f  the subquery..*/
1e5c0 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 73 75  .static Expr *su
1e5d0 62 73 74 45 78 70 72 28 0a 20 20 53 75 62 73 74  bstExpr(.  Subst
1e5e0 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74 2c  Context *pSubst,
1e5f0 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
1e600 20 6f 66 20 74 68 65 20 73 75 62 73 74 69 74 75   of the substitu
1e610 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  tion */.  Expr *
1e620 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
1e630 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63   /* Expr in whic
1e640 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f  h substitution o
1e650 63 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 66  ccurs */.){.  if
1e660 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
1e670 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 45 78 70  urn 0;.  if( Exp
1e680 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1e690 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
1e6a0 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69 52  .   && pExpr->iR
1e6b0 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 70  ightJoinTable==p
1e6c0 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 0a 20 20  Subst->iTable.  
1e6d0 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 52  ){.    pExpr->iR
1e6e0 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20  ightJoinTable = 
1e6f0 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c  pSubst->iNewTabl
1e700 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78  e;.  }.  if( pEx
1e710 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
1e720 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  N && pExpr->iTab
1e730 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62  le==pSubst->iTab
1e740 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45  le ){.    if( pE
1e750 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
1e760 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  {.      pExpr->o
1e770 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20  p = TK_NULL;.   
1e780 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78   }else{.      Ex
1e790 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  pr *pNew;.      
1e7a0 45 78 70 72 20 2a 70 43 6f 70 79 20 3d 20 70 53  Expr *pCopy = pS
1e7b0 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  ubst->pEList->a[
1e7c0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
1e7d0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 45 78 70  pExpr;.      Exp
1e7e0 72 20 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20  r ifNullRow;.   
1e7f0 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 73     assert( pSubs
1e800 74 2d 3e 70 45 4c 69 73 74 21 3d 30 20 26 26 20  t->pEList!=0 && 
1e810 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70  pExpr->iColumn<p
1e820 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  Subst->pEList->n
1e830 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73  Expr );.      as
1e840 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69  sert( pExpr->pRi
1e850 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
1e860 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
1e870 73 56 65 63 74 6f 72 28 70 43 6f 70 79 29 20 29  sVector(pCopy) )
1e880 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1e890 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28  3VectorErrorMsg(
1e8a0 70 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2c 20  pSubst->pParse, 
1e8b0 70 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 7d 65  pCopy);.      }e
1e8c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
1e8d0 69 74 65 33 20 2a 64 62 20 3d 20 70 53 75 62 73  ite3 *db = pSubs
1e8e0 74 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20  t->pParse->db;. 
1e8f0 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 73         if( pSubs
1e900 74 2d 3e 69 73 4c 65 66 74 4a 6f 69 6e 20 26 26  t->isLeftJoin &&
1e910 20 70 43 6f 70 79 2d 3e 6f 70 21 3d 54 4b 5f 43   pCopy->op!=TK_C
1e920 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20  OLUMN ){.       
1e930 20 20 20 6d 65 6d 73 65 74 28 26 69 66 4e 75 6c     memset(&ifNul
1e940 6c 52 6f 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  lRow, 0, sizeof(
1e950 69 66 4e 75 6c 6c 52 6f 77 29 29 3b 0a 20 20 20  ifNullRow));.   
1e960 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77         ifNullRow
1e970 2e 6f 70 20 3d 20 54 4b 5f 49 46 5f 4e 55 4c 4c  .op = TK_IF_NULL
1e980 5f 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 20 20  _ROW;.          
1e990 69 66 4e 75 6c 6c 52 6f 77 2e 70 4c 65 66 74 20  ifNullRow.pLeft 
1e9a0 3d 20 70 43 6f 70 79 3b 0a 20 20 20 20 20 20 20  = pCopy;.       
1e9b0 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 69 54 61     ifNullRow.iTa
1e9c0 62 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e  ble = pSubst->iN
1e9d0 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  ewTable;.       
1e9e0 20 20 20 70 43 6f 70 79 20 3d 20 26 69 66 4e 75     pCopy = &ifNu
1e9f0 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d  llRow;.        }
1ea00 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
1ea10 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
1ea20 62 2c 20 70 43 6f 70 79 2c 20 30 29 3b 0a 20 20  b, pCopy, 0);.  
1ea30 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26        if( pNew &
1ea40 26 20 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74  & pSubst->isLeft
1ea50 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Join ){.        
1ea60 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
1ea70 79 28 70 4e 65 77 2c 20 45 50 5f 43 61 6e 42 65  y(pNew, EP_CanBe
1ea80 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Null);.        }
1ea90 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
1eaa0 77 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70  w && ExprHasProp
1eab0 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f 46 72  erty(pExpr,EP_Fr
1eac0 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20  omJoin) ){.     
1ead0 20 20 20 20 20 70 4e 65 77 2d 3e 69 52 69 67 68       pNew->iRigh
1eae0 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 45 78  tJoinTable = pEx
1eaf0 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  pr->iRightJoinTa
1eb00 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 45  ble;.          E
1eb10 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
1eb20 4e 65 77 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  New, EP_FromJoin
1eb30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1eb40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1eb50 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
1eb60 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  );.        pExpr
1eb70 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d   = pNew;.      }
1eb80 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1eb90 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
1eba0 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f  p==TK_IF_NULL_RO
1ebb0 57 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  W && pExpr->iTab
1ebc0 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62  le==pSubst->iTab
1ebd0 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  le ){.      pExp
1ebe0 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 53 75 62  r->iTable = pSub
1ebf0 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20  st->iNewTable;. 
1ec00 20 20 20 7d 0a 20 20 20 20 70 45 78 70 72 2d 3e     }.    pExpr->
1ec10 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78 70  pLeft = substExp
1ec20 72 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d  r(pSubst, pExpr-
1ec30 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 45 78  >pLeft);.    pEx
1ec40 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62  pr->pRight = sub
1ec50 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70  stExpr(pSubst, p
1ec60 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
1ec70 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
1ec80 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1ec90 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
1eca0 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74       substSelect
1ecb0 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e  (pSubst, pExpr->
1ecc0 78 2e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20  x.pSelect, 1);. 
1ecd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ece0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53  substExprList(pS
1ecf0 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70  ubst, pExpr->x.p
1ed00 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
1ed10 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b  .  return pExpr;
1ed20 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
1ed30 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20  ubstExprList(.  
1ed40 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53  SubstContext *pS
1ed50 75 62 73 74 2c 20 2f 2a 20 44 65 73 63 72 69 70  ubst, /* Descrip
1ed60 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73  tion of the subs
1ed70 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78  titution */.  Ex
1ed80 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20  prList *pList   
1ed90 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73      /* List to s
1eda0 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68  can and in which
1edb0 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
1edc0 75 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  utes */.){.  int
1edd0 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
1ede0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
1edf0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1ee00 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
1ee10 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45    pList->a[i].pE
1ee20 78 70 72 20 3d 20 73 75 62 73 74 45 78 70 72 28  xpr = substExpr(
1ee30 70 53 75 62 73 74 2c 20 70 4c 69 73 74 2d 3e 61  pSubst, pList->a
1ee40 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  [i].pExpr);.  }.
1ee50 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
1ee60 62 73 74 53 65 6c 65 63 74 28 0a 20 20 53 75 62  bstSelect(.  Sub
1ee70 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73  stContext *pSubs
1ee80 74 2c 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f  t, /* Descriptio
1ee90 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74 69 74  n of the substit
1eea0 75 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ution */.  Selec
1eeb0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
1eec0 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   /* SELECT state
1eed0 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f  ment in which to
1eee0 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69   make substituti
1eef0 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 50  ons */.  int doP
1ef00 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 2f  rior           /
1ef10 2a 20 44 6f 20 73 75 62 73 74 69 74 75 74 65 73  * Do substitutes
1ef20 20 6f 6e 20 70 2d 3e 70 50 72 69 6f 72 20 74 6f   on p->pPrior to
1ef30 6f 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73  o */.){.  SrcLis
1ef40 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63  t *pSrc;.  struc
1ef50 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1ef60 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
1ef70 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
1ef80 6e 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 75 62  n;.  do{.    sub
1ef90 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73  stExprList(pSubs
1efa0 74 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  t, p->pEList);. 
1efb0 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1efc0 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 47 72 6f  (pSubst, p->pGro
1efd0 75 70 42 79 29 3b 0a 20 20 20 20 73 75 62 73 74  upBy);.    subst
1efe0 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c  ExprList(pSubst,
1eff0 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
1f000 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20     p->pHaving = 
1f010 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74  substExpr(pSubst
1f020 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20  , p->pHaving);. 
1f030 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
1f040 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c  ubstExpr(pSubst,
1f050 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20   p->pWhere);.   
1f060 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
1f070 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72  .    assert( pSr
1f080 63 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  c!=0 );.    for(
1f090 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49  i=pSrc->nSrc, pI
1f0a0 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30  tem=pSrc->a; i>0
1f0b0 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
1f0c0 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65  .      substSele
1f0d0 63 74 28 70 53 75 62 73 74 2c 20 70 49 74 65 6d  ct(pSubst, pItem
1f0e0 2d 3e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20  ->pSelect, 1);. 
1f0f0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1f100 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a  fg.isTabFunc ){.
1f110 20 20 20 20 20 20 20 20 73 75 62 73 74 45 78 70          substExp
1f120 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 49  rList(pSubst, pI
1f130 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67  tem->u1.pFuncArg
1f140 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1f150 0a 20 20 7d 77 68 69 6c 65 28 20 64 6f 50 72 69  .  }while( doPri
1f160 6f 72 20 26 26 20 28 70 20 3d 20 70 2d 3e 70 50  or && (p = p->pP
1f170 72 69 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a 23 65  rior)!=0 );.}.#e
1f180 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
1f190 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1f1a0 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1f1b0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1f1c0 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65  IEW) */..#if !de
1f1d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1f1e0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
1f1f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1f200 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20  MIT_VIEW)./*.** 
1f210 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
1f220 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
1f230 20 73 75 62 71 75 65 72 69 65 73 20 61 73 20 61   subqueries as a
1f240 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74   performance opt
1f250 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68  imization..** Th
1f260 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1f270 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73  ns 1 if it makes
1f280 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69   changes and 0 i
1f290 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20  f no flattening 
1f2a0 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f  occurs..**.** To
1f2b0 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20   understand the 
1f2c0 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74  concept of flatt
1f2d0 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20  ening, consider 
1f2e0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1f2f0 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
1f300 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
1f310 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61  (SELECT x+y AS a
1f320 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
1f330 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a  <100) WHERE a>5.
1f340 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  **.** The defaul
1f350 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65  t way of impleme
1f360 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79  nting this query
1f370 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74   is to execute t
1f380 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66  he.** subquery f
1f390 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74  irst and store t
1f3a0 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  he results in a 
1f3b0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
1f3c0 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65   then.** run the
1f3d0 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20   outer query on 
1f3e0 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74  that temporary t
1f3f0 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75  able.  This requ
1f400 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73  ires two.** pass
1f410 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61  es over the data
1f420 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  .  Furthermore, 
1f430 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70  because the temp
1f440 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68  orary table.** h
1f450 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74  as no indices, t
1f460 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1f470 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  on the outer que
1f480 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ry cannot be.** 
1f490 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a  optimized..**.**
1f4a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
1f4b0 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74  tempts to rewrit
1f4c0 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61  e queries such a
1f4d0 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f  s the above into
1f4e0 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61  .** a single fla
1f4f0 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74  t select, like t
1f500 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  his:.**.**     S
1f510 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
1f520 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
1f530 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a  00 AND a>5.**.**
1f540 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   The code genera
1f550 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d  ted for this sim
1f560 70 6c 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65  plification give
1f570 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  s the same resul
1f580 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61  t.** but only ha
1f590 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61  s to scan the da
1f5a0 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65  ta once.  And be
1f5b0 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69  cause indices mi
1f5c0 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e  ght .** exist on
1f5d0 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61   the table t1, a
1f5e0 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f   complete scan o
1f5f0 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74  f the data might
1f600 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a   be.** avoided..
1f610 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67  **.** Flattening
1f620 20 69 73 20 73 75 62 6a 65 63 74 20 74 6f 20 74   is subject to t
1f630 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e  he following con
1f640 73 74 72 61 69 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20  straints:.**.** 
1f650 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e   (**)  We no lon
1f660 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66  ger attempt to f
1f670 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61 74 65  latten aggregate
1f680 20 73 75 62 71 75 65 72 69 65 73 2e 20 57 61 73   subqueries. Was
1f690 3a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20  :.**        The 
1f6a0 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65  subquery and the
1f6b0 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e   outer query can
1f6c0 6e 6f 74 20 62 6f 74 68 20 62 65 20 61 67 67 72  not both be aggr
1f6d0 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  egates..**.**  (
1f6e0 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65  **)  We no longe
1f6f0 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61  r attempt to fla
1f700 74 74 65 6e 20 61 67 67 72 65 67 61 74 65 20 73  tten aggregate s
1f710 75 62 71 75 65 72 69 65 73 2e 20 57 61 73 3a 0a  ubqueries. Was:.
1f720 2a 2a 20 20 20 20 20 20 20 20 28 32 29 20 49 66  **        (2) If
1f730 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
1f740 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68   an aggregate th
1f750 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 32 61  en.**        (2a
1f760 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  ) the outer quer
1f770 79 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 20  y must not be a 
1f780 6a 6f 69 6e 20 61 6e 64 0a 2a 2a 20 20 20 20 20  join and.**     
1f790 20 20 20 28 32 62 29 20 74 68 65 20 6f 75 74 65     (2b) the oute
1f7a0 72 20 71 75 65 72 79 20 6d 75 73 74 20 6e 6f 74  r query must not
1f7b0 20 75 73 65 20 73 75 62 71 75 65 72 69 65 73 0a   use subqueries.
1f7c0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  **             o
1f7d0 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e  ther than the on
1f7e0 65 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  e FROM-clause su
1f7f0 62 71 75 65 72 79 20 74 68 61 74 20 69 73 20 61  bquery that is a
1f800 20 63 61 6e 64 69 64 61 74 65 0a 2a 2a 20 20 20   candidate.**   
1f810 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 66 6c            for fl
1f820 61 74 74 65 6e 69 6e 67 2e 20 20 28 54 68 69 73  attening.  (This
1f830 20 69 73 20 64 75 65 20 74 6f 20 74 69 63 6b 65   is due to ticke
1f840 74 20 5b 32 66 37 31 37 30 64 37 33 62 66 39 61  t [2f7170d73bf9a
1f850 62 66 38 30 5d 0a 2a 2a 20 20 20 20 20 20 20 20  bf80].**        
1f860 20 20 20 20 20 66 72 6f 6d 20 32 30 31 35 2d 30       from 2015-0
1f870 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28  2-09.).**.**   (
1f880 33 29 20 20 49 66 20 74 68 65 20 73 75 62 71 75  3)  If the subqu
1f890 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
1f8a0 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45   operand of a LE
1f8b0 46 54 20 4a 4f 49 4e 20 74 68 65 6e 0a 2a 2a 20  FT JOIN then.** 
1f8c0 20 20 20 20 20 20 20 28 33 61 29 20 74 68 65 20         (3a) the 
1f8d0 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
1f8e0 20 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a   be a join and.*
1f8f0 2a 20 20 20 20 20 20 20 20 28 33 62 29 20 74 68  *        (3b) th
1f900 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1f910 20 74 68 65 20 73 75 62 71 75 65 72 79 20 6d 61   the subquery ma
1f920 79 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  y not contain a 
1f930 76 69 72 74 75 61 6c 0a 2a 2a 20 20 20 20 20 20  virtual.**      
1f940 20 20 20 20 20 20 20 74 61 62 6c 65 20 61 6e 64         table and
1f950 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 63 29 20  .**        (3c) 
1f960 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1f970 6d 61 79 20 6e 6f 74 20 62 65 20 61 6e 20 61 67  may not be an ag
1f980 67 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20  gregate..**.**  
1f990 20 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65   (4)  The subque
1f9a0 72 79 20 63 61 6e 20 6e 6f 74 20 62 65 20 44 49  ry can not be DI
1f9b0 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28  STINCT..**.**  (
1f9c0 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e  **)  At one poin
1f9d0 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28  t restrictions (
1f9e0 34 29 20 61 6e 64 20 28 35 29 20 64 65 66 69 6e  4) and (5) defin
1f9f0 65 64 20 61 20 73 75 62 73 65 74 20 6f 66 20 44  ed a subset of D
1fa00 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20  ISTINCT.**      
1fa10 20 20 73 75 62 2d 71 75 65 72 69 65 73 20 74 68    sub-queries th
1fa20 61 74 20 77 65 72 65 20 65 78 63 6c 75 64 65 64  at were excluded
1fa30 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d   from this optim
1fa40 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72 69 63  ization. Restric
1fa50 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20  tion .**        
1fa60 28 34 29 20 68 61 73 20 73 69 6e 63 65 20 62 65  (4) has since be
1fa70 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f 20 65  en expanded to e
1fa80 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53 54 49  xclude all DISTI
1fa90 4e 43 54 20 73 75 62 71 75 65 72 69 65 73 2e 0a  NCT subqueries..
1faa0 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20  **.**  (**)  We 
1fab0 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70  no longer attemp
1fac0 74 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67  t to flatten agg
1fad0 72 65 67 61 74 65 20 73 75 62 71 75 65 72 69 65  regate subquerie
1fae0 73 2e 20 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20  s.  Was:.**     
1faf0 20 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65     If the subque
1fb00 72 79 20 69 73 20 61 67 67 72 65 67 61 74 65 2c  ry is aggregate,
1fb10 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1fb20 20 6d 61 79 20 6e 6f 74 20 62 65 20 44 49 53 54   may not be DIST
1fb30 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37  INCT..**.**   (7
1fb40 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1fb50 6d 75 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d  must have a FROM
1fb60 20 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20   clause.  TODO: 
1fb70 20 46 6f 72 20 73 75 62 71 75 65 72 69 65 73 20   For subqueries 
1fb80 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20  without.**      
1fb90 20 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c    A FROM clause,
1fba0 20 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67   consider adding
1fbb0 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77   a FROM clause w
1fbc0 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a  ith the special.
1fbd0 2a 2a 20 20 20 20 20 20 20 20 74 61 62 6c 65 20  **        table 
1fbe0 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74  sqlite_once that
1fbf0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
1fc00 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69  ingle row contai
1fc10 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ning a.**       
1fc20 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a   single NULL..**
1fc30 0a 2a 2a 20 20 20 28 38 29 20 20 49 66 20 74 68  .**   (8)  If th
1fc40 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1fc50 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f  LIMIT then the o
1fc60 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1fc70 6f 74 20 62 65 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  ot be a join..**
1fc80 0a 2a 2a 20 20 20 28 39 29 20 20 49 66 20 74 68  .**   (9)  If th
1fc90 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1fca0 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f  LIMIT then the o
1fcb0 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1fcc0 6f 74 20 62 65 20 61 67 67 72 65 67 61 74 65 2e  ot be aggregate.
1fcd0 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65  .**.**  (**)  Re
1fce0 73 74 72 69 63 74 69 6f 6e 20 28 31 30 29 20 77  striction (10) w
1fcf0 61 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  as removed from 
1fd00 74 68 65 20 63 6f 64 65 20 6f 6e 20 32 30 30 35  the code on 2005
1fd10 2d 30 32 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a  -02-05 but we.**
1fd20 20 20 20 20 20 20 20 20 61 63 63 69 64 65 6e 74          accident
1fd30 6c 79 20 63 61 72 72 69 65 64 20 74 68 65 20 63  ly carried the c
1fd40 6f 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64 20 75  omment forward u
1fd50 6e 74 69 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e  ntil 2014-09-15.
1fd60 20 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20    Original.**   
1fd70 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 3a       constraint:
1fd80 20 22 49 66 20 74 68 65 20 73 75 62 71 75 65 72   "If the subquer
1fd90 79 20 69 73 20 61 67 67 72 65 67 61 74 65 20 74  y is aggregate t
1fda0 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  hen the outer qu
1fdb0 65 72 79 20 0a 2a 2a 20 20 20 20 20 20 20 20 6d  ery .**        m
1fdc0 61 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  ay not use LIMIT
1fdd0 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20  .".**.**  (11)  
1fde0 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
1fdf0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1fe00 20 6d 61 79 20 6e 6f 74 20 62 6f 74 68 20 68 61   may not both ha
1fe10 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ve ORDER BY clau
1fe20 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  ses..**.**  (**)
1fe30 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65    Not implemente
1fe40 64 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74  d.  Subsumed int
1fe50 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33  o restriction (3
1fe60 29 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75 73  ).  Was previous
1fe70 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73  ly.**        a s
1fe80 65 70 61 72 61 74 65 20 72 65 73 74 72 69 63 74  eparate restrict
1fe90 69 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f  ion deriving fro
1fea0 6d 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a  m ticket #350..*
1feb0 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20  *.**  (13)  The 
1fec0 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74  subquery and out
1fed0 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  er query may not
1fee0 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e   both use LIMIT.
1fef0 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68  .**.**  (14)  Th
1ff00 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  e subquery may n
1ff10 6f 74 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a  ot use OFFSET..*
1ff20 2a 0a 2a 2a 20 20 28 31 35 29 20 20 49 66 20 74  *.**  (15)  If t
1ff30 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1ff40 73 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70  s part of a comp
1ff50 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
1ff60 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
1ff70 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
1ff80 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 20 20   use LIMIT..**  
1ff90 20 20 20 20 20 20 28 53 65 65 20 74 69 63 6b 65        (See ticke
1ffa0 74 20 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b  t #2339 and tick
1ffb0 65 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29  et [02a8e81d44])
1ffc0 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 49  ..**.**  (16)  I
1ffd0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
1ffe0 79 20 69 73 20 61 67 67 72 65 67 61 74 65 2c 20  y is aggregate, 
1fff0 74 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72  then the subquer
20000 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20 20 20  y may not.**    
20010 20 20 20 20 75 73 65 20 4f 52 44 45 52 20 42 59      use ORDER BY
20020 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39 34 32  .  (Ticket #2942
20030 29 20 20 54 68 69 73 20 75 73 65 64 20 74 6f 20  )  This used to 
20040 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20  not matter.**   
20050 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e       until we in
20060 74 72 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f  troduced the gro
20070 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63  up_concat() func
20080 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28  tion.  .**.**  (
20090 31 37 29 20 20 49 66 20 74 68 65 20 73 75 62 71  17)  If the subq
200a0 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
200b0 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 0a  nd select, then.
200c0 2a 2a 20 20 20 20 20 20 20 20 28 31 37 61 29 20  **        (17a) 
200d0 61 6c 6c 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65  all compound ope
200e0 72 61 74 6f 72 73 20 6d 75 73 74 20 62 65 20 61  rators must be a
200f0 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 61 6e 64 0a   UNION ALL, and.
20100 2a 2a 20 20 20 20 20 20 20 20 28 31 37 62 29 20  **        (17b) 
20110 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 69 6e 20  no terms within 
20120 74 68 65 20 73 75 62 71 75 65 72 79 20 63 6f 6d  the subquery com
20130 70 6f 75 6e 64 20 6d 61 79 20 62 65 20 61 67 67  pound may be agg
20140 72 65 67 61 74 65 0a 2a 2a 20 20 20 20 20 20 20  regate.**       
20150 20 20 20 20 20 20 20 6f 72 20 44 49 53 54 49 4e         or DISTIN
20160 43 54 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  CT, and.**      
20170 20 20 28 31 37 63 29 20 65 76 65 72 79 20 74 65    (17c) every te
20180 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20 73 75  rm within the su
20190 62 71 75 65 72 79 20 63 6f 6d 70 6f 75 6e 64 20  bquery compound 
201a0 6d 75 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d  must have a FROM
201b0 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20   clause.**      
201c0 20 20 28 31 37 64 29 20 74 68 65 20 6f 75 74 65    (17d) the oute
201d0 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  r query may not 
201e0 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
201f0 20 20 20 28 31 37 64 31 29 20 61 67 67 72 65 67     (17d1) aggreg
20200 61 74 65 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20  ate, or.**      
20210 20 20 20 20 20 20 20 20 28 31 37 64 32 29 20 44          (17d2) D
20220 49 53 54 49 4e 43 54 2c 20 6f 72 0a 2a 2a 20 20  ISTINCT, or.**  
20230 20 20 20 20 20 20 20 20 20 20 20 20 28 31 37 64              (17d
20240 33 29 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  3) a join..**.**
20250 20 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65          The pare
20260 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79  nt and sub-query
20270 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45   may contain WHE
20280 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a  RE clauses. Subj
20290 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ect to.**       
202a0 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33   rules (11), (13
202b0 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79  ) and (14), they
202c0 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69   may also contai
202d0 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20  n ORDER BY,.**  
202e0 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20        LIMIT and 
202f0 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
20300 20 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61   The subquery ca
20310 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d  nnot use any com
20320 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  pound.**        
20330 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74  operator other t
20340 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65  han UNION ALL be
20350 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74  cause all the ot
20360 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  her compound.** 
20370 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73         operators
20380 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64   have an implied
20390 20 44 49 53 54 49 4e 43 54 20 77 68 69 63 68 20   DISTINCT which 
203a0 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79  is disallowed by
203b0 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74 72  .**        restr
203c0 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a  iction (4)..**.*
203d0 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65  *        Also, e
203e0 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66  ach component of
203f0 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d   the sub-query m
20400 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 73  ust return the s
20410 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20  ame number.**   
20420 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63       of result c
20430 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20  olumns. This is 
20440 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69  actually a requi
20450 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63  rement for any c
20460 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
20470 20 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65    SELECT stateme
20480 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20  nt, but all the 
20490 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20 69  code here does i
204a0 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
204b0 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75   no.**        su
204c0 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62  ch (illegal) sub
204d0 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74 74 65  -query is flatte
204e0 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ned. The caller 
204f0 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a  will detect the.
20500 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61 78  **        syntax
20510 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72   error and retur
20520 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73  n a detailed mes
20530 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38  sage..**.**  (18
20540 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  )  If the sub-qu
20550 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
20560 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61  d select, then a
20570 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a  ll terms of the.
20580 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20  **        ORDER 
20590 42 59 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  BY clause of the
205a0 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20   parent must be 
205b0 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65  simple reference
205c0 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20  s to .**        
205d0 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73  columns of the s
205e0 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  ub-query..**.** 
205f0 20 28 31 39 29 20 20 49 66 20 74 68 65 20 73 75   (19)  If the su
20600 62 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49  bquery uses LIMI
20610 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72  T then the outer
20620 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a   query may not.*
20630 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 61 20  *        have a 
20640 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  WHERE clause..**
20650 0a 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74 68  .**  (20)  If th
20660 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
20670 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
20680 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e  , then it must n
20690 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  ot use.**       
206a0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
206b0 75 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37  use.  Ticket #37
206c0 37 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65  73.  We could re
206d0 6c 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61  lax this constra
206e0 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f  int.**        so
206f0 6d 65 77 68 61 74 20 62 79 20 73 61 79 69 6e 67  mewhat by saying
20700 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20   that the terms 
20710 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
20720 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20  clause must.**  
20730 20 20 20 20 20 20 61 70 70 65 61 72 20 61 73 20        appear as 
20740 75 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c  unmodified resul
20750 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
20760 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
20770 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20  ut we.**        
20780 68 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d  have other optim
20790 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64  izations in mind
207a0 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68   to deal with th
207b0 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20  at case..**.**  
207c0 28 32 31 29 20 20 49 66 20 74 68 65 20 73 75 62  (21)  If the sub
207d0 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54  query uses LIMIT
207e0 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20   then the outer 
207f0 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
20800 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49  .**        DISTI
20810 4e 43 54 2e 20 20 28 53 65 65 20 74 69 63 6b 65  NCT.  (See ticke
20820 74 20 5b 37 35 32 65 31 36 34 36 66 63 5d 29 2e  t [752e1646fc]).
20830 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54 68  .**.**  (22)  Th
20840 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  e subquery may n
20850 6f 74 20 62 65 20 61 20 72 65 63 75 72 73 69 76  ot be a recursiv
20860 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  e CTE..**.**  (*
20870 2a 29 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74  *)  Subsumed int
20880 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 31  o restriction (1
20890 37 64 33 29 2e 20 20 57 61 73 3a 20 49 66 20 74  7d3).  Was: If t
208a0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
208b0 73 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 72 65  s.**        a re
208c0 63 75 72 73 69 76 65 20 43 54 45 2c 20 74 68 65  cursive CTE, the
208d0 6e 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  n the sub-query 
208e0 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 63 6f 6d  may not be a com
208f0 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 20  pound query..** 
20900 20 20 20 20 20 20 20 54 68 69 73 20 72 65 73 74         This rest
20910 72 69 63 74 69 6f 6e 20 69 73 20 62 65 63 61 75  riction is becau
20920 73 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20  se transforming 
20930 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 70 61  the.**        pa
20940 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75  rent to a compou
20950 6e 64 20 71 75 65 72 79 20 63 6f 6e 66 75 73 65  nd query confuse
20960 73 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  s the code that 
20970 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20  handles.**      
20980 20 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72    recursive quer
20990 69 65 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65  ies in multiSele
209a0 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  ct()..**.**  (**
209b0 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20  )  We no longer 
209c0 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74  attempt to flatt
209d0 65 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62  en aggregate sub
209e0 71 75 65 72 69 65 73 2e 20 20 57 61 73 3a 0a 2a  queries.  Was:.*
209f0 2a 20 20 20 20 20 20 20 20 54 68 65 20 73 75 62  *        The sub
20a00 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
20a10 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68   an aggregate th
20a20 61 74 20 75 73 65 73 20 74 68 65 20 62 75 69 6c  at uses the buil
20a30 74 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a 2a  t-in min() or .*
20a40 2a 20 20 20 20 20 20 20 20 6f 72 20 6d 61 78 28  *        or max(
20a50 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28 57  ) functions.  (W
20a60 69 74 68 6f 75 74 20 74 68 69 73 20 72 65 73 74  ithout this rest
20a70 72 69 63 74 69 6f 6e 2c 20 61 20 71 75 65 72 79  riction, a query
20a80 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20 20   like:.**       
20a90 20 22 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20   "SELECT x FROM 
20aa0 28 53 45 4c 45 43 54 20 6d 61 78 28 79 29 2c 20  (SELECT max(y), 
20ab0 78 20 46 52 4f 4d 20 74 31 29 22 20 77 6f 75 6c  x FROM t1)" woul
20ac0 64 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  d not necessaril
20ad0 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 74 75  y.**        retu
20ae0 72 6e 20 74 68 65 20 76 61 6c 75 65 20 58 20 66  rn the value X f
20af0 6f 72 20 77 68 69 63 68 20 59 20 77 61 73 20 6d  or which Y was m
20b00 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 20 20  aximal.).**.**  
20b10 28 32 35 29 20 20 49 66 20 65 69 74 68 65 72 20  (25)  If either 
20b20 74 68 65 20 73 75 62 71 75 65 72 79 20 6f 72 20  the subquery or 
20b30 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
20b40 20 63 6f 6e 74 61 69 6e 73 20 61 20 77 69 6e 64   contains a wind
20b50 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 66 75 6e  ow.**        fun
20b60 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 65 6c  ction in the sel
20b70 65 63 74 20 6c 69 73 74 20 6f 72 20 4f 52 44 45  ect list or ORDE
20b80 52 20 42 59 20 63 6c 61 75 73 65 2c 20 66 6c 61  R BY clause, fla
20b90 74 74 65 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20  ttening.**      
20ba0 20 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74    is not attempt
20bb0 65 64 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20  ed..**.**.** In 
20bc0 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68  this routine, th
20bd0 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20  e "p" parameter 
20be0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
20bf0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
20c00 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79  .** The subquery
20c10 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69   is p->pSrc->a[i
20c20 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73  From].  isAgg is
20c30 20 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74   true if the out
20c40 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73  er query.** uses
20c50 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
20c60 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
20c70 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
20c80 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
20c90 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72  is a no-op and r
20ca0 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20  eturns 0..** If 
20cb0 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74  flattening is at
20cc0 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75  tempted this rou
20cd0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a  tine returns 1..
20ce0 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65  **.** All of the
20cf0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c   expression anal
20d00 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20  ysis must occur 
20d10 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65  on both the oute
20d20 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74  r query and.** t
20d30 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f  he subquery befo
20d40 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
20d50 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  runs..*/.static 
20d60 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75  int flattenSubqu
20d70 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ery(.  Parse *pP
20d80 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
20d90 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
20da0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
20db0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
20dc0 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20  parent or outer 
20dd0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
20de0 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
20df0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
20e00 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e  dex in p->pSrc->
20e10 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  a[] of the inner
20e20 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
20e30 6e 74 20 69 73 41 67 67 20 20 20 20 20 20 20 20  nt isAgg        
20e40 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
20e50 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73  uter SELECT uses
20e60 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
20e70 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ions */.){.  con
20e80 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41  st char *zSavedA
20e90 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61  uthContext = pPa
20ea0 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
20eb0 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61  t;.  Select *pPa
20ec0 72 65 6e 74 3b 20 20 20 20 2f 2a 20 43 75 72 72  rent;    /* Curr
20ed0 65 6e 74 20 55 4e 49 4f 4e 20 41 4c 4c 20 74 65  ent UNION ALL te
20ee0 72 6d 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20  rm of the other 
20ef0 71 75 65 72 79 20 2a 2f 0a 20 20 53 65 6c 65 63  query */.  Selec
20f00 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f  t *pSub;       /
20f10 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  * The inner quer
20f20 79 20 6f 72 20 22 73 75 62 71 75 65 72 79 22 20  y or "subquery" 
20f30 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  */.  Select *pSu
20f40 62 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  b1;      /* Poin
20f50 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74  ter to the right
20f60 6d 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73  most select in s
20f70 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72  ub-query */.  Sr
20f80 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20  cList *pSrc;    
20f90 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
20fa0 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
20fb0 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63  r query */.  Src
20fc0 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20  List *pSubSrc;  
20fd0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
20fe0 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  use of the subqu
20ff0 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ery */.  int iPa
21000 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  rent;        /* 
21010 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
21020 65 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72  er of the pSub r
21030 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74  esult set temp t
21040 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e  able */.  int iN
21050 65 77 50 61 72 65 6e 74 20 3d 20 2d 31 3b 2f 2a  ewParent = -1;/*
21060 20 52 65 70 6c 61 63 65 6d 65 6e 74 20 74 61 62   Replacement tab
21070 6c 65 20 66 6f 72 20 69 50 61 72 65 6e 74 20 2a  le for iParent *
21080 2f 0a 20 20 69 6e 74 20 69 73 4c 65 66 74 4a 6f  /.  int isLeftJo
21090 69 6e 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20  in = 0; /* True 
210a0 69 66 20 70 53 75 62 20 69 73 20 74 68 65 20 72  if pSub is the r
210b0 69 67 68 74 20 73 69 64 65 20 6f 66 20 61 20 4c  ight side of a L
210c0 45 46 54 20 4a 4f 49 4e 20 2a 2f 20 20 20 20 0a  EFT JOIN */    .
210d0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
210e0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
210f0 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20  unter */.  Expr 
21100 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
21110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
21120 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
21130 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
21140 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74  ist_item *pSubit
21150 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62  em;   /* The sub
21160 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74  query */.  sqlit
21170 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
21180 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  >db;..  /* Check
21190 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74   to see if flatt
211a0 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74  ening is permitt
211b0 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ed.  Return 0 if
211c0 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   not..  */.  ass
211d0 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
211e0 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72  ssert( p->pPrior
211f0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4f 70 74  ==0 );.  if( Opt
21200 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
21210 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65  d(db, SQLITE_Que
21220 72 79 46 6c 61 74 74 65 6e 65 72 29 20 29 20 72  ryFlattener) ) r
21230 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20  eturn 0;.  pSrc 
21240 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
21250 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72  ert( pSrc && iFr
21260 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70  om>=0 && iFrom<p
21270 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70  Src->nSrc );.  p
21280 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d  Subitem = &pSrc-
21290 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61  >a[iFrom];.  iPa
212a0 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d  rent = pSubitem-
212b0 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62  >iCursor;.  pSub
212c0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65   = pSubitem->pSe
212d0 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20  lect;.  assert( 
212e0 70 53 75 62 21 3d 30 20 29 3b 0a 0a 23 69 66 6e  pSub!=0 );..#ifn
212f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21300 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 69 66 28  WINDOWFUNC.  if(
21310 20 70 2d 3e 70 57 69 6e 20 7c 7c 20 70 53 75 62   p->pWin || pSub
21320 2d 3e 70 57 69 6e 20 29 20 72 65 74 75 72 6e 20  ->pWin ) return 
21330 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
21340 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
21350 6f 6e 20 28 32 35 29 20 2a 2f 0a 23 65 6e 64 69  on (25) */.#endi
21360 66 0a 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70  f..  pSubSrc = p
21370 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  Sub->pSrc;.  ass
21380 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a  ert( pSubSrc );.
21390 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65    /* Prior to ve
213a0 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65  rsion 3.1.2, whe
213b0 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  n LIMIT and OFFS
213c0 45 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d  ET had to be sim
213d0 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20  ple constants,. 
213e0 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72   ** not arbitrar
213f0 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77  y expressions, w
21400 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63  e allowed some c
21410 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49  ombining of LIMI
21420 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
21430 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63  * because they c
21440 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
21450 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
21460 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49  .  But when LIMI
21470 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
21480 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61  * became arbitra
21490 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  ry expressions, 
214a0 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74  we were forced t
214b0 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f  o add restrictio
214c0 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64  ns (13).  ** and
214d0 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20   (14). */.  if( 
214e0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
214f0 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
21500 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
21510 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
21520 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20  n (13) */.  if( 
21530 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
21540 70 53 75 62 2d 3e 70 4c 69 6d 69 74 2d 3e 70 52  pSub->pLimit->pR
21550 69 67 68 74 20 29 20 72 65 74 75 72 6e 20 30 3b  ight ) return 0;
21560 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
21570 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20  n (14) */.  if( 
21580 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
21590 46 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26  F_Compound)!=0 &
215a0 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29  & pSub->pLimit )
215b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
215c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
215f0 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a  striction (15) *
21600 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  /.  }.  if( pSub
21610 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72  Src->nSrc==0 ) r
21620 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
21630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21640 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37  * Restriction (7
21650 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
21660 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
21670 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
21680 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  n 0;           /
21690 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 34  * Restriction (4
216a0 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
216b0 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72  ->pLimit && (pSr
216c0 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41  c->nSrc>1 || isA
216d0 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75  gg) ){.     retu
216e0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
216f0 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38   Restrictions (8
21700 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  )(9) */.  }.  if
21710 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26  ( p->pOrderBy &&
21720 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
21730 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
21740 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21760 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
21770 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20  estriction (11) 
21780 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41  */.  }.  if( isA
21790 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  gg && pSub->pOrd
217a0 65 72 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b  erBy ) return 0;
217b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217c0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
217d0 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  16) */.  if( pSu
217e0 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e  b->pLimit && p->
217f0 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
21800 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
21810 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
21820 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  19) */.  if( pSu
21830 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d  b->pLimit && (p-
21840 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
21850 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20  istinct)!=0 ){. 
21860 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
21870 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
21880 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d  tion (21) */.  }
21890 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c  .  if( pSub->sel
218a0 46 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63 75  Flags & (SF_Recu
218b0 72 73 69 76 65 29 20 29 7b 0a 20 20 20 20 72 65  rsive) ){.    re
218c0 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72  turn 0; /* Restr
218d0 69 63 74 69 6f 6e 73 20 28 32 32 29 20 2a 2f 0a  ictions (22) */.
218e0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49    }..  /*.  ** I
218f0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
21900 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
21910 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  and of a LEFT JO
21920 49 4e 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  IN, then the.  *
21930 2a 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  * subquery may n
21940 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20 69 74 73  ot be a join its
21950 65 6c 66 20 28 33 61 29 2e 20 45 78 61 6d 70 6c  elf (3a). Exampl
21960 65 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73  e of why this is
21970 20 6e 6f 74 0a 20 20 2a 2a 20 61 6c 6c 6f 77 65   not.  ** allowe
21980 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  d:.  **.  **    
21990 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54       t1 LEFT OUT
219a0 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e  ER JOIN (t2 JOIN
219b0 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49   t3).  **.  ** I
219c0 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65  f we flatten the
219d0 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64   above, we would
219e0 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   get.  **.  **  
219f0 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20         (t1 LEFT 
21a00 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a  OUTER JOIN t2) J
21a10 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a  OIN t3.  **.  **
21a20 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74   which is not at
21a30 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68   all the same th
21a40 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ing..  **.  ** I
21a50 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
21a60 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
21a70 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  and of a LEFT JO
21a80 49 4e 2c 20 74 68 65 6e 20 74 68 65 20 6f 75 74  IN, then the out
21a90 65 72 0a 20 20 2a 2a 20 71 75 65 72 79 20 63 61  er.  ** query ca
21aa0 6e 6e 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65  nnot be an aggre
21ab0 67 61 74 65 2e 20 28 33 63 29 20 20 54 68 69 73  gate. (3c)  This
21ac0 20 69 73 20 61 6e 20 61 72 74 69 66 61 63 74 20   is an artifact 
21ad0 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20  of the way.  ** 
21ae0 61 67 67 72 65 67 61 74 65 73 20 61 72 65 20 70  aggregates are p
21af0 72 6f 63 65 73 73 65 64 20 2d 20 74 68 65 72 65  rocessed - there
21b00 20 69 73 20 6e 6f 20 6d 65 63 68 61 6e 69 73 6d   is no mechanism
21b10 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
21b20 0a 20 20 2a 2a 20 74 68 65 20 4c 45 46 54 20 4a  .  ** the LEFT J
21b30 4f 49 4e 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  OIN table should
21b40 20 62 65 20 61 6c 6c 2d 4e 55 4c 4c 2e 0a 20 20   be all-NULL..  
21b50 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f  **.  ** See also
21b60 20 74 69 63 6b 65 74 73 20 23 33 30 36 2c 20 23   tickets #306, #
21b70 33 35 30 2c 20 61 6e 64 20 23 33 33 30 30 2e 0a  350, and #3300..
21b80 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62    */.  if( (pSub
21b90 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  item->fg.jointyp
21ba0 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
21bb0 20 29 7b 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f   ){.    isLeftJo
21bc0 69 6e 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  in = 1;.    if( 
21bd0 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20  pSubSrc->nSrc>1 
21be0 7c 7c 20 69 73 41 67 67 20 7c 7c 20 49 73 56 69  || isAgg || IsVi
21bf0 72 74 75 61 6c 28 70 53 75 62 53 72 63 2d 3e 61  rtual(pSubSrc->a
21c00 5b 30 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20  [0].pTab) ){.   
21c10 20 20 20 2f 2a 20 20 28 33 61 29 20 20 20 20 20     /*  (3a)     
21c20 20 20 20 20 20 20 20 20 28 33 63 29 20 20 20 20          (3c)    
21c30 20 28 33 62 29 20 2a 2f 0a 20 20 20 20 20 20 72   (3b) */.      r
21c40 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
21c50 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
21c60 5f 45 58 54 52 41 5f 49 46 4e 55 4c 4c 52 4f 57  _EXTRA_IFNULLROW
21c70 0a 20 20 65 6c 73 65 20 69 66 28 20 69 46 72 6f  .  else if( iFro
21c80 6d 3e 30 20 26 26 20 21 69 73 41 67 67 20 29 7b  m>0 && !isAgg ){
21c90 0a 20 20 20 20 2f 2a 20 53 65 74 74 69 6e 67 20  .    /* Setting 
21ca0 69 73 4c 65 66 74 4a 6f 69 6e 20 74 6f 20 2d 31  isLeftJoin to -1
21cb0 20 63 61 75 73 65 73 20 4f 50 5f 49 66 4e 75 6c   causes OP_IfNul
21cc0 6c 52 6f 77 20 6f 70 63 6f 64 65 73 20 74 6f 20  lRow opcodes to 
21cd0 62 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  be generated for
21ce0 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72 65  .    ** every re
21cf0 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 72  ference to any r
21d00 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 66 72 6f  esult column fro
21d10 6d 20 73 75 62 71 75 65 72 79 20 69 6e 20 61 20  m subquery in a 
21d20 6a 6f 69 6e 2c 20 65 76 65 6e 0a 20 20 20 20 2a  join, even.    *
21d30 2a 20 74 68 6f 75 67 68 20 74 68 65 79 20 61 72  * though they ar
21d40 65 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  e not necessary.
21d50 20 20 54 68 69 73 20 77 69 6c 6c 20 73 74 72 65    This will stre
21d60 73 73 2d 74 65 73 74 20 74 68 65 20 4f 50 5f 49  ss-test the OP_I
21d70 66 4e 75 6c 6c 52 6f 77 20 0a 20 20 20 20 2a 2a  fNullRow .    **
21d80 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20   opcode. */.    
21d90 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 2d 31 3b  isLeftJoin = -1;
21da0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
21db0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
21dc0 37 29 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71  7): If the sub-q
21dd0 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
21de0 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20  nd SELECT, then 
21df0 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65  it must.  ** use
21e00 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20   only the UNION 
21e10 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e  ALL operator. An
21e20 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69  d none of the si
21e30 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72  mple select quer
21e40 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61  ies.  ** that ma
21e50 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75  ke up the compou
21e60 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c  nd SELECT are al
21e70 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72  lowed to be aggr
21e80 65 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63  egate or distinc
21e90 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a  t.  ** queries..
21ea0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
21eb0 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
21ec0 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
21ed0 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
21ee0 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63  n 0;  /* Restric
21ef0 74 69 6f 6e 20 28 32 30 29 20 2a 2f 0a 20 20 20  tion (20) */.   
21f00 20 7d 0a 20 20 20 20 69 66 28 20 69 73 41 67 67   }.    if( isAgg
21f10 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   || (p->selFlags
21f20 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
21f30 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63  =0 || pSrc->nSrc
21f40 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=1 ){.      ret
21f50 75 72 6e 20 30 3b 20 2f 2a 20 28 31 37 64 31 29  urn 0; /* (17d1)
21f60 2c 20 28 31 37 64 32 29 2c 20 6f 72 20 28 31 37  , (17d2), or (17
21f70 64 33 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  d3) */.    }.   
21f80 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b   for(pSub1=pSub;
21f90 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53   pSub1; pSub1=pS
21fa0 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  ub1->pPrior){.  
21fb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
21fc0 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Sub1->selFlags &
21fd0 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
21fe0 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
21ff0 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20  _Distinct );.   
22000 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53     testcase( (pS
22010 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
22020 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
22030 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
22040 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20  Aggregate );.   
22050 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d     assert( pSub-
22060 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20  >pSrc!=0 );.    
22070 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e    assert( pSub->
22080 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70  pEList->nExpr==p
22090 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  Sub1->pEList->nE
220a0 78 70 72 20 29 3b 0a 20 20 20 20 20 20 69 66 28  xpr );.      if(
220b0 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67   (pSub1->selFlag
220c0 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
220d0 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 21  |SF_Aggregate))!
220e0 3d 30 20 20 20 20 2f 2a 20 28 31 37 62 29 20 2a  =0    /* (17b) *
220f0 2f 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75  /.       || (pSu
22100 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53  b1->pPrior && pS
22110 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  ub1->op!=TK_ALL)
22120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22130 20 2f 2a 20 28 31 37 61 29 20 2a 2f 0a 20 20 20   /* (17a) */.   
22140 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53      || pSub1->pS
22150 72 63 2d 3e 6e 53 72 63 3c 31 20 20 20 20 20 20  rc->nSrc<1      
22160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
22180 31 37 63 29 20 2a 2f 0a 20 20 20 20 20 20 29 7b  17c) */.      ){
22190 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
221a0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
221b0 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62 31   testcase( pSub1
221c0 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29  ->pSrc->nSrc>1 )
221d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
221e0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 38 29  Restriction (18)
221f0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
22200 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
22210 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
22220 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e  for(ii=0; ii<p->
22230 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
22240 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
22250 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  if( p->pOrderBy-
22260 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  >a[ii].u.x.iOrde
22270 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75  rByCol==0 ) retu
22280 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
22290 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78    }.  }..  /* Ex
222a0 2d 72 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33  -restriction (23
222b0 29 3a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 6c 79  ):.  ** The only
222c0 20 77 61 79 20 74 68 61 74 20 74 68 65 20 72 65   way that the re
222d0 63 75 72 73 69 76 65 20 70 61 72 74 20 6f 66 20  cursive part of 
222e0 61 20 43 54 45 20 63 61 6e 20 63 6f 6e 74 61 69  a CTE can contai
222f0 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 0a 20 20 2a  n a compound.  *
22300 2a 20 73 75 62 71 75 65 72 79 20 69 73 20 66 6f  * subquery is fo
22310 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74  r the subquery t
22320 6f 20 62 65 20 6f 6e 65 20 74 65 72 6d 20 6f 66  o be one term of
22330 20 61 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66   a join.  But if
22340 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
22350 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 74 68  ry is a join, th
22360 65 6e 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e  en the flattenin
22370 67 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  g has already be
22380 65 6e 20 73 74 6f 70 70 65 64 20 62 79 0a 20 20  en stopped by.  
22390 2a 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28  ** restriction (
223a0 31 37 64 33 29 0a 20 20 2a 2f 0a 20 20 61 73 73  17d3).  */.  ass
223b0 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
223c0 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
223d0 29 3d 3d 30 20 7c 7c 20 70 53 75 62 2d 3e 70 50  )==0 || pSub->pP
223e0 72 69 6f 72 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  rior==0 );..  /*
223f0 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68  **** If we reach
22400 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61   this point, fla
22410 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
22420 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53  tted. *****/.  S
22430 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61  ELECTTRACE(1,pPa
22440 72 73 65 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20  rse,p,("flatten 
22450 25 75 2e 25 70 20 66 72 6f 6d 20 74 65 72 6d 20  %u.%p from term 
22460 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
22470 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
22480 73 65 6c 49 64 2c 20 70 53 75 62 2c 20 69 46 72  selId, pSub, iFr
22490 6f 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 68  om));..  /* Auth
224a0 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71 75 65  orize the subque
224b0 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e  ry */.  pParse->
224c0 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  zAuthContext = p
224d0 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a  Subitem->zName;.
224e0 20 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20    TESTONLY(i =) 
224f0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
22500 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
22510 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
22520 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 3d  ;.  testcase( i=
22530 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a  =SQLITE_DENY );.
22540 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
22550 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41  ontext = zSavedA
22560 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f  uthContext;..  /
22570 2a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  * If the sub-que
22580 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
22590 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
225a0 74 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73 74  t, then (by rest
225b0 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37  rictions.  ** 17
225c0 20 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69   and 18 above) i
225d0 74 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f  t must be a UNIO
225e0 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61  N ALL and the pa
225f0 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20  rent query must 
22600 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20  .  ** be of the 
22610 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  form:.  **.  ** 
22620 20 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72      SELECT <expr
22630 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75  -list> FROM (<su
22640 62 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65  b-query>) <where
22650 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20  -clause> .  **. 
22660 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20   ** followed by 
22670 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49  any ORDER BY, LI
22680 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45  MIT and/or OFFSE
22690 54 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20  T clauses. This 
226a0 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74  block.  ** creat
226b0 65 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66  es N-1 copies of
226c0 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
226d0 79 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52  y without any OR
226e0 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72  DER BY, LIMIT or
226f0 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c   .  ** OFFSET cl
22700 61 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20  auses and joins 
22710 74 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74  them to the left
22720 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68  -hand-side of th
22730 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  e original.  ** 
22740 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20  using UNION ALL 
22750 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68  operators. In th
22760 69 73 20 63 61 73 65 20 4e 20 69 73 20 74 68 65  is case N is the
22770 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c   number of simpl
22780 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74  e.  ** select st
22790 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  atements in the 
227a0 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65  compound sub-que
227b0 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  ry..  **.  ** Ex
227c0 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
227d0 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20       SELECT a+1 
227e0 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20  FROM (.  **     
227f0 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
22800 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20   tab.  **       
22810 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
22820 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 79 20         SELECT y 
22830 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20  FROM tab.  **   
22840 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
22850 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43   **        SELEC
22860 54 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20  T abs(z*2) FROM 
22870 74 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20  tab2.  **     ) 
22880 57 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52  WHERE a!=5 ORDER
22890 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20   BY 1.  **.  ** 
228a0 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  Transformed into
228b0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
228c0 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20  SELECT x+1 FROM 
228d0 74 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35  tab WHERE x+1!=5
228e0 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20  .  **     UNION 
228f0 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c  ALL.  **     SEL
22900 45 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62  ECT y+1 FROM tab
22910 20 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20   WHERE y+1!=5.  
22920 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c  **     UNION ALL
22930 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
22940 20 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d   abs(z*2)+1 FROM
22950 20 74 61 62 32 20 57 48 45 52 45 20 61 62 73 28   tab2 WHERE abs(
22960 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  z*2)+1!=5.  **  
22970 20 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20     ORDER BY 1.  
22980 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20  **.  ** We call 
22990 74 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75  this the "compou
229a0 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74  nd-subquery flat
229b0 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20  tening"..  */.  
229c0 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70  for(pSub=pSub->p
229d0 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75  Prior; pSub; pSu
229e0 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b  b=pSub->pPrior){
229f0 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  .    Select *pNe
22a00 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  w;.    ExprList 
22a10 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  *pOrderBy = p->p
22a20 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70  OrderBy;.    Exp
22a30 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  r *pLimit = p->p
22a40 4c 69 6d 69 74 3b 0a 20 20 20 20 53 65 6c 65 63  Limit;.    Selec
22a50 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  t *pPrior = p->p
22a60 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f  Prior;.    p->pO
22a70 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
22a80 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20  p->pSrc = 0;.   
22a90 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
22aa0 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
22ab0 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  0;.    pNew = sq
22ac0 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
22ad0 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 70 2d  b, p, 0);.    p-
22ae0 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
22af0 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
22b00 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
22b10 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63    p->pSrc = pSrc
22b20 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  ;.    p->op = TK
22b30 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70 4e  _ALL;.    if( pN
22b40 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ew==0 ){.      p
22b50 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
22b60 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
22b70 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72      pNew->pPrior
22b80 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
22b90 20 69 66 28 20 70 50 72 69 6f 72 20 29 20 70 50   if( pPrior ) pP
22ba0 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e  rior->pNext = pN
22bb0 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ew;.      pNew->
22bc0 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  pNext = p;.     
22bd0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65   p->pPrior = pNe
22be0 77 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54  w;.      SELECTT
22bf0 52 41 43 45 28 32 2c 70 50 61 72 73 65 2c 70 2c  RACE(2,pParse,p,
22c00 28 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75  ("compound-subqu
22c10 65 72 79 20 66 6c 61 74 74 65 6e 65 72 22 0a 20  ery flattener". 
22c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c30 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 63               " c
22c40 72 65 61 74 65 73 20 25 75 20 61 73 20 70 65 65  reates %u as pee
22c50 72 5c 6e 22 2c 70 4e 65 77 2d 3e 73 65 6c 49 64  r\n",pNew->selId
22c60 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ));.    }.    if
22c70 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
22c80 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ed ) return 1;. 
22c90 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66   }..  /* Begin f
22ca0 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46  lattening the iF
22cb0 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20  rom-th entry of 
22cc0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
22cd0 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74  .  ** in the out
22ce0 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  er query..  */. 
22cf0 20 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20   pSub = pSub1 = 
22d00 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
22d10 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  t;..  /* Delete 
22d20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61  the transient ta
22d30 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 73  ble structure as
22d40 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
22d50 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a  e.  ** subquery.
22d60 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62    */.  sqlite3Db
22d70 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
22d80 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
22d90 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
22da0 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61  b, pSubitem->zNa
22db0 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
22dc0 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
22dd0 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53  m->zAlias);.  pS
22de0 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
22df0 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65  e = 0;.  pSubite
22e00 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  m->zName = 0;.  
22e10 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73  pSubitem->zAlias
22e20 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
22e30 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a  ->pSelect = 0;..
22e40 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74    /* Defer delet
22e50 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62  ing the Table ob
22e60 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20  ject associated 
22e70 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75  with the.  ** su
22e80 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64  bquery until cod
22e90 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a  e generation is.
22ea0 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73    ** complete, s
22eb0 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20 73  ince there may s
22ec0 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e  till exist Expr.
22ed0 70 54 61 62 20 65 6e 74 72 69 65 73 20 74 68 61  pTab entries tha
22ee0 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20  t.  ** refer to 
22ef0 74 68 65 20 73 75 62 71 75 65 72 79 20 65 76 65  the subquery eve
22f00 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69  n after flatteni
22f10 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34  ng.  Ticket #334
22f20 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75  6..  **.  ** pSu
22f30 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61  bitem->pTab is a
22f40 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62  lways non-NULL b
22f50 79 20 74 65 73 74 20 72 65 73 74 72 69 63 74 69  y test restricti
22f60 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61 62  ons and tests ab
22f70 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ove..  */.  if( 
22f80 41 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d  ALWAYS(pSubitem-
22f90 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20  >pTab!=0) ){.   
22fa0 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65   Table *pTabToDe
22fb0 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54  l = pSubitem->pT
22fc0 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ab;.    if( pTab
22fd0 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 3d 3d  ToDel->nTabRef==
22fe0 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65  1 ){.      Parse
22ff0 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
23000 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
23010 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
23020 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65    pTabToDel->pNe
23030 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c  xtZombie = pTopl
23040 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62  evel->pZombieTab
23050 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65  ;.      pTopleve
23060 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20  l->pZombieTab = 
23070 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d  pTabToDel;.    }
23080 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62  else{.      pTab
23090 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 2d 2d  ToDel->nTabRef--
230a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62  ;.    }.    pSub
230b0 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  item->pTab = 0;.
230c0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
230d0 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e  llowing loop run
230e0 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  s once for each 
230f0 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75  term in a compou
23100 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a  nd-subquery.  **
23110 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20   flattening (as 
23120 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29  described above)
23130 2e 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  .  If we are doi
23140 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b  ng a different k
23150 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74  ind.  ** of flat
23160 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74  tening - a flatt
23170 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  ening other than
23180 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   a compound-subq
23190 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20  uery flattening 
231a0 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73  -.  ** then this
231b0 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20   loop only runs 
231c0 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  once..  **.  ** 
231d0 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20  This loop moves 
231e0 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  all of the FROM 
231f0 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
23200 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
23210 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  e.  ** the FROM 
23220 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
23230 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f  ter query.  Befo
23240 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72  re doing this, r
23250 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65  emember.  ** the
23260 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
23270 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
23280 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d  outer query FROM
23290 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a   element in.  **
232a0 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69   iParent.  The i
232b0 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69  Parent cursor wi
232c0 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
232d0 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f  .  Subsequent co
232e0 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61  de.  ** will sca
232f0 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f  n expressions lo
23300 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e  oking for iParen
23310 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  t references and
23320 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68   replace.  ** th
23330 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77  ose references w
23340 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ith expressions 
23350 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20  that resolve to 
23360 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f  the subquery FRO
23370 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20  M.  ** elements 
23380 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69  we are now copyi
23390 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ng in..  */.  fo
233a0 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61  r(pParent=p; pPa
233b0 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50  rent; pParent=pP
233c0 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70  arent->pPrior, p
233d0 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
233e0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53  ){.    int nSubS
233f0 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74  rc;.    u8 joint
23400 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75  ype = 0;.    pSu
23410 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72  bSrc = pSub->pSr
23420 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  c;     /* FROM c
23430 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72  lause of subquer
23440 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63  y */.    nSubSrc
23450 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63   = pSubSrc->nSrc
23460 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
23470 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72  terms in subquer
23480 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  y FROM clause */
23490 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72  .    pSrc = pPar
234a0 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f  ent->pSrc;     /
234b0 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
234c0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
234d0 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72   */..    if( pSr
234e0 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
234f0 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b  t( pParent==p );
23500 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20    /* First time 
23510 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70  through the loop
23520 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79   */.      jointy
23530 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 66  pe = pSubitem->f
23540 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  g.jointype;.    
23550 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
23560 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20  ert( pParent!=p 
23570 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73  );  /* 2nd and s
23580 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20  ubsequent times 
23590 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70  through the loop
235a0 20 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d   */.      pSrc =
235b0 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d   pParent->pSrc =
235c0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
235d0 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20  ppend(db, 0, 0, 
235e0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  0);.      if( pS
235f0 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc==0 ){.       
23600 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
23610 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
23620 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23630 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
23640 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75  * The subquery u
23650 73 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f  ses a single slo
23660 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
23670 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
23680 72 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20  r.    ** query. 
23690 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
236a0 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
236b0 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74  ne element in it
236c0 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20  s FROM clause,. 
236d0 20 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e     ** then expan
236e0 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
236f0 79 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20  y to make space 
23700 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61  for it to hold a
23710 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20  ll elements.    
23720 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
23730 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ry..    **.    *
23740 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
23750 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45  *.    **    SELE
23760 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20  CT * FROM tabA, 
23770 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73  (SELECT * FROM s
23780 75 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42  ub1, sub2), tabB
23790 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
237a0 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
237b0 68 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69  has 3 slots in i
237c0 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  ts FROM clause. 
237d0 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65   One slot of the
237e0 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
237f0 65 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20  ery (the middle 
23800 73 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79  slot) is used by
23810 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
23820 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20  The next.    ** 
23830 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69  block of code wi
23840 6c 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75  ll expand the ou
23850 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 63  ter query FROM c
23860 6c 61 75 73 65 20 74 6f 20 34 20 73 6c 6f 74 73  lause to 4 slots
23870 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6d 69 64  ..    ** The mid
23880 64 6c 65 20 73 6c 6f 74 20 69 73 20 65 78 70 61  dle slot is expa
23890 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74  nded to two slot
238a0 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61  s in order to ma
238b0 6b 65 20 73 70 61 63 65 0a 20 20 20 20 2a 2a 20  ke space.    ** 
238c0 66 6f 72 20 74 68 65 20 74 77 6f 20 65 6c 65 6d  for the two elem
238d0 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ents in the FROM
238e0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
238f0 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  ubquery..    */.
23900 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e      if( nSubSrc>
23910 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65  1 ){.      pPare
23920 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20  nt->pSrc = pSrc 
23930 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
23940 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63  Enlarge(db, pSrc
23950 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f  , nSubSrc-1,iFro
23960 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  m+1);.      if( 
23970 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
23980 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
23990 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
239a0 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65  ..    /* Transfe
239b0 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  r the FROM claus
239c0 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65  e terms from the
239d0 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74   subquery into t
239e0 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
239f0 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  query..    */.  
23a00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75    for(i=0; i<nSu
23a10 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bSrc; i++){.    
23a20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
23a30 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e  elete(db, pSrc->
23a40 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e  a[i+iFrom].pUsin
23a50 67 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  g);.      assert
23a60 28 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f  ( pSrc->a[i+iFro
23a70 6d 5d 2e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d  m].fg.isTabFunc=
23a80 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 53 72 63  =0 );.      pSrc
23a90 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
23aa0 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
23ab0 20 20 20 20 69 4e 65 77 50 61 72 65 6e 74 20 3d      iNewParent =
23ac0 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2e 69   pSubSrc->a[i].i
23ad0 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 6d 65  Cursor;.      me
23ae0 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61  mset(&pSubSrc->a
23af0 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  [i], 0, sizeof(p
23b00 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a  SubSrc->a[i]));.
23b10 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e      }.    pSrc->
23b20 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e  a[iFrom].fg.join
23b30 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b  type = jointype;
23b40 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62  .  .    /* Now b
23b50 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e  egin substitutin
23b60 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  g subquery resul
23b70 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t set expression
23b80 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65  s for .    ** re
23b90 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
23ba0 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f  iParent in the o
23bb0 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20  uter query..    
23bc0 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70  ** .    ** Examp
23bd0 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
23be0 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20  *   SELECT a+5, 
23bf0 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43  b*10 FROM (SELEC
23c00 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30  T x*3 AS a, y+10
23c10 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57   AS b FROM t1) W
23c20 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a  HERE a>b;.    **
23c30 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
23c40 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
23c50 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
23c60 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20   __________/    
23c70 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20        /.    **  
23c80 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
23c90 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71  ________ outer q
23ca0 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  uery ___________
23cb0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23cc0 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ___/.    **.    
23cd0 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76  ** We look at ev
23ce0 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
23cf0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
23d00 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  y and every plac
23d10 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20  e we see.    ** 
23d20 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "a" we substitut
23d30 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72  e "x*3" and ever
23d40 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22  y place we see "
23d50 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  b" we substitute
23d60 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a   "y+10"..    */.
23d70 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f      if( pSub->pO
23d80 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
23d90 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
23da0 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69  , any non-zero i
23db0 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65  OrderByCol value
23dc0 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
23dd0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44  the.      ** ORD
23de0 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70  ER BY column exp
23df0 72 65 73 73 69 6f 6e 20 69 73 20 69 64 65 6e 74  ression is ident
23e00 69 63 61 6c 20 74 6f 20 74 68 65 20 69 4f 72 64  ical to the iOrd
23e10 65 72 42 79 43 6f 6c 27 74 68 0a 20 20 20 20 20  erByCol'th.     
23e20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 72   ** expression r
23e30 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43  eturned by SELEC
23e40 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53 75 62  T statement pSub
23e50 2e 20 53 69 6e 63 65 20 74 68 65 73 65 20 76 61  . Since these va
23e60 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f  lues.      ** do
23e70 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
23e80 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 63   correspond to c
23e90 6f 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54  olumns in SELECT
23ea0 20 73 74 61 74 65 6d 65 6e 74 20 70 50 61 72 65   statement pPare
23eb0 6e 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72  nt,.      ** zer
23ec0 6f 20 74 68 65 6d 20 62 65 66 6f 72 65 20 74 72  o them before tr
23ed0 61 6e 73 66 65 72 69 6e 67 20 74 68 65 20 4f 52  ansfering the OR
23ee0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  DER BY clause.. 
23ef0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
23f00 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69 73 20   Not doing this 
23f10 6d 61 79 20 63 61 75 73 65 20 61 6e 20 65 72 72  may cause an err
23f20 6f 72 20 69 66 20 61 20 73 75 62 73 65 71 75 65  or if a subseque
23f30 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a  nt call to this.
23f40 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
23f50 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c  n attempts to fl
23f60 61 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  atten a compound
23f70 20 73 75 62 2d 71 75 65 72 79 20 69 6e 74 6f 20   sub-query into 
23f80 70 50 61 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a  pParent.      **
23f90 20 28 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74   (the only way t
23fa0 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 69  his can happen i
23fb0 73 20 69 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  s if the compoun
23fc0 64 20 73 75 62 2d 71 75 65 72 79 20 69 73 0a 20  d sub-query is. 
23fd0 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c       ** currentl
23fe0 79 20 70 61 72 74 20 6f 66 20 70 53 75 62 2d 3e  y part of pSub->
23ff0 70 53 72 63 29 2e 20 53 65 65 20 74 69 63 6b 65  pSrc). See ticke
24000 74 20 5b 64 31 31 61 36 65 39 30 38 66 5d 2e 20  t [d11a6e908f]. 
24010 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69   */.      ExprLi
24020 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
24030 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  Sub->pOrderBy;. 
24040 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
24050 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
24060 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
24070 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e  OrderBy->a[i].u.
24080 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20  x.iOrderByCol = 
24090 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
240a0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
240b0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
240c0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
240d0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
240e0 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d  rBy;.      pSub-
240f0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
24100 20 20 20 7d 0a 20 20 20 20 70 57 68 65 72 65 20     }.    pWhere 
24110 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
24120 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72  (db, pSub->pWher
24130 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 69  e, 0);.    if( i
24140 73 4c 65 66 74 4a 6f 69 6e 3e 30 20 29 7b 0a 20  sLeftJoin>0 ){. 
24150 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72       setJoinExpr
24160 28 70 57 68 65 72 65 2c 20 69 4e 65 77 50 61 72  (pWhere, iNewPar
24170 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ent);.    }.    
24180 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20  pParent->pWhere 
24190 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
241a0 28 64 62 2c 20 70 57 68 65 72 65 2c 20 70 50 61  (db, pWhere, pPa
241b0 72 65 6e 74 2d 3e 70 57 68 65 72 65 29 3b 0a 20  rent->pWhere);. 
241c0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
241d0 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20  cFailed==0 ){.  
241e0 20 20 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74      SubstContext
241f0 20 78 3b 0a 20 20 20 20 20 20 78 2e 70 50 61 72   x;.      x.pPar
24200 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20  se = pParse;.   
24210 20 20 20 78 2e 69 54 61 62 6c 65 20 3d 20 69 50     x.iTable = iP
24220 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e 69  arent;.      x.i
24230 4e 65 77 54 61 62 6c 65 20 3d 20 69 4e 65 77 50  NewTable = iNewP
24240 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e 69  arent;.      x.i
24250 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 69 73 4c 65  sLeftJoin = isLe
24260 66 74 4a 6f 69 6e 3b 0a 20 20 20 20 20 20 78 2e  ftJoin;.      x.
24270 70 45 4c 69 73 74 20 3d 20 70 53 75 62 2d 3e 70  pEList = pSub->p
24280 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 75 62  EList;.      sub
24290 73 74 53 65 6c 65 63 74 28 26 78 2c 20 70 50 61  stSelect(&x, pPa
242a0 72 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  rent, 0);.    }.
242b0 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c    .    /* The fl
242c0 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73  attened query is
242d0 20 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74   distinct if eit
242e0 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72  her the inner or
242f0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
24300 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  r query is disti
24310 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nct. .    */.   
24320 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61   pParent->selFla
24330 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46  gs |= pSub->selF
24340 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
24350 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20  ct;.  .    /*.  
24360 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20    ** SELECT ... 
24370 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e  FROM (SELECT ...
24380 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20   LIMIT a OFFSET 
24390 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45  b) LIMIT x OFFSE
243a0 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  T y;.    **.    
243b0 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65  ** One is tempte
243c0 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20  d to try to add 
243d0 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69  a and b to combi
243e0 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20  ne the limits.  
243f0 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  But this.    ** 
24400 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66  does not work if
24410 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73   either limit is
24420 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a   negative..    *
24430 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  /.    if( pSub->
24440 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  pLimit ){.      
24450 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20  pParent->pLimit 
24460 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a  = pSub->pLimit;.
24470 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d        pSub->pLim
24480 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  it = 0;.    }.  
24490 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79  }..  /* Finially
244a0 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73  , delete what is
244b0 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62   left of the sub
244c0 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e  query and return
244d0 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20  .  ** success.. 
244e0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c   */.  sqlite3Sel
244f0 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
24500 75 62 31 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43  ub1);..#if SELEC
24510 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
24520 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
24530 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20  ctTrace & 0x100 
24540 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41  ){.    SELECTTRA
24550 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c  CE(0x100,pParse,
24560 70 2c 28 22 41 66 74 65 72 20 66 6c 61 74 74 65  p,("After flatte
24570 6e 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  ning:\n"));.    
24580 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
24590 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
245a0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
245b0 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
245c0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
245d0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
245e0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
245f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
24600 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72   */../*.** A str
24610 75 63 74 75 72 65 20 74 6f 20 6b 65 65 70 20 74  ucture to keep t
24620 72 61 63 6b 20 6f 66 20 61 6c 6c 20 6f 66 20 74  rack of all of t
24630 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73  he column values
24640 20 74 68 61 74 20 61 72 65 20 66 69 78 65 64 20   that are fixed 
24650 74 6f 0a 2a 2a 20 61 20 6b 6e 6f 77 6e 20 76 61  to.** a known va
24660 6c 75 65 20 64 75 65 20 74 6f 20 57 48 45 52 45  lue due to WHERE
24670 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
24680 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  nts of the form 
24690 43 4f 4c 55 4d 4e 3d 56 41 4c 55 45 2e 0a 2a 2f  COLUMN=VALUE..*/
246a0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
246b0 57 68 65 72 65 43 6f 6e 73 74 20 57 68 65 72 65  WhereConst Where
246c0 43 6f 6e 73 74 3b 0a 73 74 72 75 63 74 20 57 68  Const;.struct Wh
246d0 65 72 65 43 6f 6e 73 74 20 7b 0a 20 20 50 61 72  ereConst {.  Par
246e0 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 2f 2a  se *pParse;   /*
246f0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
24700 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74   */.  int nConst
24710 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
24720 20 66 6f 72 20 43 4f 4c 55 4d 4e 3d 43 4f 4e 53   for COLUMN=CONS
24730 54 41 4e 54 20 74 65 72 6d 73 20 2a 2f 0a 20 20  TANT terms */.  
24740 69 6e 74 20 6e 43 68 6e 67 3b 20 20 20 20 20 20  int nChng;      
24750 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69   /* Number of ti
24760 6d 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69  mes a constant i
24770 73 20 70 72 6f 70 61 67 61 74 65 64 20 2a 2f 0a  s propagated */.
24780 20 20 45 78 70 72 20 2a 2a 61 70 45 78 70 72 3b    Expr **apExpr;
24790 20 20 20 2f 2a 20 5b 69 2a 32 5d 20 69 73 20 43     /* [i*2] is C
247a0 4f 4c 55 4d 4e 20 61 6e 64 20 5b 69 2a 32 2b 31  OLUMN and [i*2+1
247b0 5d 20 69 73 20 56 41 4c 55 45 20 2a 2f 0a 7d 3b  ] is VALUE */.};
247c0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
247d0 77 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70  w entry to the p
247e0 43 6f 6e 73 74 20 6f 62 6a 65 63 74 2e 20 20 45  Const object.  E
247f0 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 61 64  xcept, do not ad
24800 64 20 64 75 70 6c 69 63 61 74 65 0a 2a 2a 20 70  d duplicate.** p
24810 43 6f 6c 75 6d 6e 20 65 6e 74 69 72 65 73 2e 0a  Column entires..
24820 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
24830 6f 6e 73 74 49 6e 73 65 72 74 28 0a 20 20 57 68  onstInsert(.  Wh
24840 65 72 65 43 6f 6e 73 74 20 2a 70 43 6f 6e 73 74  ereConst *pConst
24850 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  ,      /* The Wh
24860 65 72 65 43 6f 6e 73 74 20 69 6e 74 6f 20 77 68  ereConst into wh
24870 69 63 68 20 77 65 20 61 72 65 20 69 6e 73 65 72  ich we are inser
24880 74 69 6e 67 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ting */.  Expr *
24890 70 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  pColumn,        
248a0 20 20 20 2f 2a 20 54 68 65 20 43 4f 4c 55 4d 4e     /* The COLUMN
248b0 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6e   part of the con
248c0 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 45 78 70  straint */.  Exp
248d0 72 20 2a 70 56 61 6c 75 65 20 20 20 20 20 20 20  r *pValue       
248e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 41 4c        /* The VAL
248f0 55 45 20 70 61 72 74 20 6f 66 20 74 68 65 20 63  UE part of the c
24900 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a  onstraint */.){.
24910 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
24920 74 28 20 70 43 6f 6c 75 6d 6e 2d 3e 6f 70 3d 3d  t( pColumn->op==
24930 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 0a 20 20  TK_COLUMN );..  
24940 2f 2a 20 32 30 31 38 2d 31 30 2d 32 35 20 74 69  /* 2018-10-25 ti
24950 63 6b 65 74 20 5b 63 66 35 65 64 32 30 66 5d 0a  cket [cf5ed20f].
24960 20 20 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    ** Make sure t
24970 68 65 20 73 61 6d 65 20 70 43 6f 6c 75 6d 6e 20  he same pColumn 
24980 69 73 20 6e 6f 74 20 69 6e 73 65 72 74 65 64 20  is not inserted 
24990 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 2a  more than once *
249a0 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
249b0 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 3b 20 69  Const->nConst; i
249c0 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 45  ++){.    const E
249d0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 43 6f  xpr *pExpr = pCo
249e0 6e 73 74 2d 3e 61 70 45 78 70 72 5b 69 2a 32 5d  nst->apExpr[i*2]
249f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
24a00 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
24a10 4d 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45  MN );.    if( pE
24a20 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 43 6f  xpr->iTable==pCo
24a30 6c 75 6d 6e 2d 3e 69 54 61 62 6c 65 0a 20 20 20  lumn->iTable.   
24a40 20 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c    && pExpr->iCol
24a50 75 6d 6e 3d 3d 70 43 6f 6c 75 6d 6e 2d 3e 69 43  umn==pColumn->iC
24a60 6f 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a 20 20 20  olumn.    ){.   
24a70 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 41     return;  /* A
24a80 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2e 20  lready present. 
24a90 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
24aa0 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
24ab0 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  */.    }.  }..  
24ac0 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2b 2b  pConst->nConst++
24ad0 3b 0a 20 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78  ;.  pConst->apEx
24ae0 70 72 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  pr = sqlite3DbRe
24af0 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 43 6f 6e  allocOrFree(pCon
24b00 73 74 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20  st->pParse->db, 
24b10 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 2c 0a  pConst->apExpr,.
24b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b30 20 20 20 20 20 20 20 20 20 70 43 6f 6e 73 74 2d           pConst-
24b40 3e 6e 43 6f 6e 73 74 2a 32 2a 73 69 7a 65 6f 66  >nConst*2*sizeof
24b50 28 45 78 70 72 2a 29 29 3b 0a 20 20 69 66 28 20  (Expr*));.  if( 
24b60 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 3d 3d  pConst->apExpr==
24b70 30 20 29 7b 0a 20 20 20 20 70 43 6f 6e 73 74 2d  0 ){.    pConst-
24b80 3e 6e 43 6f 6e 73 74 20 3d 20 30 3b 0a 20 20 7d  >nConst = 0;.  }
24b90 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 45 78  else{.    if( Ex
24ba0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 56  prHasProperty(pV
24bb0 61 6c 75 65 2c 20 45 50 5f 46 69 78 65 64 43 6f  alue, EP_FixedCo
24bc0 6c 29 20 29 20 70 56 61 6c 75 65 20 3d 20 70 56  l) ) pValue = pV
24bd0 61 6c 75 65 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  alue->pLeft;.   
24be0 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b   pConst->apExpr[
24bf0 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2a 32  pConst->nConst*2
24c00 2d 32 5d 20 3d 20 70 43 6f 6c 75 6d 6e 3b 0a 20  -2] = pColumn;. 
24c10 20 20 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70     pConst->apExp
24c20 72 5b 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74  r[pConst->nConst
24c30 2a 32 2d 31 5d 20 3d 20 70 56 61 6c 75 65 3b 0a  *2-1] = pValue;.
24c40 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e    }.}../*.** Fin
24c50 64 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 43  d all terms of C
24c60 4f 4c 55 4d 4e 3d 56 41 4c 55 45 20 6f 72 20 56  OLUMN=VALUE or V
24c70 41 4c 55 45 3d 43 4f 4c 55 4d 4e 20 69 6e 20 70  ALUE=COLUMN in p
24c80 45 78 70 72 20 77 68 65 72 65 20 56 41 4c 55 45  Expr where VALUE
24c90 0a 2a 2a 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  .** is a constan
24ca0 74 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  t expression and
24cb0 20 77 68 65 72 65 20 74 68 65 20 74 65 72 6d 20   where the term 
24cc0 6d 75 73 74 20 62 65 20 74 72 75 65 20 62 65 63  must be true bec
24cd0 61 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 70 61  ause it.** is pa
24ce0 72 74 20 6f 66 20 74 68 65 20 41 4e 44 2d 63 6f  rt of the AND-co
24cf0 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20 6f 66  nnected terms of
24d00 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
24d10 20 20 46 6f 72 20 65 61 63 68 20 74 65 72 6d 0a    For each term.
24d20 2a 2a 20 66 6f 75 6e 64 2c 20 61 64 64 20 69 74  ** found, add it
24d30 20 74 6f 20 74 68 65 20 70 43 6f 6e 73 74 20 73   to the pConst s
24d40 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
24d50 74 69 63 20 76 6f 69 64 20 66 69 6e 64 43 6f 6e  tic void findCon
24d60 73 74 49 6e 57 68 65 72 65 28 57 68 65 72 65 43  stInWhere(WhereC
24d70 6f 6e 73 74 20 2a 70 43 6f 6e 73 74 2c 20 45 78  onst *pConst, Ex
24d80 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 45 78  pr *pExpr){.  Ex
24d90 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65  pr *pRight, *pLe
24da0 66 74 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d  ft;.  if( pExpr=
24db0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
24dc0 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
24dd0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
24de0 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 3b  mJoin) ) return;
24df0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
24e00 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20  ==TK_AND ){.    
24e10 66 69 6e 64 43 6f 6e 73 74 49 6e 57 68 65 72 65  findConstInWhere
24e20 28 70 43 6f 6e 73 74 2c 20 70 45 78 70 72 2d 3e  (pConst, pExpr->
24e30 70 52 69 67 68 74 29 3b 0a 20 20 20 20 66 69 6e  pRight);.    fin
24e40 64 43 6f 6e 73 74 49 6e 57 68 65 72 65 28 70 43  dConstInWhere(pC
24e50 6f 6e 73 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  onst, pExpr->pLe
24e60 66 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ft);.    return;
24e70 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72  .  }.  if( pExpr
24e80 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 29 20 72 65  ->op!=TK_EQ ) re
24e90 74 75 72 6e 3b 0a 20 20 70 52 69 67 68 74 20 3d  turn;.  pRight =
24ea0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a   pExpr->pRight;.
24eb0 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d    pLeft = pExpr-
24ec0 3e 70 4c 65 66 74 3b 0a 20 20 61 73 73 65 72 74  >pLeft;.  assert
24ed0 28 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20  ( pRight!=0 );. 
24ee0 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d   assert( pLeft!=
24ef0 30 20 29 3b 0a 20 20 69 66 28 20 70 52 69 67 68  0 );.  if( pRigh
24f00 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
24f10 0a 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50  .   && !ExprHasP
24f20 72 6f 70 65 72 74 79 28 70 52 69 67 68 74 2c 20  roperty(pRight, 
24f30 45 50 5f 46 69 78 65 64 43 6f 6c 29 0a 20 20 20  EP_FixedCol).   
24f40 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
24f50 43 6f 6e 73 74 61 6e 74 28 70 4c 65 66 74 29 0a  Constant(pLeft).
24f60 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 42     && sqlite3IsB
24f70 69 6e 61 72 79 28 73 71 6c 69 74 65 33 42 69 6e  inary(sqlite3Bin
24f80 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
24f90 71 28 70 43 6f 6e 73 74 2d 3e 70 50 61 72 73 65  q(pConst->pParse
24fa0 2c 70 4c 65 66 74 2c 70 52 69 67 68 74 29 29 0a  ,pLeft,pRight)).
24fb0 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 49 6e    ){.    constIn
24fc0 73 65 72 74 28 70 43 6f 6e 73 74 2c 20 70 52 69  sert(pConst, pRi
24fd0 67 68 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d  ght, pLeft);.  }
24fe0 65 6c 73 65 0a 20 20 69 66 28 20 70 4c 65 66 74  else.  if( pLeft
24ff0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
25000 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72     && !ExprHasPr
25010 6f 70 65 72 74 79 28 70 4c 65 66 74 2c 20 45 50  operty(pLeft, EP
25020 5f 46 69 78 65 64 43 6f 6c 29 0a 20 20 20 26 26  _FixedCol).   &&
25030 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
25040 6e 73 74 61 6e 74 28 70 52 69 67 68 74 29 0a 20  nstant(pRight). 
25050 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 42 69    && sqlite3IsBi
25060 6e 61 72 79 28 73 71 6c 69 74 65 33 42 69 6e 61  nary(sqlite3Bina
25070 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
25080 28 70 43 6f 6e 73 74 2d 3e 70 50 61 72 73 65 2c  (pConst->pParse,
25090 70 4c 65 66 74 2c 70 52 69 67 68 74 29 29 0a 20  pLeft,pRight)). 
250a0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 49 6e 73   ){.    constIns
250b0 65 72 74 28 70 43 6f 6e 73 74 2c 20 70 4c 65 66  ert(pConst, pLef
250c0 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  t, pRight);.  }.
250d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
250e0 20 61 20 57 61 6c 6b 65 72 20 65 78 70 72 65 73   a Walker expres
250f0 73 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 2e 20 20  sion callback.  
25100 70 45 78 70 72 20 69 73 20 61 20 63 61 6e 64 69  pExpr is a candi
25110 64 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 0a  date expression.
25120 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65  ** to be replace
25130 64 20 62 79 20 61 20 76 61 6c 75 65 2e 20 20 49  d by a value.  I
25140 66 20 70 45 78 70 72 20 69 73 20 65 71 75 69 76  f pExpr is equiv
25150 61 6c 65 6e 74 20 74 6f 20 6f 6e 65 20 6f 66 20  alent to one of 
25160 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6e  the.** columns n
25170 61 6d 65 64 20 69 6e 20 70 57 61 6c 6b 65 72 2d  amed in pWalker-
25180 3e 75 2e 70 43 6f 6e 73 74 2c 20 74 68 65 6e 20  >u.pConst, then 
25190 6f 76 65 72 77 72 69 74 65 20 69 74 20 77 69 74  overwrite it wit
251a0 68 20 69 74 73 0a 2a 2a 20 63 6f 72 72 65 73 70  h its.** corresp
251b0 6f 6e 64 69 6e 67 20 76 61 6c 75 65 2e 0a 2a 2f  onding value..*/
251c0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 70  .static int prop
251d0 61 67 61 74 65 43 6f 6e 73 74 61 6e 74 45 78 70  agateConstantExp
251e0 72 52 65 77 72 69 74 65 28 57 61 6c 6b 65 72 20  rRewrite(Walker 
251f0 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
25200 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pExpr){.  int i;
25210 0a 20 20 57 68 65 72 65 43 6f 6e 73 74 20 2a 70  .  WhereConst *p
25220 43 6f 6e 73 74 3b 0a 20 20 69 66 28 20 70 45 78  Const;.  if( pEx
25230 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
25240 4e 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  N ) return WRC_C
25250 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28 20 45  ontinue;.  if( E
25260 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
25270 45 78 70 72 2c 20 45 50 5f 46 69 78 65 64 43 6f  Expr, EP_FixedCo
25280 6c 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  l) ) return WRC_
25290 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 70 43 6f 6e  Continue;.  pCon
252a0 73 74 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  st = pWalker->u.
252b0 70 43 6f 6e 73 74 3b 0a 20 20 66 6f 72 28 69 3d  pConst;.  for(i=
252c0 30 3b 20 69 3c 70 43 6f 6e 73 74 2d 3e 6e 43 6f  0; i<pConst->nCo
252d0 6e 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  nst; i++){.    E
252e0 78 70 72 20 2a 70 43 6f 6c 75 6d 6e 20 3d 20 70  xpr *pColumn = p
252f0 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b 69 2a  Const->apExpr[i*
25300 32 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  2];.    if( pCol
25310 75 6d 6e 3d 3d 70 45 78 70 72 20 29 20 63 6f 6e  umn==pExpr ) con
25320 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
25330 43 6f 6c 75 6d 6e 2d 3e 69 54 61 62 6c 65 21 3d  Column->iTable!=
25340 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 20  pExpr->iTable ) 
25350 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
25360 28 20 70 43 6f 6c 75 6d 6e 2d 3e 69 43 6f 6c 75  ( pColumn->iColu
25370 6d 6e 21 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75  mn!=pExpr->iColu
25380 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  mn ) continue;. 
25390 20 20 20 2f 2a 20 41 20 6d 61 74 63 68 20 69 73     /* A match is
253a0 20 66 6f 75 6e 64 2e 20 20 41 64 64 20 74 68 65   found.  Add the
253b0 20 45 50 5f 46 69 78 65 64 43 6f 6c 20 70 72 6f   EP_FixedCol pro
253c0 70 65 72 74 79 20 2a 2f 0a 20 20 20 20 70 43 6f  perty */.    pCo
253d0 6e 73 74 2d 3e 6e 43 68 6e 67 2b 2b 3b 0a 20 20  nst->nChng++;.  
253e0 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65    ExprClearPrope
253f0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4c 65  rty(pExpr, EP_Le
25400 61 66 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74  af);.    ExprSet
25410 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
25420 45 50 5f 46 69 78 65 64 43 6f 6c 29 3b 0a 20 20  EP_FixedCol);.  
25430 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
25440 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20  >pLeft==0 );.   
25450 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
25460 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
25470 43 6f 6e 73 74 2d 3e 70 50 61 72 73 65 2d 3e 64  Const->pParse->d
25480 62 2c 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70  b, pConst->apExp
25490 72 5b 69 2a 32 2b 31 5d 2c 20 30 29 3b 0a 20 20  r[i*2+1], 0);.  
254a0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72    break;.  }.  r
254b0 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
254c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 57 48  .}../*.** The WH
254d0 45 52 45 2d 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE-clause const
254e0 61 6e 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  ant propagation 
254f0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a  optimization..**
25500 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45  .** If the WHERE
25510 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
25520 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   terms of the fo
25530 72 6d 20 43 4f 4c 55 4d 4e 3d 43 4f 4e 53 54 41  rm COLUMN=CONSTA
25540 4e 54 20 6f 72 0a 2a 2a 20 43 4f 4e 53 54 41 4e  NT or.** CONSTAN
25550 54 3d 43 4f 4c 55 4d 4e 20 74 68 61 74 20 6d 75  T=COLUMN that mu
25560 73 74 20 62 65 20 74 72 65 65 20 28 69 6e 20 6f  st be tree (in o
25570 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74  ther words, if t
25580 68 65 20 74 65 72 6d 73 20 74 6f 70 2d 6c 65 76  he terms top-lev
25590 65 6c 0a 2a 2a 20 41 4e 44 2d 63 6f 6e 6e 65 63  el.** AND-connec
255a0 74 65 64 20 74 65 72 6d 73 20 74 68 61 74 20 61  ted terms that a
255b0 72 65 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  re not part of a
255c0 20 4f 4e 20 63 6c 61 75 73 65 20 66 72 6f 6d 20   ON clause from 
255d0 61 20 4c 45 46 54 20 4a 4f 49 4e 29 0a 2a 2a 20  a LEFT JOIN).** 
255e0 74 68 65 6e 20 74 68 72 6f 75 67 68 6f 75 74 20  then throughout 
255f0 74 68 65 20 71 75 65 72 79 20 72 65 70 6c 61 63  the query replac
25600 65 20 61 6c 6c 20 6f 74 68 65 72 20 6f 63 63 75  e all other occu
25610 72 72 65 6e 63 65 73 20 6f 66 20 43 4f 4c 55 4d  rrences of COLUM
25620 4e 0a 2a 2a 20 77 69 74 68 20 43 4f 4e 53 54 41  N.** with CONSTA
25630 4e 54 20 77 69 74 68 69 6e 20 74 68 65 20 57 48  NT within the WH
25640 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ERE clause..**.*
25650 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  * For example, t
25660 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  he query:.**.** 
25670 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
25680 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48  OM t1, t2, t3 WH
25690 45 52 45 20 74 31 2e 61 3d 33 39 20 41 4e 44 20  ERE t1.a=39 AND 
256a0 74 32 2e 62 3d 74 31 2e 61 20 41 4e 44 20 74 33  t2.b=t1.a AND t3
256b0 2e 63 3d 74 32 2e 62 0a 2a 2a 0a 2a 2a 20 49 73  .c=t2.b.**.** Is
256c0 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   transformed int
256d0 6f 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 53 45 4c  o.**.**      SEL
256e0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
256f0 32 2c 20 74 33 20 57 48 45 52 45 20 74 31 2e 61  2, t3 WHERE t1.a
25700 3d 33 39 20 41 4e 44 20 74 32 2e 62 3d 33 39 20  =39 AND t2.b=39 
25710 41 4e 44 20 74 33 2e 63 3d 33 39 0a 2a 2a 0a 2a  AND t3.c=39.**.*
25720 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
25730 20 61 6e 79 20 74 72 61 6e 73 66 6f 72 6d 61 74   any transformat
25740 69 6f 6e 73 20 77 68 65 72 65 20 6d 61 64 65 20  ions where made 
25750 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  and false if not
25760 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ..**.** Implemen
25770 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 43 6f  tation note:  Co
25780 6e 73 74 61 6e 74 20 70 72 6f 70 61 67 61 74 69  nstant propagati
25790 6f 6e 20 69 73 20 74 72 69 63 6b 79 20 64 75 65  on is tricky due
257a0 20 74 6f 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20   to affinity.** 
257b0 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  and collating se
257c0 71 75 65 6e 63 65 20 69 6e 74 65 72 61 63 74 69  quence interacti
257d0 6f 6e 73 2e 20 20 43 6f 6e 73 69 64 65 72 20 74  ons.  Consider t
257e0 68 69 73 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  his example:.**.
257f0 2a 2a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  **    CREATE TAB
25800 4c 45 20 74 31 28 61 20 49 4e 54 2c 62 20 54 45  LE t1(a INT,b TE
25810 58 54 29 3b 0a 2a 2a 20 20 20 20 49 4e 53 45 52  XT);.**    INSER
25820 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
25830 28 31 32 33 2c 27 30 31 32 33 27 29 3b 0a 2a 2a  (123,'0123');.**
25840 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
25850 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31 32 33  M t1 WHERE a=123
25860 20 41 4e 44 20 62 3d 61 3b 0a 2a 2a 20 20 20 20   AND b=a;.**    
25870 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
25880 20 57 48 45 52 45 20 61 3d 31 32 33 20 41 4e 44   WHERE a=123 AND
25890 20 62 3d 31 32 33 3b 0a 2a 2a 0a 2a 2a 20 54 68   b=123;.**.** Th
258a0 65 20 74 77 6f 20 53 45 4c 45 43 54 20 73 74 61  e two SELECT sta
258b0 74 65 6d 65 6e 74 73 20 61 62 6f 76 65 20 73 68  tements above sh
258c0 6f 75 6c 64 20 72 65 74 75 72 6e 20 64 69 66 66  ould return diff
258d0 65 72 65 6e 74 20 61 6e 73 77 65 72 73 2e 20 20  erent answers.  
258e0 62 3d 61 0a 2a 2a 20 69 73 20 61 6c 77 61 79 20  b=a.** is alway 
258f0 74 72 75 65 20 62 65 63 61 75 73 65 20 74 68 65  true because the
25900 20 63 6f 6d 70 61 72 69 73 6f 6e 20 75 73 65 73   comparison uses
25910 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
25920 79 2c 20 62 75 74 20 62 3d 31 32 33 0a 2a 2a 20  y, but b=123.** 
25930 69 73 20 66 61 6c 73 65 20 62 65 63 61 75 73 65  is false because
25940 20 69 74 20 75 73 65 73 20 74 65 78 74 20 61 66   it uses text af
25950 66 69 6e 69 74 79 20 61 6e 64 20 27 30 31 32 33  finity and '0123
25960 27 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61 6d  ' is not the sam
25970 65 20 61 73 20 27 31 32 33 27 2e 0a 2a 2a 20 54  e as '123'..** T
25980 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
25990 69 73 2c 20 74 68 65 20 65 78 70 72 65 73 73 69  is, the expressi
259a0 6f 6e 20 74 72 65 65 20 69 73 20 6e 6f 74 20 61  on tree is not a
259b0 63 74 75 61 6c 6c 79 20 63 68 61 6e 67 65 64 20  ctually changed 
259c0 66 72 6f 6d 0a 2a 2a 20 22 62 3d 61 22 20 74 6f  from.** "b=a" to
259d0 20 22 62 3d 31 32 33 22 20 62 75 74 20 72 61 74   "b=123" but rat
259e0 68 65 72 20 74 68 65 20 22 61 22 20 69 6e 20 22  her the "a" in "
259f0 62 3d 61 22 20 69 73 20 74 61 67 67 65 64 20 77  b=a" is tagged w
25a00 69 74 68 20 45 50 5f 46 69 78 65 64 43 6f 6c 0a  ith EP_FixedCol.
25a10 2a 2a 20 61 6e 64 20 74 68 65 20 22 31 32 33 22  ** and the "123"
25a20 20 76 61 6c 75 65 20 69 73 20 68 75 6e 67 20 6f   value is hung o
25a30 66 66 20 6f 66 20 74 68 65 20 70 4c 65 66 74 20  ff of the pLeft 
25a40 70 6f 69 6e 74 65 72 2e 20 20 43 6f 64 65 20 67  pointer.  Code g
25a50 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 72 6f 75 74  enerator.** rout
25a60 69 6e 65 73 20 6b 6e 6f 77 20 74 6f 20 67 65 6e  ines know to gen
25a70 65 72 61 74 65 20 74 68 65 20 63 6f 6e 73 74 61  erate the consta
25a80 6e 74 20 22 31 32 33 22 20 69 6e 73 74 65 61 64  nt "123" instead
25a90 20 6f 66 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74   of looking up t
25aa0 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 76 61 6c  he.** column val
25ab0 75 65 2e 20 20 41 6c 73 6f 2c 20 74 6f 20 61 76  ue.  Also, to av
25ac0 6f 69 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 70 72  oid collation pr
25ad0 6f 62 6c 65 6d 73 2c 20 74 68 69 73 20 6f 70 74  oblems, this opt
25ae0 69 6d 69 7a 61 74 69 6f 6e 20 69 73 0a 2a 2a 20  imization is.** 
25af0 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69  only attempted i
25b00 66 20 74 68 65 20 22 61 3d 31 32 33 22 20 74 65  f the "a=123" te
25b10 72 6d 20 75 73 65 73 20 74 68 65 20 64 65 66 61  rm uses the defa
25b20 75 6c 74 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61  ult BINARY colla
25b30 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
25b40 69 6e 74 20 70 72 6f 70 61 67 61 74 65 43 6f 6e  int propagateCon
25b50 73 74 61 6e 74 73 28 0a 20 20 50 61 72 73 65 20  stants(.  Parse 
25b60 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 54 68  *pParse,   /* Th
25b70 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
25b80 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
25b90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71          /* The q
25ba0 75 65 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f  uery in which to
25bb0 20 70 72 6f 70 61 67 61 74 65 20 63 6f 6e 73 74   propagate const
25bc0 61 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  ants */.){.  Whe
25bd0 72 65 43 6f 6e 73 74 20 78 3b 0a 20 20 57 61 6c  reConst x;.  Wal
25be0 6b 65 72 20 77 3b 0a 20 20 69 6e 74 20 6e 43 68  ker w;.  int nCh
25bf0 6e 67 20 3d 20 30 3b 0a 20 20 78 2e 70 50 61 72  ng = 0;.  x.pPar
25c00 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 64  se = pParse;.  d
25c10 6f 7b 0a 20 20 20 20 78 2e 6e 43 6f 6e 73 74 20  o{.    x.nConst 
25c20 3d 20 30 3b 0a 20 20 20 20 78 2e 6e 43 68 6e 67  = 0;.    x.nChng
25c30 20 3d 20 30 3b 0a 20 20 20 20 78 2e 61 70 45 78   = 0;.    x.apEx
25c40 70 72 20 3d 20 30 3b 0a 20 20 20 20 66 69 6e 64  pr = 0;.    find
25c50 43 6f 6e 73 74 49 6e 57 68 65 72 65 28 26 78 2c  ConstInWhere(&x,
25c60 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20   p->pWhere);.   
25c70 20 69 66 28 20 78 2e 6e 43 6f 6e 73 74 20 29 7b   if( x.nConst ){
25c80 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 77  .      memset(&w
25c90 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
25ca0 0a 20 20 20 20 20 20 77 2e 70 50 61 72 73 65 20  .      w.pParse 
25cb0 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  = pParse;.      
25cc0 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
25cd0 3d 20 70 72 6f 70 61 67 61 74 65 43 6f 6e 73 74  = propagateConst
25ce0 61 6e 74 45 78 70 72 52 65 77 72 69 74 65 3b 0a  antExprRewrite;.
25cf0 20 20 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43        w.xSelectC
25d00 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
25d10 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b  3SelectWalkNoop;
25d20 0a 20 20 20 20 20 20 77 2e 78 53 65 6c 65 63 74  .      w.xSelect
25d30 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20  Callback2 = 0;. 
25d40 20 20 20 20 20 77 2e 77 61 6c 6b 65 72 44 65 70       w.walkerDep
25d50 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 2e  th = 0;.      w.
25d60 75 2e 70 43 6f 6e 73 74 20 3d 20 26 78 3b 0a 20  u.pConst = &x;. 
25d70 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
25d80 45 78 70 72 28 26 77 2c 20 70 2d 3e 70 57 68 65  Expr(&w, p->pWhe
25d90 72 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  re);.      sqlit
25da0 65 33 44 62 46 72 65 65 28 78 2e 70 50 61 72 73  e3DbFree(x.pPars
25db0 65 2d 3e 64 62 2c 20 78 2e 61 70 45 78 70 72 29  e->db, x.apExpr)
25dc0 3b 0a 20 20 20 20 20 20 6e 43 68 6e 67 20 2b 3d  ;.      nChng +=
25dd0 20 78 2e 6e 43 68 6e 67 3b 0a 20 20 20 20 7d 0a   x.nChng;.    }.
25de0 20 20 7d 77 68 69 6c 65 28 20 78 2e 6e 43 68 6e    }while( x.nChn
25df0 67 20 29 3b 20 20 0a 20 20 72 65 74 75 72 6e 20  g );  .  return 
25e00 6e 43 68 6e 67 3b 0a 7d 0a 0a 23 69 66 20 21 64  nChng;.}..#if !d
25e10 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
25e20 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
25e30 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
25e40 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a  OMIT_VIEW)./*.**
25e50 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20   Make copies of 
25e60 72 65 6c 65 76 61 6e 74 20 57 48 45 52 45 20 63  relevant WHERE c
25e70 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 74  lause terms of t
25e80 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
25e90 6e 74 6f 0a 2a 2a 20 74 68 65 20 57 48 45 52 45  nto.** the WHERE
25ea0 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75   clause of subqu
25eb0 65 72 79 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a  ery.  Example:.*
25ec0 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
25ed0 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20   FROM (SELECT a 
25ee0 41 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46  AS x, c-d AS y F
25ef0 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 78 3d  ROM t1) WHERE x=
25f00 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a  5 AND y=10;.**.*
25f10 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  * Transformed in
25f20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  to:.**.**    SEL
25f30 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45  ECT * FROM (SELE
25f40 43 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41  CT a AS x, c-d A
25f50 53 20 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S y FROM t1 WHER
25f60 45 20 61 3d 35 20 41 4e 44 20 63 2d 64 3d 31 30  E a=5 AND c-d=10
25f70 29 0a 2a 2a 20 20 20 20 20 57 48 45 52 45 20 78  ).**     WHERE x
25f80 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a  =5 AND y=10;.**.
25f90 2a 2a 20 54 68 65 20 68 6f 70 65 20 69 73 20 74  ** The hope is t
25fa0 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 61 64  hat the terms ad
25fb0 64 65 64 20 74 6f 20 74 68 65 20 69 6e 6e 65 72  ded to the inner
25fc0 20 71 75 65 72 79 20 77 69 6c 6c 20 6d 61 6b 65   query will make
25fd0 20 69 74 20 6d 6f 72 65 0a 2a 2a 20 65 66 66 69   it more.** effi
25fe0 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20  cient..**.** Do 
25ff0 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 68 69 73  not attempt this
26000 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66   optimization if
26010 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 28 2a  :.**.**   (1) (*
26020 2a 20 54 68 69 73 20 72 65 73 74 72 69 63 74 69  * This restricti
26030 6f 6e 20 77 61 73 20 72 65 6d 6f 76 65 64 20 6f  on was removed o
26040 6e 20 32 30 31 37 2d 30 39 2d 32 39 2e 20 20 57  n 2017-09-29.  W
26050 65 20 75 73 65 64 20 74 6f 0a 2a 2a 20 20 20 20  e used to.**    
26060 20 20 20 20 20 20 20 64 69 73 61 6c 6c 6f 77 20         disallow 
26070 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
26080 6e 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20  n for aggregate 
26090 73 75 62 71 75 65 72 69 65 73 2c 20 62 75 74 20  subqueries, but 
260a0 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  now.**          
260b0 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 20 62   it is allowed b
260c0 79 20 70 75 74 74 69 6e 67 20 74 68 65 20 65 78  y putting the ex
260d0 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65  tra terms on the
260e0 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 0a   HAVING clause..
260f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 54 68 65  **           The
26100 20 61 64 64 65 64 20 48 41 56 49 4e 47 20 63 6c   added HAVING cl
26110 61 75 73 65 20 69 73 20 70 6f 69 6e 74 6c 65 73  ause is pointles
26120 73 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  s if the subquer
26130 79 20 6c 61 63 6b 73 0a 2a 2a 20 20 20 20 20 20  y lacks.**      
26140 20 20 20 20 20 61 20 47 52 4f 55 50 20 42 59 20       a GROUP BY 
26150 63 6c 61 75 73 65 2e 20 20 42 75 74 20 73 75 63  clause.  But suc
26160 68 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73  h a HAVING claus
26170 65 20 69 73 20 61 6c 73 6f 20 68 61 72 6d 6c 65  e is also harmle
26180 73 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ss.**           
26190 73 6f 20 74 68 65 72 65 20 64 6f 65 73 20 6e 6f  so there does no
261a0 74 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 61  t appear to be a
261b0 6e 79 20 72 65 61 73 6f 6e 20 74 6f 20 61 64 64  ny reason to add
261c0 20 65 78 74 72 61 20 6c 6f 67 69 63 0a 2a 2a 20   extra logic.** 
261d0 20 20 20 20 20 20 20 20 20 20 74 6f 20 73 75 70            to sup
261e0 70 72 65 73 73 20 69 74 2e 20 2a 2a 29 0a 2a 2a  press it. **).**
261f0 0a 2a 2a 20 20 20 28 32 29 20 54 68 65 20 69 6e  .**   (2) The in
26200 6e 65 72 20 71 75 65 72 79 20 69 73 20 74 68 65  ner query is the
26210 20 72 65 63 75 72 73 69 76 65 20 70 61 72 74 20   recursive part 
26220 6f 66 20 61 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c  of a common tabl
26230 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  e expression..**
26240 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 20 69 6e  .**   (3) The in
26250 6e 65 72 20 71 75 65 72 79 20 68 61 73 20 61 20  ner query has a 
26260 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 28 73 69  LIMIT clause (si
26270 6e 63 65 20 74 68 65 20 63 68 61 6e 67 65 73 20  nce the changes 
26280 74 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20  to the WHERE.** 
26290 20 20 20 20 20 20 63 6c 61 75 73 65 20 77 6f 75        clause wou
262a0 6c 64 20 63 68 61 6e 67 65 20 74 68 65 20 6d 65  ld change the me
262b0 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 4c 49 4d  aning of the LIM
262c0 49 54 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29  IT)..**.**   (4)
262d0 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
262e0 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   is the right op
262f0 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20  erand of a LEFT 
26300 4a 4f 49 4e 20 61 6e 64 20 74 68 65 0a 2a 2a 20  JOIN and the.** 
26310 20 20 20 20 20 20 65 78 70 72 65 73 73 69 6f 6e        expression
26320 20 74 6f 20 62 65 20 70 75 73 68 65 64 20 64 6f   to be pushed do
26330 77 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65  wn does not come
26340 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61   from the ON cla
26350 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f 6e 20  use.**       on 
26360 74 68 61 74 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a  that LEFT JOIN..
26370 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 54 68 65 20  **.**   (5) The 
26380 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70  WHERE clause exp
26390 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74  ression originat
263a0 65 73 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  es in the ON or 
263b0 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20  USING clause.** 
263c0 20 20 20 20 20 20 6f 66 20 61 20 4c 45 46 54 20        of a LEFT 
263d0 4a 4f 49 4e 20 77 68 65 72 65 20 69 43 75 72 73  JOIN where iCurs
263e0 6f 72 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69  or is not the ri
263f0 67 68 74 2d 68 61 6e 64 20 74 61 62 6c 65 20 6f  ght-hand table o
26400 66 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  f that.**       
26410 6c 65 66 74 20 6a 6f 69 6e 2e 20 20 41 6e 20 65  left join.  An e
26420 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
26430 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a          SELECT *
26440 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 46 52  .**           FR
26450 4f 4d 20 28 53 45 4c 45 43 54 20 31 20 41 53 20  OM (SELECT 1 AS 
26460 61 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  a1 UNION ALL SEL
26470 45 43 54 20 32 29 20 41 53 20 61 61 0a 2a 2a 20  ECT 2) AS aa.** 
26480 20 20 20 20 20 20 20 20 20 20 4a 4f 49 4e 20 28            JOIN (
26490 53 45 4c 45 43 54 20 31 20 41 53 20 62 32 20 55  SELECT 1 AS b2 U
264a0 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
264b0 32 29 20 41 53 20 62 62 20 4f 4e 20 28 61 31 3d  2) AS bb ON (a1=
264c0 62 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  b2).**          
264d0 20 4c 45 46 54 20 4a 4f 49 4e 20 28 53 45 4c 45   LEFT JOIN (SELE
264e0 43 54 20 38 20 41 53 20 63 33 20 55 4e 49 4f 4e  CT 8 AS c3 UNION
264f0 20 41 4c 4c 20 53 45 4c 45 43 54 20 39 29 20 41   ALL SELECT 9) A
26500 53 20 63 63 20 4f 4e 20 28 62 32 3d 32 29 3b 0a  S cc ON (b2=2);.
26510 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20  **.**       The 
26520 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 69  correct answer i
26530 73 20 74 68 72 65 65 20 72 6f 77 73 3a 20 20 28  s three rows:  (
26540 31 2c 31 2c 4e 55 4c 4c 29 2c 28 32 2c 32 2c 38  1,1,NULL),(2,2,8
26550 29 2c 28 32 2c 32 2c 39 29 2e 0a 2a 2a 20 20 20  ),(2,2,9)..**   
26560 20 20 20 20 42 75 74 20 69 66 20 74 68 65 20 28      But if the (
26570 62 32 3d 32 29 20 74 65 72 6d 20 77 65 72 65 20  b2=2) term were 
26580 74 6f 20 62 65 20 70 75 73 68 65 64 20 64 6f 77  to be pushed dow
26590 6e 20 69 6e 74 6f 20 74 68 65 20 62 62 20 73 75  n into the bb su
265a0 62 71 75 65 72 79 2c 0a 2a 2a 20 20 20 20 20 20  bquery,.**      
265b0 20 74 68 65 6e 20 74 68 65 20 28 31 2c 31 2c 4e   then the (1,1,N
265c0 55 4c 4c 29 20 72 6f 77 20 77 6f 75 6c 64 20 62  ULL) row would b
265d0 65 20 73 75 70 70 72 65 73 73 65 64 2e 0a 2a 2a  e suppressed..**
265e0 0a 2a 2a 20 20 20 28 36 29 20 54 68 65 20 69 6e  .**   (6) The in
265f0 6e 65 72 20 71 75 65 72 79 20 66 65 61 74 75 72  ner query featur
26600 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 77  es one or more w
26610 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 73 20  indow-functions 
26620 28 73 69 6e 63 65 20 0a 2a 2a 20 20 20 20 20 20  (since .**      
26630 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
26640 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20  WHERE clause of 
26650 74 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  the inner query 
26660 63 6f 75 6c 64 20 63 68 61 6e 67 65 20 74 68 65  could change the
26670 20 0a 2a 2a 20 20 20 20 20 20 20 77 69 6e 64 6f   .**       windo
26680 77 20 6f 76 65 72 20 77 68 69 63 68 20 77 69 6e  w over which win
26690 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  dow functions ar
266a0 65 20 63 61 6c 63 75 6c 61 74 65 64 29 2e 0a 2a  e calculated)..*
266b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  *.** Return 0 if
266c0 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   no changes are 
266d0 6d 61 64 65 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72  made and non-zer
266e0 6f 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  o if one or more
266f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a   WHERE clause.**
26700 20 74 65 72 6d 73 20 61 72 65 20 64 75 70 6c 69   terms are dupli
26710 63 61 74 65 64 20 69 6e 74 6f 20 74 68 65 20 73  cated into the s
26720 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  ubquery..*/.stat
26730 69 63 20 69 6e 74 20 70 75 73 68 44 6f 77 6e 57  ic int pushDownW
26740 68 65 72 65 54 65 72 6d 73 28 0a 20 20 50 61 72  hereTerms(.  Par
26750 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
26760 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
26770 65 78 74 20 28 66 6f 72 20 6d 61 6c 6c 6f 63 28  ext (for malloc(
26780 29 20 61 6e 64 20 65 72 72 6f 72 20 72 65 70 6f  ) and error repo
26790 72 74 69 6e 67 29 20 2a 2f 0a 20 20 53 65 6c 65  rting) */.  Sele
267a0 63 74 20 2a 70 53 75 62 71 2c 20 20 20 20 20 20  ct *pSubq,      
267b0 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72    /* The subquer
267c0 79 20 77 68 6f 73 65 20 57 48 45 52 45 20 63 6c  y whose WHERE cl
267d0 61 75 73 65 20 69 73 20 74 6f 20 62 65 20 61 75  ause is to be au
267e0 67 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 45 78 70  gmented */.  Exp
267f0 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20  r *pWhere,      
26800 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
26810 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
26820 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ter query */.  i
26830 6e 74 20 69 43 75 72 73 6f 72 2c 20 20 20 20 20  nt iCursor,     
26840 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
26850 75 6d 62 65 72 20 6f 66 20 74 68 65 20 73 75 62  umber of the sub
26860 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
26870 73 4c 65 66 74 4a 6f 69 6e 20 20 20 20 20 20 20  sLeftJoin       
26880 20 2f 2a 20 54 72 75 65 20 69 66 20 70 53 75 62   /* True if pSub
26890 71 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  q is the right t
268a0 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  erm of a LEFT JO
268b0 49 4e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  IN */.){.  Expr 
268c0 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 43 68  *pNew;.  int nCh
268d0 6e 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 57  ng = 0;.  if( pW
268e0 68 65 72 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  here==0 ) return
268f0 20 30 3b 0a 20 20 69 66 28 20 70 53 75 62 71 2d   0;.  if( pSubq-
26900 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
26910 65 63 75 72 73 69 76 65 20 29 20 72 65 74 75 72  ecursive ) retur
26920 6e 20 30 3b 20 20 2f 2a 20 72 65 73 74 72 69 63  n 0;  /* restric
26930 74 69 6f 6e 20 28 32 29 20 2a 2f 0a 0a 23 69 66  tion (2) */..#if
26940 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
26950 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 69 66  _WINDOWFUNC.  if
26960 28 20 70 53 75 62 71 2d 3e 70 57 69 6e 20 29 20  ( pSubq->pWin ) 
26970 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20  return 0;    /* 
26980 72 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20  restriction (6) 
26990 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  */.#endif..#ifde
269a0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
269b0 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20 66 69 72   /* Only the fir
269c0 73 74 20 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d  st term of a com
269d0 70 6f 75 6e 64 20 63 61 6e 20 68 61 76 65 20 61  pound can have a
269e0 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20 20 42   WITH clause.  B
269f0 75 74 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72  ut make.  ** sur
26a00 65 20 6e 6f 20 6f 74 68 65 72 20 74 65 72 6d 73  e no other terms
26a10 20 61 72 65 20 6d 61 72 6b 65 64 20 53 46 5f 52   are marked SF_R
26a20 65 63 75 72 73 69 76 65 20 69 6e 20 63 61 73 65  ecursive in case
26a30 20 73 6f 6d 65 74 68 69 6e 67 20 63 68 61 6e 67   something chang
26a40 65 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66  es.  ** in the f
26a50 75 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 7b 0a  uture..  */.  {.
26a60 20 20 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 20      Select *pX; 
26a70 20 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 75   .    for(pX=pSu
26a80 62 71 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  bq; pX; pX=pX->p
26a90 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 61 73  Prior){.      as
26aa0 73 65 72 74 28 20 28 70 58 2d 3e 73 65 6c 46 6c  sert( (pX->selFl
26ab0 61 67 73 20 26 20 28 53 46 5f 52 65 63 75 72 73  ags & (SF_Recurs
26ac0 69 76 65 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ive))==0 );.    
26ad0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
26ae0 69 66 28 20 70 53 75 62 71 2d 3e 70 4c 69 6d 69  if( pSubq->pLimi
26af0 74 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t!=0 ){.    retu
26b00 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63  rn 0; /* restric
26b10 74 69 6f 6e 20 28 33 29 20 2a 2f 0a 20 20 7d 0a  tion (3) */.  }.
26b20 20 20 77 68 69 6c 65 28 20 70 57 68 65 72 65 2d    while( pWhere-
26b30 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20  >op==TK_AND ){. 
26b40 20 20 20 6e 43 68 6e 67 20 2b 3d 20 70 75 73 68     nChng += push
26b50 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 70  DownWhereTerms(p
26b60 50 61 72 73 65 2c 20 70 53 75 62 71 2c 20 70 57  Parse, pSubq, pW
26b70 68 65 72 65 2d 3e 70 52 69 67 68 74 2c 0a 20 20  here->pRight,.  
26b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43                iC
26ba0 75 72 73 6f 72 2c 20 69 73 4c 65 66 74 4a 6f 69  ursor, isLeftJoi
26bb0 6e 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d  n);.    pWhere =
26bc0 20 70 57 68 65 72 65 2d 3e 70 4c 65 66 74 3b 0a   pWhere->pLeft;.
26bd0 20 20 7d 0a 20 20 69 66 28 20 69 73 4c 65 66 74    }.  if( isLeft
26be0 4a 6f 69 6e 0a 20 20 20 26 26 20 28 45 78 70 72  Join.   && (Expr
26bf0 48 61 73 50 72 6f 70 65 72 74 79 28 70 57 68 65  HasProperty(pWhe
26c00 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3d  re,EP_FromJoin)=
26c10 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  =0.         || p
26c20 57 68 65 72 65 2d 3e 69 52 69 67 68 74 4a 6f 69  Where->iRightJoi
26c30 6e 54 61 62 6c 65 21 3d 69 43 75 72 73 6f 72 29  nTable!=iCursor)
26c40 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
26c50 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69   0; /* restricti
26c60 6f 6e 20 28 34 29 20 2a 2f 0a 20 20 7d 0a 20 20  on (4) */.  }.  
26c70 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
26c80 72 74 79 28 70 57 68 65 72 65 2c 45 50 5f 46 72  rty(pWhere,EP_Fr
26c90 6f 6d 4a 6f 69 6e 29 20 26 26 20 70 57 68 65 72  omJoin) && pWher
26ca0 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  e->iRightJoinTab
26cb0 6c 65 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  le!=iCursor ){. 
26cc0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
26cd0 72 65 73 74 72 69 63 74 69 6f 6e 20 28 35 29 20  restriction (5) 
26ce0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  */.  }.  if( sql
26cf0 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43  ite3ExprIsTableC
26d00 6f 6e 73 74 61 6e 74 28 70 57 68 65 72 65 2c 20  onstant(pWhere, 
26d10 69 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20  iCursor) ){.    
26d20 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20 20 77 68 69  nChng++;.    whi
26d30 6c 65 28 20 70 53 75 62 71 20 29 7b 0a 20 20 20  le( pSubq ){.   
26d40 20 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20     SubstContext 
26d50 78 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  x;.      pNew = 
26d60 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
26d70 50 61 72 73 65 2d 3e 64 62 2c 20 70 57 68 65 72  Parse->db, pWher
26d80 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 75 6e 73  e, 0);.      uns
26d90 65 74 4a 6f 69 6e 45 78 70 72 28 70 4e 65 77 2c  etJoinExpr(pNew,
26da0 20 2d 31 29 3b 0a 20 20 20 20 20 20 78 2e 70 50   -1);.      x.pP
26db0 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
26dc0 20 20 20 20 20 78 2e 69 54 61 62 6c 65 20 3d 20       x.iTable = 
26dd0 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 78  iCursor;.      x
26de0 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20 69 43 75  .iNewTable = iCu
26df0 72 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69 73  rsor;.      x.is
26e00 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 0a 20 20  LeftJoin = 0;.  
26e10 20 20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20 70      x.pEList = p
26e20 53 75 62 71 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  Subq->pEList;.  
26e30 20 20 20 20 70 4e 65 77 20 3d 20 73 75 62 73 74      pNew = subst
26e40 45 78 70 72 28 26 78 2c 20 70 4e 65 77 29 3b 0a  Expr(&x, pNew);.
26e50 20 20 20 20 20 20 69 66 28 20 70 53 75 62 71 2d        if( pSubq-
26e60 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
26e70 67 67 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20  ggregate ){.    
26e80 20 20 20 20 70 53 75 62 71 2d 3e 70 48 61 76 69      pSubq->pHavi
26e90 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ng = sqlite3Expr
26ea0 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  And(pParse->db, 
26eb0 70 53 75 62 71 2d 3e 70 48 61 76 69 6e 67 2c 20  pSubq->pHaving, 
26ec0 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 65 6c  pNew);.      }el
26ed0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 53 75 62  se{.        pSub
26ee0 71 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  q->pWhere = sqli
26ef0 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
26f00 65 2d 3e 64 62 2c 20 70 53 75 62 71 2d 3e 70 57  e->db, pSubq->pW
26f10 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20  here, pNew);.   
26f20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 75 62 71     }.      pSubq
26f30 20 3d 20 70 53 75 62 71 2d 3e 70 50 72 69 6f 72   = pSubq->pPrior
26f40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
26f50 74 75 72 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 23 65  turn nChng;.}.#e
26f60 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
26f70 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
26f80 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
26f90 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
26fa0 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  IEW) */../*.** T
26fb0 68 65 20 70 46 75 6e 63 20 69 73 20 74 68 65 20  he pFunc is the 
26fc0 6f 6e 6c 79 20 61 67 67 72 65 67 61 74 65 20 66  only aggregate f
26fd0 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 71  unction in the q
26fe0 75 65 72 79 2e 20 20 43 68 65 63 6b 20 74 6f 20  uery.  Check to 
26ff0 73 65 65 0a 2a 2a 20 69 66 20 74 68 65 20 71 75  see.** if the qu
27000 65 72 79 20 69 73 20 61 20 63 61 6e 64 69 64 61  ery is a candida
27010 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d  te for the min/m
27020 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  ax optimization.
27030 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 71   .**.** If the q
27040 75 65 72 79 20 69 73 20 61 20 63 61 6e 64 69 64  uery is a candid
27050 61 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f  ate for the min/
27060 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  max optimization
27070 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20 2a 70  , then set.** *p
27080 70 4d 69 6e 4d 61 78 20 74 6f 20 62 65 20 61 6e  pMinMax to be an
27090 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
270a0 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20   to be used for 
270b0 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
270c0 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 65  .** and return e
270d0 69 74 68 65 72 20 57 48 45 52 45 5f 4f 52 44 45  ither WHERE_ORDE
270e0 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45  RBY_MIN or WHERE
270f0 5f 4f 52 44 45 52 42 59 5f 4d 41 58 20 64 65 70  _ORDERBY_MAX dep
27100 65 6e 64 69 6e 67 20 6f 6e 0a 2a 2a 20 77 68 65  ending on.** whe
27110 74 68 65 72 20 70 46 75 6e 63 20 69 73 20 61 20  ther pFunc is a 
27120 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66  min() or max() f
27130 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
27140 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 6e  f the query is n
27150 6f 74 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  ot a candidate f
27160 6f 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f  or the min/max o
27170 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 72 65 74  ptimization, ret
27180 75 72 6e 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44  urn.** WHERE_ORD
27190 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 28 77 68 69  ERBY_NORMAL (whi
271a0 63 68 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 29  ch must be zero)
271b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
271c0 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c  tine must be cal
271d0 6c 65 64 20 61 66 74 65 72 20 61 67 67 72 65 67  led after aggreg
271e0 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 68 61  ate functions ha
271f0 76 65 20 62 65 65 6e 0a 2a 2a 20 6c 6f 63 61 74  ve been.** locat
27200 65 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68  ed but before th
27210 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 68 61  eir arguments ha
27220 76 65 20 62 65 65 6e 20 73 75 62 6a 65 63 74 65  ve been subjecte
27230 64 20 74 6f 20 61 67 67 72 65 67 61 74 65 0a 2a  d to aggregate.*
27240 2a 20 61 6e 61 6c 79 73 69 73 2e 0a 2a 2f 0a 73  * analysis..*/.s
27250 74 61 74 69 63 20 75 38 20 6d 69 6e 4d 61 78 51  tatic u8 minMaxQ
27260 75 65 72 79 28 73 71 6c 69 74 65 33 20 2a 64 62  uery(sqlite3 *db
27270 2c 20 45 78 70 72 20 2a 70 46 75 6e 63 2c 20 45  , Expr *pFunc, E
27280 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e 4d  xprList **ppMinM
27290 61 78 29 7b 0a 20 20 69 6e 74 20 65 52 65 74 20  ax){.  int eRet 
272a0 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
272b0 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20 2f 2a 20  NORMAL;      /* 
272c0 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
272d0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
272e0 73 74 20 3d 20 70 46 75 6e 63 2d 3e 78 2e 70 4c  st = pFunc->x.pL
272f0 69 73 74 3b 20 20 20 20 2f 2a 20 41 72 67 75 6d  ist;    /* Argum
27300 65 6e 74 73 20 74 6f 20 61 67 67 20 66 75 6e 63  ents to agg func
27310 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tion */.  const 
27320 63 68 61 72 20 2a 7a 46 75 6e 63 3b 20 20 20 20  char *zFunc;    
27330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27340 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 67 67 72 65  /* Name of aggre
27350 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 70 46  gate function pF
27360 75 6e 63 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  unc */.  ExprLis
27370 74 20 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20 75  t *pOrderBy;.  u
27380 38 20 73 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20  8 sortOrder;..  
27390 61 73 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61  assert( *ppMinMa
273a0 78 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  x==0 );.  assert
273b0 28 20 70 46 75 6e 63 2d 3e 6f 70 3d 3d 54 4b 5f  ( pFunc->op==TK_
273c0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
273d0 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
273e0 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  || pEList->nExpr
273f0 21 3d 31 20 29 20 72 65 74 75 72 6e 20 65 52 65  !=1 ) return eRe
27400 74 3b 0a 20 20 7a 46 75 6e 63 20 3d 20 70 46 75  t;.  zFunc = pFu
27410 6e 63 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  nc->u.zToken;.  
27420 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
27430 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29  mp(zFunc, "min")
27440 3d 3d 30 20 29 7b 0a 20 20 20 20 65 52 65 74 20  ==0 ){.    eRet 
27450 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
27460 4d 49 4e 3b 0a 20 20 20 20 73 6f 72 74 4f 72 64  MIN;.    sortOrd
27470 65 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 41  er = SQLITE_SO_A
27480 53 43 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  SC;.  }else if( 
27490 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
274a0 46 75 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20  Func, "max")==0 
274b0 29 7b 0a 20 20 20 20 65 52 65 74 20 3d 20 57 48  ){.    eRet = WH
274c0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b  ERE_ORDERBY_MAX;
274d0 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d  .    sortOrder =
274e0 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3b   SQLITE_SO_DESC;
274f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
27500 74 75 72 6e 20 65 52 65 74 3b 0a 20 20 7d 0a 20  turn eRet;.  }. 
27510 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 4f 72   *ppMinMax = pOr
27520 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
27530 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
27540 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 61 73 73  EList, 0);.  ass
27550 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30  ert( pOrderBy!=0
27560 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
27570 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4f  iled );.  if( pO
27580 72 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42  rderBy ) pOrderB
27590 79 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  y->a[0].sortOrde
275a0 72 20 3d 20 73 6f 72 74 4f 72 64 65 72 3b 0a 20  r = sortOrder;. 
275b0 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a   return eRet;.}.
275c0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63  ./*.** The selec
275d0 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
275e0 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
275f0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61  argument is an a
27600 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a  ggregate query..
27610 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
27620 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73  gument is the as
27630 73 6f 63 69 61 74 65 64 20 61 67 67 72 65 67 61  sociated aggrega
27640 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20  te-info object. 
27650 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
27660 6e 20 74 65 73 74 73 20 69 66 20 74 68 65 20 53  n tests if the S
27670 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20  ELECT is of the 
27680 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45  form:.**.**   SE
27690 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
276a0 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77  OM <tbl>.**.** w
276b0 68 65 72 65 20 74 61 62 6c 65 20 69 73 20 61 20  here table is a 
276c0 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20  database table, 
276d0 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74  not a sub-select
276e0 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68 65   or view. If the
276f0 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d   query.** does m
27700 61 74 63 68 20 74 68 69 73 20 70 61 74 74 65 72  atch this patter
27710 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65  n, then a pointe
27720 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f  r to the Table o
27730 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 69  bject representi
27740 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72  ng.** <tbl> is r
27750 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
27760 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  se, 0 is returne
27770 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62  d..*/.static Tab
27780 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e  le *isSimpleCoun
27790 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67  t(Select *p, Agg
277a0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
277b0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
277c0 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a    Expr *pExpr;..
277d0 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47    assert( !p->pG
277e0 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28  roupBy );..  if(
277f0 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d   p->pWhere || p-
27800 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
27810 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63  1 .   || p->pSrc
27820 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e  ->nSrc!=1 || p->
27830 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
27840 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  ct.  ){.    retu
27850 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 0;.  }.  pTab
27860 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
27870 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d  .pTab;.  pExpr =
27880 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
27890 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74  .pExpr;.  assert
278a0 28 20 70 54 61 62 20 26 26 20 21 70 54 61 62 2d  ( pTab && !pTab-
278b0 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45 78 70  >pSelect && pExp
278c0 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69  r );..  if( IsVi
278d0 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
278e0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
278f0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
27900 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72  FUNCTION ) retur
27910 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  n 0;.  if( NEVER
27920 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  (pAggInfo->nFunc
27930 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ==0) ) return 0;
27940 0a 20 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f  .  if( (pAggInfo
27950 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63  ->aFunc[0].pFunc
27960 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c 49  ->funcFlags&SQLI
27970 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d  TE_FUNC_COUNT)==
27980 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
27990 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
279a0 26 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72  &EP_Distinct ) r
279b0 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75  eturn 0;..  retu
279c0 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
279d0 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d  * If the source-
279e0 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73 65 64  list item passed
279f0 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
27a00 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69  was augmented wi
27a10 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44  th an.** INDEXED
27a20 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
27a30 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74   try to locate t
27a40 68 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 64  he specified ind
27a50 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  ex. If there.** 
27a60 77 61 73 20 73 75 63 68 20 61 20 63 6c 61 75 73  was such a claus
27a70 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20  e and the named 
27a80 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20  index cannot be 
27a90 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a  found, return .*
27aa0 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61  * SQLITE_ERROR a
27ab0 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  nd leave an erro
27ac0 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68  r in pParse. Oth
27ad0 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65  erwise, populate
27ae0 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64   .** pFrom->pInd
27af0 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ex and return SQ
27b00 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
27b10 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79  sqlite3IndexedBy
27b20 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50  Lookup(Parse *pP
27b30 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63  arse, struct Src
27b40 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
27b50 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  ){.  if( pFrom->
27b60 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 66  pTab && pFrom->f
27b70 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 7b  g.isIndexedBy ){
27b80 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
27b90 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
27ba0 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78      char *zIndex
27bb0 65 64 42 79 20 3d 20 70 46 72 6f 6d 2d 3e 75 31  edBy = pFrom->u1
27bc0 2e 7a 49 6e 64 65 78 65 64 42 79 3b 0a 20 20 20  .zIndexedBy;.   
27bd0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
27be0 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
27bf0 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20  >pIndex; .      
27c00 20 20 70 49 64 78 20 26 26 20 73 71 6c 69 74 65    pIdx && sqlite
27c10 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a  3StrICmp(pIdx->z
27c20 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 65 64 42 79  Name, zIndexedBy
27c30 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78  ); .        pIdx
27c40 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20  =pIdx->pNext.   
27c50 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64   );.    if( !pId
27c60 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  x ){.      sqlit
27c70 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
27c80 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  e, "no such inde
27c90 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 65 64  x: %s", zIndexed
27ca0 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  By, 0);.      pP
27cb0 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
27cc0 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  a = 1;.      ret
27cd0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
27ce0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f  ;.    }.    pFro
27cf0 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20 70 49  m->pIBIndex = pI
27d00 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dx;.  }.  return
27d10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a   SQLITE_OK;.}./*
27d20 0a 2a 2a 20 44 65 74 65 63 74 20 63 6f 6d 70 6f  .** Detect compo
27d30 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
27d40 6d 65 6e 74 73 20 74 68 61 74 20 75 73 65 20 61  ments that use a
27d50 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
27d60 65 20 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61 6c  e with .** an al
27d70 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74  ternative collat
27d80 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a  ing sequence..**
27d90 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2e 2e  .**    SELECT ..
27da0 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54  . FROM t1 EXCEPT
27db0 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
27dc0 20 74 32 20 4f 52 44 45 52 20 42 59 20 2e 2e 20   t2 ORDER BY .. 
27dd0 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a  COLLATE ....**.*
27de0 2a 20 54 68 65 73 65 20 61 72 65 20 72 65 77 72  * These are rewr
27df0 69 74 74 65 6e 20 61 73 20 61 20 73 75 62 71 75  itten as a subqu
27e00 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  ery:.**.**    SE
27e10 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c  LECT * FROM (SEL
27e20 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  ECT ... FROM t1 
27e30 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e  EXCEPT SELECT ..
27e40 2e 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20  . FROM t2).**   
27e50 20 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20 43    ORDER BY ... C
27e60 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a  OLLATE ....**.**
27e70 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61   This transforma
27e80 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72  tion is necessar
27e90 79 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 75  y because the mu
27ea0 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
27eb0 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 62  () routine.** ab
27ec0 6f 76 65 20 74 68 61 74 20 67 65 6e 65 72 61 74  ove that generat
27ed0 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  es the code for 
27ee0 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
27ef0 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20  T with an ORDER 
27f00 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73 65  BY clause.** use
27f10 73 20 61 20 6d 65 72 67 65 20 61 6c 67 6f 72 69  s a merge algori
27f20 74 68 6d 20 74 68 61 74 20 72 65 71 75 69 72 65  thm that require
27f30 73 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61  s the same colla
27f40 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 6e  ting sequence on
27f50 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63   the.** result c
27f60 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68 65  olumns as on the
27f70 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
27f80 2e 20 20 53 65 65 20 74 69 63 6b 65 74 0a 2a 2a  .  See ticket.**
27f90 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69   http://www.sqli
27fa0 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f  te.org/src/info/
27fb0 36 37 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a  6709574d2a.**.**
27fc0 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61   This transforma
27fd0 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65 65  tion is only nee
27fe0 64 65 64 20 66 6f 72 20 45 58 43 45 50 54 2c 20  ded for EXCEPT, 
27ff0 49 4e 54 45 52 53 45 43 54 2c 20 61 6e 64 20 55  INTERSECT, and U
28000 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e 49  NION..** The UNI
28010 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20  ON ALL operator 
28020 77 6f 72 6b 73 20 66 69 6e 65 20 77 69 74 68 20  works fine with 
28030 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
28040 42 79 28 29 20 65 76 65 6e 20 77 68 65 6e 0a 2a  By() even when.*
28050 2a 20 74 68 65 72 65 20 61 72 65 20 43 4f 4c 4c  * there are COLL
28060 41 54 45 20 74 65 72 6d 73 20 69 6e 20 74 68 65  ATE terms in the
28070 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73 74   ORDER BY..*/.st
28080 61 74 69 63 20 69 6e 74 20 63 6f 6e 76 65 72 74  atic int convert
28090 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f  CompoundSelectTo
280a0 53 75 62 71 75 65 72 79 28 57 61 6c 6b 65 72 20  Subquery(Walker 
280b0 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
280c0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
280d0 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
280e0 20 53 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20 73   Select *pX;.  s
280f0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74  qlite3 *db;.  st
28100 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
28110 65 6d 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73 74  em *a;.  SrcList
28120 20 2a 70 4e 65 77 53 72 63 3b 0a 20 20 50 61 72   *pNewSrc;.  Par
28130 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 54 6f  se *pParse;.  To
28140 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69 66  ken dummy;..  if
28150 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
28160 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
28170 69 6e 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70  inue;.  if( p->p
28180 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74  OrderBy==0 ) ret
28190 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
281a0 3b 0a 20 20 66 6f 72 28 70 58 3d 70 3b 20 70 58  ;.  for(pX=p; pX
281b0 20 26 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   && (pX->op==TK_
281c0 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54  ALL || pX->op==T
281d0 4b 5f 53 45 4c 45 43 54 29 3b 20 70 58 3d 70 58  K_SELECT); pX=pX
281e0 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69 66  ->pPrior){}.  if
281f0 28 20 70 58 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( pX==0 ) return
28200 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
28210 20 61 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79   a = p->pOrderBy
28220 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e  ->a;.  for(i=p->
28230 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d  pOrderBy->nExpr-
28240 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
28250 20 20 20 69 66 28 20 61 5b 69 5d 2e 70 45 78 70     if( a[i].pExp
28260 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  r->flags & EP_Co
28270 6c 6c 61 74 65 20 29 20 62 72 65 61 6b 3b 0a 20  llate ) break;. 
28280 20 7d 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72   }.  if( i<0 ) r
28290 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
282a0 75 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  ue;..  /* If we 
282b0 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
282c0 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  , that means the
282d0 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
282e0 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  is required. */.
282f0 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c  .  pParse = pWal
28300 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64  ker->pParse;.  d
28310 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
28320 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
28330 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
28340 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
28350 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
28360 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
28370 72 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75  rt;.  memset(&du
28380 6d 6d 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  mmy, 0, sizeof(d
28390 75 6d 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53 72  ummy));.  pNewSr
283a0 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
283b0 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d  stAppendFromTerm
283c0 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 64  (pParse,0,0,0,&d
283d0 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a  ummy,pNew,0,0);.
283e0 20 20 69 66 28 20 70 4e 65 77 53 72 63 3d 3d 30    if( pNewSrc==0
283f0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
28400 6f 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a  ort;.  *pNew = *
28410 70 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 70  p;.  p->pSrc = p
28420 4e 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c  NewSrc;.  p->pEL
28430 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
28440 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
28450 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78  se, 0, sqlite3Ex
28460 70 72 28 64 62 2c 20 54 4b 5f 41 53 54 45 52 49  pr(db, TK_ASTERI
28470 53 4b 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70  SK, 0));.  p->op
28480 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20   = TK_SELECT;.  
28490 70 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20  p->pWhere = 0;. 
284a0 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
284b0 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  = 0;.  pNew->pHa
284c0 76 69 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77  ving = 0;.  pNew
284d0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
284e0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
284f0 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  .  p->pNext = 0;
28500 0a 20 20 70 2d 3e 70 57 69 74 68 20 3d 20 30 3b  .  p->pWith = 0;
28510 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  .  p->selFlags &
28520 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a  = ~SF_Compound;.
28530 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65    assert( (p->se
28540 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76  lFlags & SF_Conv
28550 65 72 74 65 64 29 3d 3d 30 20 29 3b 0a 20 20 70  erted)==0 );.  p
28560 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
28570 5f 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 61 73  _Converted;.  as
28580 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 50 72 69  sert( pNew->pPri
28590 6f 72 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d  or!=0 );.  pNew-
285a0 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d  >pPrior->pNext =
285b0 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70   pNew;.  pNew->p
285c0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 72 65 74  Limit = 0;.  ret
285d0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
285e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
285f0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 46   to see if the F
28600 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
28610 70 46 72 6f 6d 20 68 61 73 20 74 61 62 6c 65 2d  pFrom has table-
28620 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 0a  valued function.
28630 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 49  ** arguments.  I
28640 66 20 69 74 20 64 6f 65 73 2c 20 6c 65 61 76 65  f it does, leave
28650 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
28660 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  e in pParse and 
28670 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
28680 72 6f 2c 20 73 69 6e 63 65 20 70 46 72 6f 6d 20  ro, since pFrom 
28690 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74  is not allowed t
286a0 6f 20 62 65 20 61 20 74 61 62 6c 65 2d 76 61 6c  o be a table-val
286b0 75 65 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ued function..*/
286c0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 6e 6e  .static int cann
286d0 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 50 61 72  otBeFunction(Par
286e0 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75  se *pParse, stru
286f0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
28700 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70  *pFrom){.  if( p
28710 46 72 6f 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  From->fg.isTabFu
28720 6e 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nc ){.    sqlite
28730 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
28740 2c 20 22 27 25 73 27 20 69 73 20 6e 6f 74 20 61  , "'%s' is not a
28750 20 66 75 6e 63 74 69 6f 6e 22 2c 20 70 46 72 6f   function", pFro
28760 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  m->zName);.    r
28770 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
28780 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e  eturn 0;.}..#ifn
28790 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
287a0 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  CTE./*.** Argume
287b0 6e 74 20 70 57 69 74 68 20 28 77 68 69 63 68 20  nt pWith (which 
287c0 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69  may be NULL) poi
287d0 6e 74 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20  nts to a linked 
287e0 6c 69 73 74 20 6f 66 20 6e 65 73 74 65 64 20 0a  list of nested .
287f0 2a 2a 20 57 49 54 48 20 63 6f 6e 74 65 78 74 73  ** WITH contexts
28800 2c 20 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20  , from inner to 
28810 6f 75 74 65 72 6d 6f 73 74 2e 20 49 66 20 74 68  outermost. If th
28820 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69  e table identifi
28830 65 64 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63  ed by .** FROM c
28840 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 70 49  lause element pI
28850 74 65 6d 20 69 73 20 72 65 61 6c 6c 79 20 61 20  tem is really a 
28860 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70  common-table-exp
28870 72 65 73 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a  ression (CTE) .*
28880 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20  * then return a 
28890 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 43  pointer to the C
288a0 54 45 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f  TE definition fo
288b0 72 20 74 68 61 74 20 74 61 62 6c 65 2e 20 4f 74  r that table. Ot
288c0 68 65 72 77 69 73 65 0a 2a 2a 20 72 65 74 75 72  herwise.** retur
288d0 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  n NULL..**.** If
288e0 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75   a non-NULL valu
288f0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 73  e is returned, s
28900 65 74 20 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f  et *ppContext to
28910 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 57 69   point to the Wi
28920 74 68 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  th.** object tha
28930 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 43  t the returned C
28940 54 45 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a  TE belongs to..*
28950 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
28960 43 74 65 20 2a 73 65 61 72 63 68 57 69 74 68 28  Cte *searchWith(
28970 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20  .  With *pWith, 
28980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28990 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e     /* Current in
289a0 6e 65 72 6d 6f 73 74 20 57 49 54 48 20 63 6c 61  nermost WITH cla
289b0 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
289c0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
289d0 74 65 6d 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d  tem,     /* FROM
289e0 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20   clause element 
289f0 74 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20  to resolve */.  
28a00 57 69 74 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74  With **ppContext
28a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a20 2f 2a 20 4f 55 54 3a 20 57 49 54 48 20 63 6c 61  /* OUT: WITH cla
28a30 75 73 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  use return value
28a40 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29   belongs to */.)
28a50 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
28a60 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 49 74  zName;.  if( pIt
28a70 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30  em->zDatabase==0
28a80 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74   && (zName = pIt
28a90 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  em->zName)!=0 ){
28aa0 0a 20 20 20 20 57 69 74 68 20 2a 70 3b 0a 20 20  .    With *p;.  
28ab0 20 20 66 6f 72 28 70 3d 70 57 69 74 68 3b 20 70    for(p=pWith; p
28ac0 3b 20 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a  ; p=p->pOuter){.
28ad0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
28ae0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
28af0 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCte; i++){.   
28b00 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
28b10 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70  StrICmp(zName, p
28b20 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
28b30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
28b40 70 43 6f 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20  pContext = p;.  
28b50 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 26          return &
28b60 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20  p->a[i];.       
28b70 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
28b80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
28b90 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20  .}../* The code 
28ba0 67 65 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74 61  generator mainta
28bb0 69 6e 73 20 61 20 73 74 61 63 6b 20 6f 66 20 61  ins a stack of a
28bc0 63 74 69 76 65 20 57 49 54 48 20 63 6c 61 75 73  ctive WITH claus
28bd0 65 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69  es.** with the i
28be0 6e 6e 65 72 2d 6d 6f 73 74 20 57 49 54 48 20 63  nner-most WITH c
28bf0 6c 61 75 73 65 20 62 65 69 6e 67 20 61 74 20 74  lause being at t
28c00 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
28c10 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
28c20 72 6f 75 74 69 6e 65 20 70 75 73 68 65 73 20 74  routine pushes t
28c30 68 65 20 57 49 54 48 20 63 6c 61 75 73 65 20 70  he WITH clause p
28c40 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
28c50 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  ond argument.** 
28c60 6f 6e 74 6f 20 74 68 65 20 74 6f 70 20 6f 66 20  onto the top of 
28c70 74 68 65 20 73 74 61 63 6b 2e 20 49 66 20 61 72  the stack. If ar
28c80 67 75 6d 65 6e 74 20 62 46 72 65 65 20 69 73 20  gument bFree is 
28c90 74 72 75 65 2c 20 74 68 65 6e 20 74 68 69 73 0a  true, then this.
28ca0 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 77  ** WITH clause w
28cb0 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 70 6f 70  ill never be pop
28cc0 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ped from the sta
28cd0 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ck. In this case
28ce0 20 69 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65   it.** should be
28cf0 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74   freed along wit
28d00 68 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  h the Parse obje
28d10 63 74 2e 20 49 6e 20 6f 74 68 65 72 20 63 61 73  ct. In other cas
28d20 65 73 2c 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65  es, when.** bFre
28d30 65 3d 3d 30 2c 20 74 68 65 20 57 69 74 68 20 6f  e==0, the With o
28d40 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 66 72  bject will be fr
28d50 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  eed along with t
28d60 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74  he SELECT .** st
28d70 61 74 65 6d 65 6e 74 20 77 69 74 68 20 77 68 69  atement with whi
28d80 63 68 20 69 74 20 69 73 20 61 73 73 6f 63 69 61  ch it is associa
28d90 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
28da0 69 74 65 33 57 69 74 68 50 75 73 68 28 50 61 72  ite3WithPush(Par
28db0 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 74 68  se *pParse, With
28dc0 20 2a 70 57 69 74 68 2c 20 75 38 20 62 46 72 65   *pWith, u8 bFre
28dd0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 62 46  e){.  assert( bF
28de0 72 65 65 3d 3d 30 20 7c 7c 20 28 70 50 61 72 73  ree==0 || (pPars
28df0 65 2d 3e 70 57 69 74 68 3d 3d 30 20 26 26 20 70  e->pWith==0 && p
28e00 50 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46 72  Parse->pWithToFr
28e10 65 65 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20  ee==0) );.  if( 
28e20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 61 73 73  pWith ){.    ass
28e30 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69  ert( pParse->pWi
28e40 74 68 21 3d 70 57 69 74 68 20 29 3b 0a 20 20 20  th!=pWith );.   
28e50 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d   pWith->pOuter =
28e60 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a   pParse->pWith;.
28e70 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
28e80 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 69  h = pWith;.    i
28e90 66 28 20 62 46 72 65 65 20 29 20 70 50 61 72 73  f( bFree ) pPars
28ea0 65 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 20 3d  e->pWithToFree =
28eb0 20 70 57 69 74 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f   pWith;.  }.}../
28ec0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
28ed0 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 61 72 67  on checks if arg
28ee0 75 6d 65 6e 74 20 70 46 72 6f 6d 20 72 65 66 65  ument pFrom refe
28ef0 72 73 20 74 6f 20 61 20 43 54 45 20 64 65 63 6c  rs to a CTE decl
28f00 61 72 65 64 20 62 79 20 0a 2a 2a 20 61 20 57 49  ared by .** a WI
28f10 54 48 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65  TH clause on the
28f20 20 73 74 61 63 6b 20 63 75 72 72 65 6e 74 6c 79   stack currently
28f30 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20 74   maintained by t
28f40 68 65 20 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a  he parser. And,.
28f50 2a 2a 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20  ** if currently 
28f60 70 72 6f 63 65 73 73 69 6e 67 20 61 20 43 54 45  processing a CTE
28f70 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 20   expression, if 
28f80 69 74 20 69 73 20 61 20 72 65 63 75 72 73 69 76  it is a recursiv
28f90 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74  e.** reference t
28fa0 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 43 54  o the current CT
28fb0 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f  E..**.** If pFro
28fc0 6d 20 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74  m falls into eit
28fd0 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 63  her of the two c
28fe0 61 74 65 67 6f 72 69 65 73 20 61 62 6f 76 65 2c  ategories above,
28ff0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20   pFrom->pTab.** 
29000 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73  and other fields
29010 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61   are populated a
29020 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65 20  ccordingly. The 
29030 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 68  caller should ch
29040 65 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70  eck.** (pFrom->p
29050 54 61 62 21 3d 30 29 20 74 6f 20 64 65 74 65 72  Tab!=0) to deter
29060 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
29070 6e 6f 74 20 61 20 73 75 63 63 65 73 73 66 75 6c  not a successful
29080 20 6d 61 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f   match.** was fo
29090 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68  und..**.** Wheth
290a0 65 72 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63  er or not a matc
290b0 68 20 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49  h is found, SQLI
290c0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
290d0 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a  d if no error.**
290e0 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65   occurs. If an e
290f0 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c  rror does occur,
29100 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
29110 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74  e is stored in t
29120 68 65 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e 64  he.** parser and
29130 20 73 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64 65   some error code
29140 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
29150 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
29160 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
29170 74 68 45 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b  thExpand(.  Walk
29180 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20  er *pWalker, .  
29190 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
291a0 74 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20  tem *pFrom.){.  
291b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
291c0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
291d0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
291e0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73   pParse->db;.  s
291f0 74 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 3b  truct Cte *pCte;
29200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29210 2a 20 4d 61 74 63 68 65 64 20 43 54 45 20 28 6f  * Matched CTE (o
29220 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74  r NULL if no mat
29230 63 68 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70  ch) */.  With *p
29240 57 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  With;           
29250 20 20 20 20 20 20 20 20 20 2f 2a 20 57 49 54 48           /* WITH
29260 20 63 6c 61 75 73 65 20 74 68 61 74 20 70 43 74   clause that pCt
29270 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  e belongs to */.
29280 0a 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d  .  assert( pFrom
29290 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20  ->pTab==0 );..  
292a0 70 43 74 65 20 3d 20 73 65 61 72 63 68 57 69 74  pCte = searchWit
292b0 68 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 2c  h(pParse->pWith,
292c0 20 70 46 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b   pFrom, &pWith);
292d0 0a 20 20 69 66 28 20 70 43 74 65 20 29 7b 0a 20  .  if( pCte ){. 
292e0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
292f0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
29300 4c 69 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74  List;.    Select
29310 20 2a 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65   *pSel;.    Sele
29320 63 74 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  ct *pLeft;      
29330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66            /* Lef
29340 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
29350 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
29360 6e 74 20 62 4d 61 79 52 65 63 75 72 73 69 76 65  nt bMayRecursive
29370 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
29380 54 72 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64  True if compound
29390 20 6a 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e   joined by UNION
293a0 20 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69   [ALL] */.    Wi
293b0 74 68 20 2a 70 53 61 76 65 64 57 69 74 68 3b 20  th *pSavedWith; 
293c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
293d0 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20  nitial value of 
293e0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f  pParse->pWith */
293f0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 74 65  ..    /* If pCte
29400 2d 3e 7a 43 74 65 45 72 72 20 69 73 20 6e 6f 6e  ->zCteErr is non
29410 2d 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f  -NULL at this po
29420 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 69  int, then this i
29430 73 20 61 6e 20 69 6c 6c 65 67 61 6c 0a 20 20 20  s an illegal.   
29440 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20 72 65   ** recursive re
29450 66 65 72 65 6e 63 65 20 74 6f 20 43 54 45 20 70  ference to CTE p
29460 43 74 65 2e 20 4c 65 61 76 65 20 61 6e 20 65 72  Cte. Leave an er
29470 72 6f 72 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ror in pParse an
29480 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  d return.    ** 
29490 65 61 72 6c 79 2e 20 49 66 20 70 43 74 65 2d 3e  early. If pCte->
294a0 7a 43 74 65 45 72 72 20 69 73 20 4e 55 4c 4c 2c  zCteErr is NULL,
294b0 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 6e 6f   then this is no
294c0 74 20 61 20 72 65 63 75 72 73 69 76 65 20 72 65  t a recursive re
294d0 66 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20  ference..    ** 
294e0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 70 72  In this case, pr
294f0 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69  oceed.  */.    i
29500 66 28 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72  f( pCte->zCteErr
29510 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
29520 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
29530 2c 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 2c  , pCte->zCteErr,
29540 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCte->zName);. 
29550 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
29560 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
29570 20 20 20 20 69 66 28 20 63 61 6e 6e 6f 74 42 65      if( cannotBe
29580 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c  Function(pParse,
29590 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e   pFrom) ) return
295a0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a   SQLITE_ERROR;..
295b0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
295c0 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
295d0 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
295e0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pTab = sqlite3Db
295f0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
29600 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
29610 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
29620 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
29630 74 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 54 61  t;.    pTab->nTa
29640 62 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 54  bRef = 1;.    pT
29650 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ab->zName = sqli
29660 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
29670 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCte->zName);.  
29680 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
29690 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52  -1;.    pTab->nR
296a0 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20  owLogEst = 200; 
296b0 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c  assert( 200==sql
296c0 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35  ite3LogEst(10485
296d0 37 36 29 20 29 3b 0a 20 20 20 20 70 54 61 62 2d  76) );.    pTab-
296e0 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
296f0 45 70 68 65 6d 65 72 61 6c 20 7c 20 54 46 5f 4e  Ephemeral | TF_N
29700 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20  oVisibleRowid;. 
29710 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63     pFrom->pSelec
29720 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
29730 74 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 70  tDup(db, pCte->p
29740 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20  Select, 0);.    
29750 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
29760 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51  iled ) return SQ
29770 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
29780 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
29790 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 0a  om->pSelect );..
297a0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
297b0 74 68 69 73 20 69 73 20 61 20 72 65 63 75 72 73  this is a recurs
297c0 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20 20 20 20  ive CTE. */.    
297d0 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
297e0 65 6c 65 63 74 3b 0a 20 20 20 20 62 4d 61 79 52  elect;.    bMayR
297f0 65 63 75 72 73 69 76 65 20 3d 20 28 20 70 53 65  ecursive = ( pSe
29800 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  l->op==TK_ALL ||
29810 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e   pSel->op==TK_UN
29820 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 62  ION );.    if( b
29830 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a  MayRecursive ){.
29840 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
29850 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
29860 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
29870 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 66  t->pSrc;.      f
29880 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
29890 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
298a0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
298b0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
298c0 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20   &pSrc->a[i];.  
298d0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
298e0 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 0a 20  >zDatabase==0 . 
298f0 20 20 20 20 20 20 20 20 26 26 20 70 49 74 65 6d          && pItem
29900 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20 20 20 20  ->zName!=0 .    
29910 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74       && 0==sqlit
29920 65 33 53 74 72 49 43 6d 70 28 70 49 74 65 6d 2d  e3StrICmp(pItem-
29930 3e 7a 4e 61 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e  >zName, pCte->zN
29940 61 6d 65 29 0a 20 20 20 20 20 20 20 20 20 20 29  ame).          )
29950 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
29960 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a  m->pTab = pTab;.
29970 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
29980 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  >fg.isRecursive 
29990 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
299a0 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a  Tab->nTabRef++;.
299b0 20 20 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e            pSel->
299c0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52  selFlags |= SF_R
299d0 65 63 75 72 73 69 76 65 3b 0a 20 20 20 20 20 20  ecursive;.      
299e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
299f0 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f  }..    /* Only o
29a00 6e 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66  ne recursive ref
29a10 65 72 65 6e 63 65 20 69 73 20 70 65 72 6d 69 74  erence is permit
29a20 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69 66 28  ted. */ .    if(
29a30 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e 32   pTab->nTabRef>2
29a40 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
29a50 33 45 72 72 6f 72 4d 73 67 28 0a 20 20 20 20 20  3ErrorMsg(.     
29a60 20 20 20 20 20 70 50 61 72 73 65 2c 20 22 6d 75       pParse, "mu
29a70 6c 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65  ltiple reference
29a80 73 20 74 6f 20 72 65 63 75 72 73 69 76 65 20 74  s to recursive t
29a90 61 62 6c 65 3a 20 25 73 22 2c 20 70 43 74 65 2d  able: %s", pCte-
29aa0 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a  >zName.      );.
29ab0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
29ac0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
29ad0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
29ae0 62 2d 3e 6e 54 61 62 52 65 66 3d 3d 31 20 7c 7c  b->nTabRef==1 ||
29af0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28   .            ((
29b00 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53  pSel->selFlags&S
29b10 46 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20  F_Recursive) && 
29b20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3d 3d 32  pTab->nTabRef==2
29b30 20 29 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e   ));..    pCte->
29b40 7a 43 74 65 45 72 72 20 3d 20 22 63 69 72 63 75  zCteErr = "circu
29b50 6c 61 72 20 72 65 66 65 72 65 6e 63 65 3a 20 25  lar reference: %
29b60 73 22 3b 0a 20 20 20 20 70 53 61 76 65 64 57 69  s";.    pSavedWi
29b70 74 68 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69  th = pParse->pWi
29b80 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  th;.    pParse->
29b90 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20  pWith = pWith;. 
29ba0 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72     if( bMayRecur
29bb0 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 53 65  sive ){.      Se
29bc0 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70  lect *pPrior = p
29bd0 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  Sel->pPrior;.   
29be0 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f     assert( pPrio
29bf0 72 2d 3e 70 57 69 74 68 3d 3d 30 20 29 3b 0a 20  r->pWith==0 );. 
29c00 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 57 69       pPrior->pWi
29c10 74 68 20 3d 20 70 53 65 6c 2d 3e 70 57 69 74 68  th = pSel->pWith
29c20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  ;.      sqlite3W
29c30 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
29c40 72 2c 20 70 50 72 69 6f 72 29 3b 0a 20 20 20 20  r, pPrior);.    
29c50 20 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 20    pPrior->pWith 
29c60 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
29c70 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
29c80 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
29c90 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   pSel);.    }.  
29ca0 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
29cb0 3d 20 70 57 69 74 68 3b 0a 0a 20 20 20 20 66 6f  = pWith;..    fo
29cc0 72 28 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c  r(pLeft=pSel; pL
29cd0 65 66 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65  eft->pPrior; pLe
29ce0 66 74 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72  ft=pLeft->pPrior
29cf0 29 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20  );.    pEList = 
29d00 70 4c 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  pLeft->pEList;. 
29d10 20 20 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f     if( pCte->pCo
29d20 6c 73 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ls ){.      if( 
29d30 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
29d40 2d 3e 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e 70  ->nExpr!=pCte->p
29d50 43 6f 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  Cols->nExpr ){. 
29d60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
29d70 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
29d80 74 61 62 6c 65 20 25 73 20 68 61 73 20 25 64 20  table %s has %d 
29d90 76 61 6c 75 65 73 20 66 6f 72 20 25 64 20 63 6f  values for %d co
29da0 6c 75 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20 20  lumns",.        
29db0 20 20 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c      pCte->zName,
29dc0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20   pEList->nExpr, 
29dd0 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78  pCte->pCols->nEx
29de0 70 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  pr.        );.  
29df0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57        pParse->pW
29e00 69 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68  ith = pSavedWith
29e10 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
29e20 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
29e30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 4c       }.      pEL
29e40 69 73 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c  ist = pCte->pCol
29e50 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71  s;.    }..    sq
29e60 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d  lite3ColumnsFrom
29e70 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
29e80 20 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e   pEList, &pTab->
29e90 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f  nCol, &pTab->aCo
29ea0 6c 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79  l);.    if( bMay
29eb0 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
29ec0 20 20 20 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c     if( pSel->sel
29ed0 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
29ee0 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20  sive ){.        
29ef0 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20  pCte->zCteErr = 
29f00 22 6d 75 6c 74 69 70 6c 65 20 72 65 63 75 72 73  "multiple recurs
29f10 69 76 65 20 72 65 66 65 72 65 6e 63 65 73 3a 20  ive references: 
29f20 25 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  %s";.      }else
29f30 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e  {.        pCte->
29f40 7a 43 74 65 45 72 72 20 3d 20 22 72 65 63 75 72  zCteErr = "recur
29f50 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69  sive reference i
29f60 6e 20 61 20 73 75 62 71 75 65 72 79 3a 20 25 73  n a subquery: %s
29f70 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
29f80 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
29f90 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c  ct(pWalker, pSel
29fa0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 74  );.    }.    pCt
29fb0 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a  e->zCteErr = 0;.
29fc0 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
29fd0 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a  h = pSavedWith;.
29fe0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
29ff0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
2a000 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
2a010 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a  E_OMIT_CTE./*.**
2a020 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 70   If the SELECT p
2a030 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
2a040 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 68 61 73  ond argument has
2a050 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20 57   an associated W
2a060 49 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20  ITH .** clause, 
2a070 70 6f 70 20 69 74 20 66 72 6f 6d 20 74 68 65 20  pop it from the 
2a080 73 74 61 63 6b 20 73 74 6f 72 65 64 20 61 73 20  stack stored as 
2a090 70 61 72 74 20 6f 66 20 74 68 65 20 50 61 72 73  part of the Pars
2a0a0 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  e object..**.** 
2a0b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2a0c0 20 75 73 65 64 20 61 73 20 74 68 65 20 78 53 65   used as the xSe
2a0d0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 28 29 20  lectCallback2() 
2a0e0 63 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73  callback by.** s
2a0f0 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
2a100 6e 64 28 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e  nd() when walkin
2a110 67 20 61 20 53 45 4c 45 43 54 20 74 72 65 65 20  g a SELECT tree 
2a120 74 6f 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65  to resolve table
2a130 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74  .** names and ot
2a140 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  her FROM clause 
2a150 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74  elements. .*/.st
2a160 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
2a170 50 6f 70 57 69 74 68 28 57 61 6c 6b 65 72 20 2a  PopWith(Walker *
2a180 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
2a190 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
2a1a0 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
2a1b0 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 4f 4b  pParse;.  if( OK
2a1c0 5f 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28  _IF_ALWAYS_TRUE(
2a1d0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 29 20 26  pParse->pWith) &
2a1e0 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  & p->pPrior==0 )
2a1f0 7b 0a 20 20 20 20 57 69 74 68 20 2a 70 57 69 74  {.    With *pWit
2a200 68 20 3d 20 66 69 6e 64 52 69 67 68 74 6d 6f 73  h = findRightmos
2a210 74 28 70 29 2d 3e 70 57 69 74 68 3b 0a 20 20 20  t(p)->pWith;.   
2a220 20 69 66 28 20 70 57 69 74 68 21 3d 30 20 29 7b   if( pWith!=0 ){
2a230 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2a240 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57  Parse->pWith==pW
2a250 69 74 68 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ith );.      pPa
2a260 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69  rse->pWith = pWi
2a270 74 68 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20  th->pOuter;.    
2a280 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64  }.  }.}.#else.#d
2a290 65 66 69 6e 65 20 73 65 6c 65 63 74 50 6f 70 57  efine selectPopW
2a2a0 69 74 68 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ith 0.#endif../*
2a2b0 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 5f  .** The SrcList_
2a2c0 69 74 65 6d 20 73 74 72 75 63 74 75 72 65 20 70  item structure p
2a2d0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
2a2e0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 72 65 70  ond argument rep
2a2f0 72 65 73 65 6e 74 73 20 61 0a 2a 2a 20 73 75 62  resents a.** sub
2a300 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52  -query in the FR
2a310 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
2a320 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
2a330 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   This function.*
2a340 2a 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20  * allocates and 
2a350 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 53 72  populates the Sr
2a360 63 4c 69 73 74 5f 69 74 65 6d 2e 70 54 61 62 20  cList_item.pTab 
2a370 6f 62 6a 65 63 74 2e 20 49 66 20 73 75 63 63 65  object. If succe
2a380 73 73 66 75 6c 2c 0a 2a 2a 20 53 51 4c 49 54 45  ssful,.** SQLITE
2a390 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
2a3a0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
2a3b0 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65  n OOM error is e
2a3c0 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 53  ncountered,.** S
2a3d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a  QLITE_NOMEM..*/.
2a3e0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 61 6e  int sqlite3Expan
2a3f0 64 53 75 62 71 75 65 72 79 28 50 61 72 73 65 20  dSubquery(Parse 
2a400 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20  *pParse, struct 
2a410 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
2a420 72 6f 6d 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  rom){.  Select *
2a430 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
2a440 65 6c 65 63 74 3b 0a 20 20 54 61 62 6c 65 20 2a  elect;.  Table *
2a450 70 54 61 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  pTab;..  assert(
2a460 20 70 53 65 6c 20 29 3b 0a 20 20 70 46 72 6f 6d   pSel );.  pFrom
2a470 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
2a480 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
2a490 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ero(pParse->db, 
2a4a0 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a  sizeof(Table));.
2a4b0 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
2a4c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2a4d0 4d 45 4d 3b 0a 20 20 70 54 61 62 2d 3e 6e 54 61  MEM;.  pTab->nTa
2a4e0 62 52 65 66 20 3d 20 31 3b 0a 20 20 69 66 28 20  bRef = 1;.  if( 
2a4f0 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b  pFrom->zAlias ){
2a500 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  .    pTab->zName
2a510 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
2a520 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
2a530 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  From->zAlias);. 
2a540 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 62   }else{.    pTab
2a550 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
2a560 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
2a570 3e 64 62 2c 20 22 73 75 62 71 75 65 72 79 5f 25  >db, "subquery_%
2a580 75 22 2c 20 70 53 65 6c 2d 3e 73 65 6c 49 64 29  u", pSel->selId)
2a590 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  ;.  }.  while( p
2a5a0 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70  Sel->pPrior ){ p
2a5b0 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69  Sel = pSel->pPri
2a5c0 6f 72 3b 20 7d 0a 20 20 73 71 6c 69 74 65 33 43  or; }.  sqlite3C
2a5d0 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
2a5e0 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  st(pParse, pSel-
2a5f0 3e 70 45 4c 69 73 74 2c 26 70 54 61 62 2d 3e 6e  >pEList,&pTab->n
2a600 43 6f 6c 2c 26 70 54 61 62 2d 3e 61 43 6f 6c 29  Col,&pTab->aCol)
2a610 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20  ;.  pTab->iPKey 
2a620 3d 20 2d 31 3b 0a 20 20 70 54 61 62 2d 3e 6e 52  = -1;.  pTab->nR
2a630 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20  owLogEst = 200; 
2a640 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c  assert( 200==sql
2a650 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35  ite3LogEst(10485
2a660 37 36 29 20 29 3b 0a 20 20 70 54 61 62 2d 3e 74  76) );.  pTab->t
2a670 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70  abFlags |= TF_Ep
2a680 68 65 6d 65 72 61 6c 3b 0a 0a 20 20 72 65 74 75  hemeral;..  retu
2a690 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2a6a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2a6b0 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20  ine is a Walker 
2a6c0 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78  callback for "ex
2a6d0 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43  panding" a SELEC
2a6e0 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
2a6f0 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e  "Expanding" mean
2a700 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c  s to do the foll
2a710 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
2a720 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56  (1)  Make sure V
2a730 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
2a740 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73  rs have been ass
2a750 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a  igned to every.*
2a760 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e  *         elemen
2a770 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
2a780 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ause..**.**    (
2a790 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  2)  Fill in the 
2a7a0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54  pTabList->a[].pT
2a7b0 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  ab fields in the
2a7c0 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a   SrcList that .*
2a7d0 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65  *         define
2a7e0 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
2a7f0 57 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61  When views appea
2a800 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  r in the FROM cl
2a810 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20  ause,.**        
2a820 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e   fill pTabList->
2a830 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68  a[].pSelect with
2a840 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53   a copy of the S
2a850 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
2a860 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20  **         that 
2a870 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76  implements the v
2a880 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20  iew.  A copy is 
2a890 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77  made of the view
2a8a0 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  's SELECT.**    
2a8b0 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73       statement s
2a8c0 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72  o that we can fr
2a8d0 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64  eely modify or d
2a8e0 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65  elete that state
2a8f0 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
2a900 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67  without worrying
2a910 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75   about messing u
2a920 70 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  p the persistent
2a930 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a   representation.
2a940 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68  **         of th
2a950 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20  e view..**.**   
2a960 20 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20   (3)  Add terms 
2a970 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
2a980 75 73 65 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61  use to accommoda
2a990 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  te the NATURAL k
2a9a0 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20  eyword.**       
2a9b0 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74    on joins and t
2a9c0 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  he ON and USING 
2a9d0 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e  clause of joins.
2a9e0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53  .**.**    (4)  S
2a9f0 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20  can the list of 
2aa00 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
2aa10 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73  esult set (pELis
2aa20 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20  t) looking.**   
2aa30 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e        for instan
2aa40 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f  ces of the "*" o
2aa50 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54  perator or the T
2aa60 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e  ABLE.* operator.
2aa70 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66  .**         If f
2aa80 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63  ound, expand eac
2aa90 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72  h "*" to be ever
2aaa0 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72  y column in ever
2aab0 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20  y table.**      
2aac0 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74     and TABLE.* t
2aad0 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
2aae0 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a  n in TABLE..**.*
2aaf0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  /.static int sel
2ab00 65 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b  ectExpander(Walk
2ab10 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
2ab20 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
2ab30 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
2ab40 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e  er->pParse;.  in
2ab50 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63  t i, j, k;.  Src
2ab60 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
2ab70 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
2ab80 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  st;.  struct Src
2ab90 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
2aba0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2abb0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
2abc0 45 78 70 72 20 2a 70 45 2c 20 2a 70 52 69 67 68  Expr *pE, *pRigh
2abd0 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75 31 36  t, *pExpr;.  u16
2abe0 20 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73   selFlags = p->s
2abf0 65 6c 46 6c 61 67 73 3b 0a 20 20 75 33 32 20 65  elFlags;.  u32 e
2ac00 6c 69 73 74 46 6c 61 67 73 20 3d 20 30 3b 0a 0a  listFlags = 0;..
2ac10 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
2ac20 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20   SF_Expanded;.  
2ac30 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2ac40 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74  iled  ){.    ret
2ac50 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
2ac60 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
2ac70 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28  pSrc!=0 );.  if(
2ac80 20 28 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f   (selFlags & SF_
2ac90 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a  Expanded)!=0 ){.
2aca0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
2acb0 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rune;.  }.  pTab
2acc0 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
2acd0 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
2ace0 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 57  List;.  sqlite3W
2acf0 69 74 68 50 75 73 68 28 70 50 61 72 73 65 2c 20  ithPush(pParse, 
2ad00 70 2d 3e 70 57 69 74 68 2c 20 30 29 3b 0a 0a 20  p->pWith, 0);.. 
2ad10 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75   /* Make sure cu
2ad20 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76  rsor numbers hav
2ad30 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20  e been assigned 
2ad40 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  to all entries i
2ad50 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  n.  ** the FROM 
2ad60 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45  clause of the SE
2ad70 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
2ad80 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72    */.  sqlite3Sr
2ad90 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
2ada0 72 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  rs(pParse, pTabL
2adb0 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b  ist);..  /* Look
2adc0 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20   up every table 
2add0 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f  named in the FRO
2ade0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
2adf0 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a  select.  If.  **
2ae00 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
2ae10 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
2ae20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73 74 65  a subquery inste
2ae30 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  ad of a table or
2ae40 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e   view,.  ** then
2ae50 20 63 72 65 61 74 65 20 61 20 74 72 61 6e 73 69   create a transi
2ae60 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
2ae70 75 72 65 20 74 6f 20 64 65 73 63 72 69 62 65 20  ure to describe 
2ae80 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
2ae90 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  */.  for(i=0, pF
2aea0 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
2aeb0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
2aec0 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
2aed0 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
2aee0 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
2aef0 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72  From->fg.isRecur
2af00 73 69 76 65 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d  sive==0 || pFrom
2af10 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ->pTab!=0 );.   
2af20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69   if( pFrom->fg.i
2af30 73 52 65 63 75 72 73 69 76 65 20 29 20 63 6f 6e  sRecursive ) con
2af40 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
2af50 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
2af60 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 );.#ifndef SQL
2af70 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20  ITE_OMIT_CTE.   
2af80 20 69 66 28 20 77 69 74 68 45 78 70 61 6e 64 28   if( withExpand(
2af90 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29 20  pWalker, pFrom) 
2afa0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
2afb0 72 74 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f  rt;.    if( pFro
2afc0 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c 73  m->pTab ) {} els
2afd0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
2afe0 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pFrom->zName==0
2aff0 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
2b000 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
2b010 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
2b020 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
2b030 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41  lect;.      /* A
2b040 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68   sub-query in th
2b050 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
2b060 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20   a SELECT */.   
2b070 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 21     assert( pSel!
2b080 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
2b090 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
2b0a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
2b0b0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
2b0c0 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29  t(pWalker, pSel)
2b0d0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
2b0e0 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ort;.      if( s
2b0f0 71 6c 69 74 65 33 45 78 70 61 6e 64 53 75 62 71  qlite3ExpandSubq
2b100 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 46 72  uery(pParse, pFr
2b110 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  om) ) return WRC
2b120 5f 41 62 6f 72 74 3b 0a 23 65 6e 64 69 66 0a 20  _Abort;.#endif. 
2b130 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b140 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74  /* An ordinary t
2b150 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d  able or view nam
2b160 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
2b170 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  ause */.      as
2b180 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
2b190 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46  b==0 );.      pF
2b1a0 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
2b1b0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
2b1c0 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65  TableItem(pParse
2b1d0 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20  , 0, pFrom);.   
2b1e0 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
2b1f0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
2b200 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  t;.      if( pTa
2b210 62 2d 3e 6e 54 61 62 52 65 66 3e 3d 30 78 66 66  b->nTabRef>=0xff
2b220 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ff ){.        sq
2b230 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2b240 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
2b250 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22  references to \"
2b260 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22  %s\": max 65535"
2b270 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61  ,.           pTa
2b280 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
2b290 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
2b2a0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
2b2b0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
2b2c0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62      }.      pTab
2b2d0 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20  ->nTabRef++;.   
2b2e0 20 20 20 69 66 28 20 21 49 73 56 69 72 74 75 61     if( !IsVirtua
2b2f0 6c 28 70 54 61 62 29 20 26 26 20 63 61 6e 6e 6f  l(pTab) && canno
2b300 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  tBeFunction(pPar
2b310 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20  se, pFrom) ){.  
2b320 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
2b330 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
2b340 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
2b350 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
2b360 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49  | !defined (SQLI
2b370 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2b380 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20  ABLE).      if( 
2b390 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
2b3a0 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  || pTab->pSelect
2b3b0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 31 36 20   ){.        i16 
2b3c0 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 66  nCol;.        if
2b3d0 28 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  ( sqlite3ViewGet
2b3e0 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
2b3f0 73 65 2c 20 70 54 61 62 29 20 29 20 72 65 74 75  se, pTab) ) retu
2b400 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
2b410 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
2b420 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  rom->pSelect==0 
2b430 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d  );.        pFrom
2b440 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
2b450 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
2b460 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20   pTab->pSelect, 
2b470 30 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c  0);.        nCol
2b480 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20   = pTab->nCol;. 
2b490 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f         pTab->nCo
2b4a0 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  l = -1;.        
2b4b0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
2b4c0 74 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d  t(pWalker, pFrom
2b4d0 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
2b4e0 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d      pTab->nCol =
2b4f0 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 23   nCol;.      }.#
2b500 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
2b510 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69   /* Locate the i
2b520 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74 68  ndex named by th
2b530 65 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  e INDEXED BY cla
2b540 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a  use, if any. */.
2b550 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
2b560 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70  ndexedByLookup(p
2b570 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b  Parse, pFrom) ){
2b580 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
2b590 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20  C_Abort;.    }. 
2b5a0 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73   }..  /* Process
2b5b0 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
2b5c0 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53  s, and ON and US
2b5d0 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a  ING clauses of j
2b5e0 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  oins..  */.  if(
2b5f0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2b600 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63 65  d || sqliteProce
2b610 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70  ssJoin(pParse, p
2b620 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2b630 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a  WRC_Abort;.  }..
2b640 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22    /* For every "
2b650 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  *" that occurs i
2b660 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  n the column lis
2b670 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  t, insert the na
2b680 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20  mes of.  ** all 
2b690 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74  columns in all t
2b6a0 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20  ables.  And for 
2b6b0 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e  every TABLE.* in
2b6c0 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20  sert the names. 
2b6d0 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d   ** of all colum
2b6e0 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68  ns in TABLE.  Th
2b6f0 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74 65  e parser inserte
2b700 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72  d a special expr
2b710 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68  ession.  ** with
2b720 20 74 68 65 20 54 4b 5f 41 53 54 45 52 49 53 4b   the TK_ASTERISK
2b730 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61   operator for ea
2b740 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66  ch "*" that it f
2b750 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75  ound in the colu
2b760 6d 6e 0a 20 20 2a 2a 20 6c 69 73 74 2e 20 20 54  mn.  ** list.  T
2b770 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
2b780 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f  e just has to lo
2b790 63 61 74 65 20 74 68 65 20 54 4b 5f 41 53 54 45  cate the TK_ASTE
2b7a0 52 49 53 4b 0a 20 20 2a 2a 20 65 78 70 72 65 73  RISK.  ** expres
2b7b0 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64  sions and expand
2b7c0 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65   each one to the
2b7d0 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c   list of all col
2b7e0 75 6d 6e 73 20 69 6e 0a 20 20 2a 2a 20 61 6c 6c  umns in.  ** all
2b7f0 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
2b800 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f  ** The first loo
2b810 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f  p just checks to
2b820 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72   see if there ar
2b830 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74  e any "*" operat
2b840 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65  ors.  ** that ne
2b850 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20  ed expanding..  
2b860 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  */.  for(k=0; k<
2b870 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b  pEList->nExpr; k
2b880 2b 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20 70 45  ++){.    pE = pE
2b890 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72  List->a[k].pExpr
2b8a0 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70  ;.    if( pE->op
2b8b0 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20  ==TK_ASTERISK ) 
2b8c0 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72  break;.    asser
2b8d0 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  t( pE->op!=TK_DO
2b8e0 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21  T || pE->pRight!
2b8f0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2b900 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54  ( pE->op!=TK_DOT
2b910 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d   || (pE->pLeft!=
2b920 30 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  0 && pE->pLeft->
2b930 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20  op==TK_ID) );.  
2b940 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
2b950 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67  _DOT && pE->pRig
2b960 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52  ht->op==TK_ASTER
2b970 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ISK ) break;.   
2b980 20 65 6c 69 73 74 46 6c 61 67 73 20 7c 3d 20 70   elistFlags |= p
2b990 45 2d 3e 66 6c 61 67 73 3b 0a 20 20 7d 0a 20 20  E->flags;.  }.  
2b9a0 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  if( k<pEList->nE
2b9b0 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  xpr ){.    /*.  
2b9c0 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68    ** If we get h
2b9d0 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ere it means the
2b9e0 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74   result set cont
2b9f0 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
2ba00 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72   "*".    ** oper
2ba10 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20  ators that need 
2ba20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20  to be expanded. 
2ba30 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61   Loop through ea
2ba40 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  ch expression.  
2ba50 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
2ba60 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e  lt set and expan
2ba70 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e  d them one by on
2ba80 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  e..    */.    st
2ba90 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
2baa0 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e  em *a = pEList->
2bab0 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  a;.    ExprList 
2bac0 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69  *pNew = 0;.    i
2bad0 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73  nt flags = pPars
2bae0 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20  e->db->flags;.  
2baf0 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20    int longNames 
2bb00 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
2bb10 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21  E_FullColNames)!
2bb20 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
2bb30 20 20 20 20 20 20 20 20 20 26 26 20 28 66 6c 61           && (fla
2bb40 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
2bb50 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a  tColNames)==0;..
2bb60 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
2bb70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
2bb80 2b 29 7b 0a 20 20 20 20 20 20 70 45 20 3d 20 61  +){.      pE = a
2bb90 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [k].pExpr;.     
2bba0 20 65 6c 69 73 74 46 6c 61 67 73 20 7c 3d 20 70   elistFlags |= p
2bbb0 45 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20  E->flags;.      
2bbc0 70 52 69 67 68 74 20 3d 20 70 45 2d 3e 70 52 69  pRight = pE->pRi
2bbd0 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ght;.      asser
2bbe0 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  t( pE->op!=TK_DO
2bbf0 54 20 7c 7c 20 70 52 69 67 68 74 21 3d 30 20 29  T || pRight!=0 )
2bc00 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e  ;.      if( pE->
2bc10 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 0a  op!=TK_ASTERISK.
2bc20 20 20 20 20 20 20 20 26 26 20 28 70 45 2d 3e 6f         && (pE->o
2bc30 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69  p!=TK_DOT || pRi
2bc40 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45  ght->op!=TK_ASTE
2bc50 52 49 53 4b 29 0a 20 20 20 20 20 20 29 7b 0a 20  RISK).      ){. 
2bc60 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70         /* This p
2bc70 61 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73  articular expres
2bc80 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65  sion does not ne
2bc90 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
2bca0 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
2bcb0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
2bcc0 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
2bcd0 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  nd(pParse, pNew,
2bce0 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20   a[k].pExpr);.  
2bcf0 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29        if( pNew )
2bd00 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
2bd10 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d  ->a[pNew->nExpr-
2bd20 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e  1].zName = a[k].
2bd30 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
2bd40 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
2bd50 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20  Expr-1].zSpan = 
2bd60 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[k].zSpan;.    
2bd70 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65        a[k].zName
2bd80 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2bd90 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a  a[k].zSpan = 0;.
2bda0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bdb0 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30    a[k].pExpr = 0
2bdc0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2bdd0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65         /* This e
2bde0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22  xpression is a "
2bdf0 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a  *" or a "TABLE.*
2be00 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  " and needs to b
2be10 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70  e.        ** exp
2be20 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  anded. */.      
2be30 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20    int tableSeen 
2be40 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74  = 0;      /* Set
2be50 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45   to 1 when TABLE
2be60 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20   matches */.    
2be70 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65      char *zTName
2be80 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 74   = 0;       /* t
2be90 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54  ext of name of T
2bea0 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  ABLE */.        
2beb0 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
2bec0 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OT ){.          
2bed0 61 73 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66  assert( pE->pLef
2bee0 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
2bef0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2bf00 61 73 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70  asProperty(pE->p
2bf10 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Left, EP_IntValu
2bf20 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
2bf30 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65  zTName = pE->pLe
2bf40 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  ft->u.zToken;.  
2bf50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bf60 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
2bf70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
2bf80 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
2bf90 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
2bfa0 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
2bfb0 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ab = pFrom->pTab
2bfc0 3b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65  ;.          Sele
2bfd0 63 74 20 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d  ct *pSub = pFrom
2bfe0 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
2bff0 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e       char *zTabN
2c000 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c  ame = pFrom->zAl
2c010 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ias;.          c
2c020 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65  onst char *zSche
2c030 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  maName = 0;.    
2c040 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
2c050 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61           if( zTa
2c060 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  bName==0 ){.    
2c070 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65          zTabName
2c080 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
2c090 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c0a0 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
2c0b0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65  llocFailed ) bre
2c0c0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ak;.          if
2c0d0 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53  ( pSub==0 || (pS
2c0e0 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
2c0f0 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30  F_NestedFrom)==0
2c100 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c110 70 53 75 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pSub = 0;.      
2c120 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
2c130 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
2c140 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e  mp(zTName, zTabN
2c150 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
2c160 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
2c170 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
2c180 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 44 62  .            iDb
2c190 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
2c1a0 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
2c1b0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
2c1c0 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e          zSchemaN
2c1d0 61 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64  ame = iDb>=0 ? d
2c1e0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
2c1f0 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20  Name : "*";.    
2c200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c210 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
2c220 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
2c230 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
2c240 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61  *zName = pTab->a
2c250 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col[j].zName;.  
2c260 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
2c270 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68  zColname;  /* Th
2c280 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d  e computed colum
2c290 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
2c2a0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 46        char *zToF
2c2b0 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ree;   /* Malloc
2c2c0 65 64 20 73 74 72 69 6e 67 20 74 68 61 74 20 6e  ed string that n
2c2d0 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64  eeds to be freed
2c2e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2c2f0 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20  Token sColname; 
2c300 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c   /* Computed col
2c310 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74 6f  umn name as a to
2c320 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ken */..        
2c330 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d      assert( zNam
2c340 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e );.           
2c350 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 70   if( zTName && p
2c360 53 75 62 0a 20 20 20 20 20 20 20 20 20 20 20 20  Sub.            
2c370 20 26 26 20 73 71 6c 69 74 65 33 4d 61 74 63 68   && sqlite3Match
2c380 53 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70  SpanName(pSub->p
2c390 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61  EList->a[j].zSpa
2c3a0 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29  n, 0, zTName, 0)
2c3b0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
2c3c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2c3d0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2c3e0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2c3f0 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f        /* If a co
2c400 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61  lumn is marked a
2c410 73 20 27 68 69 64 64 65 6e 27 2c 20 6f 6d 69 74  s 'hidden', omit
2c420 20 69 74 20 66 72 6f 6d 20 74 68 65 20 65 78 70   it from the exp
2c430 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20 20  anded.          
2c440 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20    ** result-set 
2c450 6c 69 73 74 20 75 6e 6c 65 73 73 20 74 68 65 20  list unless the 
2c460 53 45 4c 45 43 54 20 68 61 73 20 74 68 65 20 53  SELECT has the S
2c470 46 5f 49 6e 63 6c 75 64 65 48 69 64 64 65 6e 0a  F_IncludeHidden.
2c480 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62              ** b
2c490 69 74 20 73 65 74 2e 0a 20 20 20 20 20 20 20 20  it set..        
2c4a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
2c4b0 20 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c     if( (p->selFl
2c4c0 61 67 73 20 26 20 53 46 5f 49 6e 63 6c 75 64 65  ags & SF_Include
2c4d0 48 69 64 64 65 6e 29 3d 3d 30 0a 20 20 20 20 20  Hidden)==0.     
2c4e0 20 20 20 20 20 20 20 20 26 26 20 49 73 48 69 64          && IsHid
2c4f0 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d  denColumn(&pTab-
2c500 3e 61 43 6f 6c 5b 6a 5d 29 20 0a 20 20 20 20 20  >aCol[j]) .     
2c510 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2c520 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2c530 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2c540 20 20 20 20 20 20 20 20 20 20 20 20 74 61 62 6c              tabl
2c550 65 53 65 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20  eSeen = 1;..    
2c560 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20          if( i>0 
2c570 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a  && zTName==0 ){.
2c580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2c590 28 20 28 70 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69  ( (pFrom->fg.joi
2c5a0 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
2c5b0 41 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  AL)!=0.         
2c5c0 20 20 20 20 20 20 20 26 26 20 74 61 62 6c 65 41         && tableA
2c5d0 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54  ndColumnIndex(pT
2c5e0 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65  abList, i, zName
2c5f0 2c 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20 20  , 0, 0).        
2c600 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2c610 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
2c620 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f   NATURAL join, o
2c630 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c  mit the join col
2c640 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20  umns from the . 
2c650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2c660 2a 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 72  * table to the r
2c670 69 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  ight of the join
2c680 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2c690 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2c6a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2c6b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2c6c0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64  sqlite3IdListInd
2c6d0 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67  ex(pFrom->pUsing
2c6e0 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20  , zName)>=0 ){. 
2c6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c700 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68  * In a join with
2c710 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c   a USING clause,
2c720 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e   omit columns in
2c730 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
2c740 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c       ** using cl
2c750 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61  ause from the ta
2c760 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ble on the right
2c770 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
2c780 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2c790 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2c7a0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2c7b0 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20           pRight 
2c7c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
2c7d0 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b  , TK_ID, zName);
2c7e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f  .            zCo
2c7f0 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  lname = zName;. 
2c800 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72             zToFr
2c810 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ee = 0;.        
2c820 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65      if( longName
2c830 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e  s || pTabList->n
2c840 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  Src>1 ){.       
2c850 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65         Expr *pLe
2c860 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ft;.            
2c870 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65    pLeft = sqlite
2c880 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c  3Expr(db, TK_ID,
2c890 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20   zTabName);.    
2c8a0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
2c8b0 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
2c8c0 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
2c8d0 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
2c8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2c8f0 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a   zSchemaName ){.
2c900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c910 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
2c920 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a  xpr(db, TK_ID, z
2c930 53 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20  SchemaName);.   
2c940 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
2c950 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
2c960 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54  r(pParse, TK_DOT
2c970 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b  , pLeft, pExpr);
2c980 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2c990 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2c9a0 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a  f( longNames ){.
2c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c9c0 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74  zColname = sqlit
2c9d0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
2c9e0 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c  s.%s", zTabName,
2c9f0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
2ca00 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65           zToFree
2ca10 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20   = zColname;.   
2ca20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2ca30 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
2ca50 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  xpr = pRight;.  
2ca60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2ca70 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
2ca80 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
2ca90 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65  pend(pParse, pNe
2caa0 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  w, pExpr);.     
2cab0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f         sqlite3To
2cac0 6b 65 6e 49 6e 69 74 28 26 73 43 6f 6c 6e 61 6d  kenInit(&sColnam
2cad0 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20  e, zColname);.  
2cae0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2caf0 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
2cb00 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26  (pParse, pNew, &
2cb10 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20  sColname, 0);.  
2cb20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
2cb30 65 77 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61  ew && (p->selFla
2cb40 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72  gs & SF_NestedFr
2cb50 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  om)!=0 ){.      
2cb60 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
2cb70 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58  xprList_item *pX
2cb80 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77   = &pNew->a[pNew
2cb90 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
2cba0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
2cbb0 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ub ){.          
2cbc0 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20        pX->zSpan 
2cbd0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
2cbe0 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69  p(db, pSub->pELi
2cbf0 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b  st->a[j].zSpan);
2cc00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2cc10 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a   testcase( pX->z
2cc20 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Span==0 );.     
2cc30 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2cc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc50 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  pX->zSpan = sqli
2cc60 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
2cc70 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20  %s.%s.%s",.     
2cc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cca0 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d        zSchemaNam
2ccb0 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f  e, zTabName, zCo
2ccc0 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  lname);.        
2ccd0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2cce0 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29  ( pX->zSpan==0 )
2ccf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2cd00 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
2cd10 70 58 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d  pX->bSpanIsTab =
2cd20 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
2cd30 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  }.            sq
2cd40 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2cd50 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20  zToFree);.      
2cd60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2cd70 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62          if( !tab
2cd80 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20  leSeen ){.      
2cd90 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29      if( zTName )
2cda0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
2cdb0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2cdc0 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
2cdd0 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d  able: %s", zTNam
2cde0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  e);.          }e
2cdf0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2ce00 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2ce10 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62  (pParse, "no tab
2ce20 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b  les specified");
2ce30 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2ce40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2ce50 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2ce60 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
2ce70 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b, pEList);.    
2ce80 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77  p->pEList = pNew
2ce90 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
2cea0 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 66 28  EList ){.    if(
2ceb0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
2cec0 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  r>db->aLimit[SQL
2ced0 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
2cee0 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ] ){.      sqlit
2cef0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2cf00 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c  e, "too many col
2cf10 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73  umns in result s
2cf20 65 74 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  et");.      retu
2cf30 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
2cf40 20 20 7d 0a 20 20 20 20 69 66 28 20 28 65 6c 69    }.    if( (eli
2cf50 73 74 46 6c 61 67 73 20 26 20 28 45 50 5f 48 61  stFlags & (EP_Ha
2cf60 73 46 75 6e 63 7c 45 50 5f 53 75 62 71 75 65 72  sFunc|EP_Subquer
2cf70 79 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  y))!=0 ){.      
2cf80 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
2cf90 46 5f 43 6f 6d 70 6c 65 78 52 65 73 75 6c 74 3b  F_ComplexResult;
2cfa0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2cfb0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
2cfc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70  ;.}../*.** No-op
2cfd0 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65   routine for the
2cfe0 20 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b   parse-tree walk
2cff0 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  er..**.** When t
2d000 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
2d010 68 65 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43  he Walker.xExprC
2d020 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70  allback then exp
2d030 72 65 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a  ression trees.**
2d040 20 61 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68   are walked with
2d050 6f 75 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20  out any actions 
2d060 62 65 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65  being taken at e
2d070 61 63 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75  ach node.  Presu
2d080 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74  mably,.** when t
2d090 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
2d0a0 73 65 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78  sed for Walker.x
2d0b0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65  ExprCallback the
2d0c0 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65  n .** Walker.xSe
2d0d0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20  lectCallback is 
2d0e0 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68  set to do someth
2d0f0 69 6e 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65  ing useful for e
2d100 76 65 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72  very .** subquer
2d110 79 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20  y in the parser 
2d120 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tree..*/.int sql
2d130 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70  ite3ExprWalkNoop
2d140 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64  (Walker *NotUsed
2d150 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32  , Expr *NotUsed2
2d160 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2d170 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
2d180 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74  NotUsed2);.  ret
2d190 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
2d1a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70  ;.}../*.** No-op
2d1b0 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65   routine for the
2d1c0 20 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b   parse-tree walk
2d1d0 65 72 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74  er for SELECT st
2d1e0 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 20 73 75 62  atements..** sub
2d1f0 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72  query in the par
2d200 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74  ser tree..*/.int
2d210 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61   sqlite3SelectWa
2d220 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e  lkNoop(Walker *N
2d230 6f 74 55 73 65 64 2c 20 53 65 6c 65 63 74 20 2a  otUsed, Select *
2d240 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
2d250 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
2d260 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
2d270 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  );.  return WRC_
2d280 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66  Continue;.}..#if
2d290 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
2d2a0 0a 2a 2a 20 41 6c 77 61 79 73 20 61 73 73 65 72  .** Always asser
2d2b0 74 2e 20 20 54 68 69 73 20 78 53 65 6c 65 63 74  t.  This xSelect
2d2c0 43 61 6c 6c 62 61 63 6b 32 20 69 6d 70 6c 65 6d  Callback2 implem
2d2d0 65 6e 74 61 74 69 6f 6e 20 70 72 6f 76 65 73 20  entation proves 
2d2e0 74 68 61 74 20 74 68 65 0a 2a 2a 20 78 53 65 6c  that the.** xSel
2d2f0 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 69 73 20  ectCallback2 is 
2d300 6e 65 76 65 72 20 69 6e 76 6f 6b 65 64 2e 0a 2a  never invoked..*
2d310 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
2d320 6c 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32 28  lectWalkAssert2(
2d330 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c  Walker *NotUsed,
2d340 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64   Select *NotUsed
2d350 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
2d360 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
2d370 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 61 73   NotUsed2);.  as
2d380 73 65 72 74 28 20 30 20 29 3b 0a 7d 0a 23 65 6e  sert( 0 );.}.#en
2d390 64 69 66 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  dif./*.** This r
2d3a0 6f 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22  outine "expands"
2d3b0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
2d3c0 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  ent and all of i
2d3d0 74 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  ts subqueries..*
2d3e0 2a 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  * For additional
2d3f0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
2d400 77 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f  what it means to
2d410 20 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45   "expand" a SELE
2d420 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c  CT.** statement,
2d430 20 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   see the comment
2d440 20 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78   on the selectEx
2d450 70 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c  pand worker call
2d460 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a  back above..**.*
2d470 2a 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45  * Expanding a SE
2d480 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
2d490 73 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70  s the first step
2d4a0 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61   in processing a
2d4b0 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
2d4c0 6d 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43  ment.  The SELEC
2d4d0 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74  T statement must
2d4e0 20 62 65 20 65 78 70 61 6e 64 65 64 20 62 65 66   be expanded bef
2d4f0 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f  ore.** name reso
2d500 6c 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72  lution is perfor
2d510 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  med..**.** If an
2d520 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
2d530 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  g, an error mess
2d540 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
2d550 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54  nto pParse..** T
2d560 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
2d570 69 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74  ion can detect t
2d580 68 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f  he problem by lo
2d590 6f 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d  oking at pParse-
2d5a0 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20  >nErr.** and/or 
2d5b0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
2d5c0 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61  ocFailed..*/.sta
2d5d0 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
2d5e0 53 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72  SelectExpand(Par
2d5f0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
2d600 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
2d610 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45  Walker w;.  w.xE
2d620 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71  xprCallback = sq
2d630 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f  lite3ExprWalkNoo
2d640 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20  p;.  w.pParse = 
2d650 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 4f 4b  pParse;.  if( OK
2d660 5f 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28  _IF_ALWAYS_TRUE(
2d670 70 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f  pParse->hasCompo
2d680 75 6e 64 29 20 29 7b 0a 20 20 20 20 77 2e 78 53  und) ){.    w.xS
2d690 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
2d6a0 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53  convertCompoundS
2d6b0 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 3b  electToSubquery;
2d6c0 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61  .    w.xSelectCa
2d6d0 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 20  llback2 = 0;.   
2d6e0 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
2d6f0 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b  ct(&w, pSelect);
2d700 0a 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74  .  }.  w.xSelect
2d710 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63  Callback = selec
2d720 74 45 78 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78  tExpander;.  w.x
2d730 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
2d740 3d 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 3b  = selectPopWith;
2d750 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  .  sqlite3WalkSe
2d760 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74  lect(&w, pSelect
2d770 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  );.}...#ifndef S
2d780 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
2d790 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  ERY./*.** This i
2d7a0 73 20 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65  s a Walker.xSele
2d7b0 63 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62  ctCallback callb
2d7c0 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69  ack for the sqli
2d7d0 74 65 33 53 65 6c 65 63 74 54 79 70 65 49 6e 66  te3SelectTypeInf
2d7e0 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  o().** interface
2d7f0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68  ..**.** For each
2d800 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
2d810 71 75 65 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d  query, add Colum
2d820 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c 75  n.zType and Colu
2d830 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f  mn.zColl.** info
2d840 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 54  rmation to the T
2d850 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
2d860 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74  hat represents t
2d870 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a  he result set.**
2d880 20 6f 66 20 74 68 61 74 20 73 75 62 71 75 65 72   of that subquer
2d890 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62  y..**.** The Tab
2d8a0 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
2d8b0 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65  t represents the
2d8c0 20 72 65 73 75 6c 74 20 73 65 74 20 77 61 73 20   result set was 
2d8d0 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20 62  constructed.** b
2d8e0 79 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  y selectExpander
2d8f0 28 29 20 62 75 74 20 74 68 65 20 74 79 70 65 20  () but the type 
2d900 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e  and collation in
2d910 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d  formation was om
2d920 69 74 74 65 64 0a 2a 2a 20 61 74 20 74 68 61 74  itted.** at that
2d930 20 70 6f 69 6e 74 20 62 65 63 61 75 73 65 20 69   point because i
2d940 64 65 6e 74 69 66 69 65 72 73 20 68 61 64 20 6e  dentifiers had n
2d950 6f 74 20 79 65 74 20 62 65 65 6e 20 72 65 73 6f  ot yet been reso
2d960 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72  lved.  This.** r
2d970 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2d980 20 61 66 74 65 72 20 69 64 65 6e 74 69 66 69 65   after identifie
2d990 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f  r resolution..*/
2d9a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
2d9b0 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79  ectAddSubqueryTy
2d9c0 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70  peInfo(Walker *p
2d9d0 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
2d9e0 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
2d9f0 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  rse;.  int i;.  
2da00 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
2da10 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  t;.  struct SrcL
2da20 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b  ist_item *pFrom;
2da30 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ..  assert( p->s
2da40 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73  elFlags & SF_Res
2da50 6f 6c 76 65 64 20 29 3b 0a 20 20 69 66 28 20 70  olved );.  if( p
2da60 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2da70 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65  HasTypeInfo ) re
2da80 74 75 72 6e 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c  turn;.  p->selFl
2da90 61 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70  ags |= SF_HasTyp
2daa0 65 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20  eInfo;.  pParse 
2dab0 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
2dac0 65 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  e;.  pTabList = 
2dad0 70 2d 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69  p->pSrc;.  for(i
2dae0 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
2daf0 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
2db00 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
2db10 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  rom++){.    Tabl
2db20 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
2db30 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72  >pTab;.    asser
2db40 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
2db50 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62    if( (pTab->tab
2db60 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
2db70 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  eral)!=0 ){.    
2db80 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79    /* A sub-query
2db90 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2dba0 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
2dbb0 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  */.      Select 
2dbc0 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSel = pFrom->p
2dbd0 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66  Select;.      if
2dbe0 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20  ( pSel ){.      
2dbf0 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70    while( pSel->p
2dc00 50 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70  Prior ) pSel = p
2dc10 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  Sel->pPrior;.   
2dc20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
2dc30 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
2dc40 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72  ndCollation(pPar
2dc50 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b  se, pTab, pSel);
2dc60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2dc70 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
2dc80 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2dc90 20 61 64 64 73 20 64 61 74 61 74 79 70 65 20 61   adds datatype a
2dca0 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  nd collating seq
2dcb0 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f  uence informatio
2dcc0 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c  n to.** the Tabl
2dcd0 65 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20  e structures of 
2dce0 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
2dcf0 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a  subqueries in a.
2dd00 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
2dd10 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  ent..**.** Use t
2dd20 68 69 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65  his routine afte
2dd30 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  r name resolutio
2dd40 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
2dd50 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41  d sqlite3SelectA
2dd60 64 64 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65  ddTypeInfo(Parse
2dd70 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
2dd80 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e   *pSelect){.#ifn
2dd90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2dda0 53 55 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65  SUBQUERY.  Walke
2ddb0 72 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  r w;.  w.xSelect
2ddc0 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
2ddd0 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70  e3SelectWalkNoop
2dde0 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
2ddf0 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 41  lback2 = selectA
2de00 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e  ddSubqueryTypeIn
2de10 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  fo;.  w.xExprCal
2de20 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  lback = sqlite3E
2de30 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77  xprWalkNoop;.  w
2de40 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
2de50 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53  ;.  sqlite3WalkS
2de60 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63  elect(&w, pSelec
2de70 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  t);.#endif.}.../
2de80 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2de90 65 20 73 65 74 73 20 75 70 20 61 20 53 45 4c 45  e sets up a SELE
2dea0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72  CT statement for
2deb0 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68   processing.  Th
2dec0 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  e.** following i
2ded0 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a  s accomplished:.
2dee0 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42  **.**     *  VDB
2def0 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E Cursor numbers
2df00 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f   are assigned to
2df10 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65   all FROM-clause
2df20 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a   terms..**     *
2df30 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c    Ephemeral Tabl
2df40 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72  e objects are cr
2df50 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52  eated for all FR
2df60 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
2df70 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  ries..**     *  
2df80 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
2df90 75 73 65 73 20 61 72 65 20 73 68 69 66 74 65 64  uses are shifted
2dfa0 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74   into WHERE stat
2dfb0 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20  ements.**     * 
2dfc0 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61   Wildcards "*" a
2dfd0 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20  nd "TABLE.*" in 
2dfe0 72 65 73 75 6c 74 20 73 65 74 73 20 61 72 65 20  result sets are 
2dff0 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20  expanded..**    
2e000 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73 20   *  Identifiers 
2e010 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72  in expression ar
2e020 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62  e matched to tab
2e030 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  les..**.** This 
2e040 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65 63  routine acts rec
2e050 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20  ursively on all 
2e060 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68 69  subqueries withi
2e070 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f  n the SELECT..*/
2e080 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
2e090 65 63 74 50 72 65 70 28 0a 20 20 50 61 72 73 65  ectPrep(.  Parse
2e0a0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2e0b0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
2e0c0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
2e0d0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
2e0e0 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
2e0f0 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
2e100 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61  g coded. */.  Na
2e110 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65  meContext *pOute
2e120 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e  rNC  /* Name con
2e130 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e  text for contain
2e140 65 72 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  er */.){.  asser
2e150 74 28 20 70 21 3d 30 20 7c 7c 20 70 50 61 72 73  t( p!=0 || pPars
2e160 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
2e170 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 50 61  led );.  if( pPa
2e180 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
2e190 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
2e1a0 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
2e1b0 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e  s & SF_HasTypeIn
2e1c0 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  fo ) return;.  s
2e1d0 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
2e1e0 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  nd(pParse, p);. 
2e1f0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
2e200 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  r || pParse->db-
2e210 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
2e220 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
2e230 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61  3ResolveSelectNa
2e240 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  mes(pParse, p, p
2e250 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20  OuterNC);.  if( 
2e260 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
2e270 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
2e280 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
2e290 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  n;.  sqlite3Sele
2e2a0 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50  ctAddTypeInfo(pP
2e2b0 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  arse, p);.}../*.
2e2c0 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67  ** Reset the agg
2e2d0 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
2e2e0 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67  or..**.** The ag
2e2f0 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
2e300 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66 20  tor is a set of 
2e310 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61  memory cells tha
2e320 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d  t hold.** interm
2e330 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 20 77  ediate results w
2e340 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67  hile calculating
2e350 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20   an aggregate.  
2e360 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
2e370 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
2e380 68 61 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73  hat stores NULLs
2e390 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65   in all of those
2e3a0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73   memory.** cells
2e3b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2e3c0 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
2e3d0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
2e3e0 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
2e3f0 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
2e400 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
2e410 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
2e420 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
2e430 70 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65  pFunc;.  int nRe
2e440 67 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  g = pAggInfo->nF
2e450 75 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e  unc + pAggInfo->
2e460 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e  nColumn;.  if( n
2e470 52 65 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Reg==0 ) return;
2e480 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2e490 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79  EBUG.  /* Verify
2e4a0 20 74 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66   that all AggInf
2e4b0 6f 20 72 65 67 69 73 74 65 72 73 20 61 72 65 20  o registers are 
2e4c0 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65  within the range
2e4d0 20 73 70 65 63 69 66 69 65 64 20 62 79 0a 20 20   specified by.  
2e4e0 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67  ** AggInfo.mnReg
2e4f0 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20  ..AggInfo.mxReg 
2e500 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  */.  assert( nRe
2e510 67 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52  g==pAggInfo->mxR
2e520 65 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52  eg-pAggInfo->mnR
2e530 65 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d  eg+1 );.  for(i=
2e540 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
2e550 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
2e560 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e    assert( pAggIn
2e570 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d  fo->aCol[i].iMem
2e580 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  >=pAggInfo->mnRe
2e590 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41  g.         && pA
2e5a0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e  ggInfo->aCol[i].
2e5b0 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem<=pAggInfo->
2e5c0 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66  mxReg );.  }.  f
2e5d0 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
2e5e0 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b  fo->nFunc; i++){
2e5f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67  .    assert( pAg
2e600 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e  gInfo->aFunc[i].
2e610 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem>=pAggInfo->
2e620 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26  mnReg.         &
2e630 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  & pAggInfo->aFun
2e640 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49  c[i].iMem<=pAggI
2e650 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20  nfo->mxReg );.  
2e660 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
2e670 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2e680 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67  OP_Null, 0, pAgg
2e690 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67  Info->mnReg, pAg
2e6a0 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20  gInfo->mxReg);. 
2e6b0 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49   for(pFunc=pAggI
2e6c0 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b  nfo->aFunc, i=0;
2e6d0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
2e6e0 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b  nc; i++, pFunc++
2e6f0 29 7b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63  ){.    if( pFunc
2e700 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
2e710 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
2e720 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b   = pFunc->pExpr;
2e730 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
2e740 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2e750 70 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pE, EP_xIsSelect
2e760 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
2e770 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c  E->x.pList==0 ||
2e780 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45   pE->x.pList->nE
2e790 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr!=1 ){.      
2e7a0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2e7b0 67 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49  g(pParse, "DISTI
2e7c0 4e 43 54 20 61 67 67 72 65 67 61 74 65 73 20 6d  NCT aggregates m
2e7d0 75 73 74 20 68 61 76 65 20 65 78 61 63 74 6c 79  ust have exactly
2e7e0 20 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20   one ".         
2e7f0 20 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20    "argument");. 
2e800 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44         pFunc->iD
2e810 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
2e820 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e830 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
2e840 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
2e850 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
2e860 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e  t(pParse, pE->x.
2e870 70 4c 69 73 74 2c 30 2c 30 29 3b 0a 20 20 20 20  pList,0,0);.    
2e880 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2e890 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
2e8a0 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63  Ephemeral, pFunc
2e8b0 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20  ->iDistinct, 0, 
2e8c0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
2e8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
2e8e0 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
2e8f0 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
2e900 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
2e910 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
2e920 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20   OP_AggFinalize 
2e930 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79  opcode for every
2e940 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
2e950 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67  ion.** in the Ag
2e960 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  gInfo structure.
2e970 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2e980 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
2e990 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72  ions(Parse *pPar
2e9a0 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
2e9b0 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
2e9c0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
2e9d0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
2e9e0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
2e9f0 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30  c *pF;.  for(i=0
2ea00 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pF=pAggInfo->a
2ea10 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f  Func; i<pAggInfo
2ea20 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
2ea30 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  ++){.    ExprLis
2ea40 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70  t *pList = pF->p
2ea50 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
2ea60 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2ea70 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e  HasProperty(pF->
2ea80 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
2ea90 65 63 74 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ect) );.    sqli
2eaa0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2eab0 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46   OP_AggFinal, pF
2eac0 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20  ->iMem, pList ? 
2ead0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
2eae0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2eaf0 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46  beAppendP4(v, pF
2eb00 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43  ->pFunc, P4_FUNC
2eb10 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  DEF);.  }.}.../*
2eb20 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 61  .** Update the a
2eb30 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72  ccumulator memor
2eb40 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61  y cells for an a
2eb50 67 67 72 65 67 61 74 65 20 62 61 73 65 64 20 6f  ggregate based o
2eb60 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  n.** the current
2eb70 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
2eb80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 41 63  ..**.** If regAc
2eb90 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e  c is non-zero an
2eba0 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  d there are no m
2ebb0 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 61 67  in() or max() ag
2ebc0 67 72 65 67 61 74 65 73 0a 2a 2a 20 69 6e 20 70  gregates.** in p
2ebd0 41 67 67 49 6e 66 6f 2c 20 74 68 65 6e 20 6f 6e  AggInfo, then on
2ebe0 6c 79 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  ly populate the 
2ebf0 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d  pAggInfo->nAccum
2ec00 75 6c 61 74 6f 72 20 61 63 63 75 6d 75 6c 61 74  ulator accumulat
2ec10 6f 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20  or.** registers 
2ec20 69 20 72 65 67 69 73 74 65 72 20 72 65 67 41 63  i register regAc
2ec30 63 20 63 6f 6e 74 61 69 6e 73 20 30 2e 20 54 68  c contains 0. Th
2ec40 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 61  e caller will ta
2ec50 6b 65 20 63 61 72 65 0a 2a 2a 20 6f 66 20 73 65  ke care.** of se
2ec60 74 74 69 6e 67 20 61 6e 64 20 63 6c 65 61 72 69  tting and cleari
2ec70 6e 67 20 72 65 67 41 63 63 2e 0a 2a 2f 0a 73 74  ng regAcc..*/.st
2ec80 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65  atic void update
2ec90 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73  Accumulator(Pars
2eca0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 72  e *pParse, int r
2ecb0 65 67 41 63 63 2c 20 41 67 67 49 6e 66 6f 20 2a  egAcc, AggInfo *
2ecc0 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
2ecd0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
2ece0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
2ecf0 20 69 6e 74 20 72 65 67 48 69 74 20 3d 20 30 3b   int regHit = 0;
2ed00 0a 20 20 69 6e 74 20 61 64 64 72 48 69 74 54 65  .  int addrHitTe
2ed10 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74  st = 0;.  struct
2ed20 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
2ed30 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  F;.  struct AggI
2ed40 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20  nfo_col *pC;..  
2ed50 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
2ed60 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28  Mode = 1;.  for(
2ed70 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f  i=0, pF=pAggInfo
2ed80 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49  ->aFunc; i<pAggI
2ed90 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
2eda0 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20   pF++){.    int 
2edb0 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64  nArg;.    int ad
2edc0 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  drNext = 0;.    
2edd0 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20  int regAgg;.    
2ede0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
2edf0 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70  = pF->pExpr->x.p
2ee00 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74  List;.    assert
2ee10 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2ee20 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50  ty(pF->pExpr, EP
2ee30 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
2ee40 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a     if( pList ){.
2ee50 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69        nArg = pLi
2ee60 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
2ee70 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65   regAgg = sqlite
2ee80 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
2ee90 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20  arse, nArg);.   
2eea0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
2eeb0 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
2eec0 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67  e, pList, regAgg
2eed0 2c 20 30 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c  , 0, SQLITE_ECEL
2eee0 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65  _DUP);.    }else
2eef0 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30  {.      nArg = 0
2ef00 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d  ;.      regAgg =
2ef10 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
2ef20 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e  ( pF->iDistinct>
2ef30 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  =0 ){.      addr
2ef40 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Next = sqlite3Vd
2ef50 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
2ef60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2ef70 6e 41 72 67 3d 3d 30 20 29 3b 20 20 2f 2a 20 45  nArg==0 );  /* E
2ef80 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a  rror condition *
2ef90 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
2efa0 28 20 6e 41 72 67 3e 31 20 29 3b 20 20 20 2f 2a  ( nArg>1 );   /*
2efb0 20 41 6c 73 6f 20 61 6e 20 65 72 72 6f 72 20 2a   Also an error *
2efc0 2f 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74  /.      codeDist
2efd0 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d  inct(pParse, pF-
2efe0 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72  >iDistinct, addr
2eff0 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29  Next, 1, regAgg)
2f000 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2f010 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46  pF->pFunc->funcF
2f020 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
2f030 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20  NC_NEEDCOLL ){. 
2f040 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
2f050 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  oll = 0;.      s
2f060 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
2f070 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
2f080 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61    int j;.      a
2f090 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
2f0a0 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20  );  /* pList!=0 
2f0b0 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73  if pF->pFunc has
2f0c0 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20   NEEDCOLL */.   
2f0d0 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65     for(j=0, pIte
2f0e0 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f  m=pList->a; !pCo
2f0f0 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b  ll && j<nArg; j+
2f100 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
2f110 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
2f120 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2f130 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
2f140 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
2f150 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
2f160 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
2f170 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
2f180 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
2f190 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 67 48  }.      if( regH
2f1a0 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66  it==0 && pAggInf
2f1b0 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20  o->nAccumulator 
2f1c0 29 20 72 65 67 48 69 74 20 3d 20 2b 2b 70 50 61  ) regHit = ++pPa
2f1d0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2f1e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f1f0 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71  p4(v, OP_CollSeq
2f200 2c 20 72 65 67 48 69 74 2c 20 30 2c 20 30 2c 20  , regHit, 0, 0, 
2f210 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50  (char *)pColl, P
2f220 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
2f230 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
2f240 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 67  eAddOp3(v, OP_Ag
2f250 67 53 74 65 70 2c 20 30 2c 20 72 65 67 41 67 67  gStep, 0, regAgg
2f260 2c 20 70 46 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20  , pF->iMem);.   
2f270 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
2f280 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e  ndP4(v, pF->pFun
2f290 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
2f2a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2f2b0 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e  hangeP5(v, (u8)n
2f2c0 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
2f2d0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
2f2e0 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67  e(pParse, regAgg
2f2f0 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28  , nArg);.    if(
2f300 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20   addrNext ){.   
2f310 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
2f320 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
2f330 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20  drNext);.    }. 
2f340 20 7d 0a 20 20 69 66 28 20 72 65 67 48 69 74 3d   }.  if( regHit=
2f350 3d 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e  =0 && pAggInfo->
2f360 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 7b 0a  nAccumulator ){.
2f370 20 20 20 20 72 65 67 48 69 74 20 3d 20 72 65 67      regHit = reg
2f380 41 63 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  Acc;.  }.  if( r
2f390 65 67 48 69 74 20 29 7b 0a 20 20 20 20 61 64 64  egHit ){.    add
2f3a0 72 48 69 74 54 65 73 74 20 3d 20 73 71 6c 69 74  rHitTest = sqlit
2f3b0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2f3c0 4f 50 5f 49 66 2c 20 72 65 67 48 69 74 29 3b 20  OP_If, regHit); 
2f3d0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
2f3e0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20  .  }.  for(i=0, 
2f3f0 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  pC=pAggInfo->aCo
2f400 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  l; i<pAggInfo->n
2f410 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b  Accumulator; i++
2f420 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  , pC++){.    sql
2f430 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
2f440 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20  rse, pC->pExpr, 
2f450 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20  pC->iMem);.  }. 
2f460 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63   pAggInfo->direc
2f470 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 69 66 28  tMode = 0;.  if(
2f480 20 61 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a   addrHitTest ){.
2f490 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2f4a0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 48  umpHere(v, addrH
2f4b0 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  itTest);.  }.}..
2f4c0 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
2f4d0 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e  le OP_Explain in
2f4e0 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65  struction to the
2f4f0 20 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e   VDBE to explain
2f500 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75   a simple.** cou
2f510 6e 74 28 2a 29 20 71 75 65 72 79 20 28 22 53 45  nt(*) query ("SE
2f520 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
2f530 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69  OM pTab")..*/.#i
2f540 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f550 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63  T_EXPLAIN.static
2f560 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d   void explainSim
2f570 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73  pleCount(.  Pars
2f580 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2f590 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2f5a0 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
2f5b0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
2f5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f5d0 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67    /* Table being
2f5e0 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e   queried */.  In
2f5f0 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
2f600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f610 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f   Index used to o
2f620 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72  ptimize scan, or
2f630 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66   NULL */.){.  if
2f640 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
2f650 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20  n==2 ){.    int 
2f660 62 43 6f 76 65 72 20 3d 20 28 70 49 64 78 21 3d  bCover = (pIdx!=
2f670 30 20 26 26 20 28 48 61 73 52 6f 77 69 64 28 70  0 && (HasRowid(p
2f680 54 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61  Tab) || !IsPrima
2f690 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29  ryKeyIndex(pIdx)
2f6a0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
2f6b0 64 62 65 45 78 70 6c 61 69 6e 28 70 50 61 72 73  dbeExplain(pPars
2f6c0 65 2c 20 30 2c 20 22 53 43 41 4e 20 54 41 42 4c  e, 0, "SCAN TABL
2f6d0 45 20 25 73 25 73 25 73 22 2c 0a 20 20 20 20 20  E %s%s%s",.     
2f6e0 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a     pTab->zName,.
2f6f0 20 20 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f          bCover ?
2f700 20 22 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e   " USING COVERIN
2f710 47 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a  G INDEX " : "",.
2f720 20 20 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f          bCover ?
2f730 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22   pIdx->zName : "
2f740 22 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23  ".    );.  }.}.#
2f750 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78  else.# define ex
2f760 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74  plainSimpleCount
2f770 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a  (a,b,c).#endif..
2f780 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c  /*.** sqlite3Wal
2f790 6b 45 78 70 72 28 29 20 63 61 6c 6c 62 61 63 6b  kExpr() callback
2f7a0 20 75 73 65 64 20 62 79 20 68 61 76 69 6e 67 54   used by havingT
2f7b0 6f 57 68 65 72 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  oWhere()..**.** 
2f7c0 49 66 20 74 68 65 20 6e 6f 64 65 20 70 61 73 73  If the node pass
2f7d0 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  ed to the callba
2f7e0 63 6b 20 69 73 20 61 20 54 4b 5f 41 4e 44 20 6e  ck is a TK_AND n
2f7f0 6f 64 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  ode, return .** 
2f800 57 52 43 5f 43 6f 6e 74 69 6e 75 65 20 74 6f 20  WRC_Continue to 
2f810 74 65 6c 6c 20 73 71 6c 69 74 65 33 57 61 6c 6b  tell sqlite3Walk
2f820 45 78 70 72 28 29 20 74 6f 20 69 74 65 72 61 74  Expr() to iterat
2f830 65 20 74 68 72 6f 75 67 68 20 63 68 69 6c 64 20  e through child 
2f840 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  nodes..**.** Oth
2f850 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 57  erwise, return W
2f860 52 43 5f 50 72 75 6e 65 2e 20 49 6e 20 74 68 69  RC_Prune. In thi
2f870 73 20 63 61 73 65 2c 20 61 6c 73 6f 20 63 68 65  s case, also che
2f880 63 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20 73 75  ck if the .** su
2f890 62 2d 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 74  b-expression mat
2f8a0 63 68 65 73 20 74 68 65 20 63 72 69 74 65 72 69  ches the criteri
2f8b0 61 20 66 6f 72 20 62 65 69 6e 67 20 6d 6f 76 65  a for being move
2f8c0 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 0a 2a  d to the WHERE.*
2f8d0 2a 20 63 6c 61 75 73 65 2e 20 49 66 20 73 6f 2c  * clause. If so,
2f8e0 20 61 64 64 20 69 74 20 74 6f 20 74 68 65 20 57   add it to the W
2f8f0 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64 20  HERE clause and 
2f900 72 65 70 6c 61 63 65 20 74 68 65 20 73 75 62 2d  replace the sub-
2f910 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 77 69  expression.** wi
2f920 74 68 69 6e 20 74 68 65 20 48 41 56 49 4e 47 20  thin the HAVING 
2f930 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20  expression with 
2f940 61 20 63 6f 6e 73 74 61 6e 74 20 22 31 22 2e 0a  a constant "1"..
2f950 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
2f960 76 69 6e 67 54 6f 57 68 65 72 65 45 78 70 72 43  vingToWhereExprC
2f970 62 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  b(Walker *pWalke
2f980 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
2f990 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
2f9a0 21 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20  !=TK_AND ){.    
2f9b0 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 57 61  Select *pS = pWa
2f9c0 6c 6b 65 72 2d 3e 75 2e 70 53 65 6c 65 63 74 3b  lker->u.pSelect;
2f9d0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2f9e0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
2f9f0 47 72 6f 75 70 42 79 28 70 57 61 6c 6b 65 72 2d  GroupBy(pWalker-
2fa00 3e 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  >pParse, pExpr, 
2fa10 70 53 2d 3e 70 47 72 6f 75 70 42 79 29 20 29 7b  pS->pGroupBy) ){
2fa20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
2fa30 64 62 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  db = pWalker->pP
2fa40 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20  arse->db;.      
2fa50 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
2fa60 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
2fa70 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73  , TK_INTEGER, &s
2fa80 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b  qlite3IntTokens[
2fa90 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  1], 0);.      if
2faa0 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
2fab0 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 20 3d    Expr *pWhere =
2fac0 20 70 53 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20   pS->pWhere;.   
2fad0 20 20 20 20 20 53 57 41 50 28 45 78 70 72 2c 20       SWAP(Expr, 
2fae0 2a 70 4e 65 77 2c 20 2a 70 45 78 70 72 29 3b 0a  *pNew, *pExpr);.
2faf0 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
2fb00 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
2fb10 2c 20 70 57 68 65 72 65 2c 20 70 4e 65 77 29 3b  , pWhere, pNew);
2fb20 0a 20 20 20 20 20 20 20 20 70 53 2d 3e 70 57 68  .        pS->pWh
2fb30 65 72 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ere = pNew;.    
2fb40 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
2fb50 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  de = 1;.      }.
2fb60 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
2fb70 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a   WRC_Prune;.  }.
2fb80 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2fb90 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
2fba0 54 72 61 6e 73 66 65 72 20 65 6c 69 67 69 62 6c  Transfer eligibl
2fbb0 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65  e terms from the
2fbc0 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 6f   HAVING clause o
2fbd0 66 20 61 20 71 75 65 72 79 2c 20 77 68 69 63 68  f a query, which
2fbe0 20 69 73 0a 2a 2a 20 70 72 6f 63 65 73 73 65 64   is.** processed
2fbf0 20 61 66 74 65 72 20 67 72 6f 75 70 69 6e 67 2c   after grouping,
2fc00 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
2fc10 61 75 73 65 2c 20 77 68 69 63 68 20 69 73 20 70  ause, which is p
2fc20 72 6f 63 65 73 73 65 64 20 62 65 66 6f 72 65 0a  rocessed before.
2fc30 2a 2a 20 67 72 6f 75 70 69 6e 67 2e 20 46 6f 72  ** grouping. For
2fc40 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 71 75   example, the qu
2fc50 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  ery:.**.**   SEL
2fc60 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c  ECT * FROM <tabl
2fc70 65 73 3e 20 57 48 45 52 45 20 61 3d 3f 20 47 52  es> WHERE a=? GR
2fc80 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e 47 20  OUP BY b HAVING 
2fc90 62 3d 3f 20 41 4e 44 20 63 3d 3f 0a 2a 2a 0a 2a  b=? AND c=?.**.*
2fca0 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69 74 74  * can be rewritt
2fcb0 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53  en as:.**.**   S
2fcc0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61  ELECT * FROM <ta
2fcd0 62 6c 65 73 3e 20 57 48 45 52 45 20 61 3d 3f 20  bles> WHERE a=? 
2fce0 41 4e 44 20 62 3d 3f 20 47 52 4f 55 50 20 42 59  AND b=? GROUP BY
2fcf0 20 62 20 48 41 56 49 4e 47 20 63 3d 3f 0a 2a 2a   b HAVING c=?.**
2fd00 0a 2a 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68  .** A term of th
2fd10 65 20 48 41 56 49 4e 47 20 65 78 70 72 65 73 73  e HAVING express
2fd20 69 6f 6e 20 69 73 20 65 6c 69 67 69 62 6c 65 20  ion is eligible 
2fd30 66 6f 72 20 74 72 61 6e 73 66 65 72 20 69 66 20  for transfer if 
2fd40 69 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 65  it consists.** e
2fd50 6e 74 69 72 65 6c 79 20 6f 66 20 63 6f 6e 73 74  ntirely of const
2fd60 61 6e 74 73 20 61 6e 64 20 65 78 70 72 65 73 73  ants and express
2fd70 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 61 6c  ions that are al
2fd80 73 6f 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  so GROUP BY term
2fd90 73 20 74 68 61 74 0a 2a 2a 20 75 73 65 20 74 68  s that.** use th
2fda0 65 20 22 42 49 4e 41 52 59 22 20 63 6f 6c 6c 61  e "BINARY" colla
2fdb0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a 2a  tion sequence..*
2fdc0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 61  /.static void ha
2fdd0 76 69 6e 67 54 6f 57 68 65 72 65 28 50 61 72 73  vingToWhere(Pars
2fde0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
2fdf0 74 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20  t *p){.  Walker 
2fe00 73 57 61 6c 6b 65 72 3b 0a 20 20 6d 65 6d 73 65  sWalker;.  memse
2fe10 74 28 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73  t(&sWalker, 0, s
2fe20 69 7a 65 6f 66 28 73 57 61 6c 6b 65 72 29 29 3b  izeof(sWalker));
2fe30 0a 20 20 73 57 61 6c 6b 65 72 2e 70 50 61 72 73  .  sWalker.pPars
2fe40 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 57  e = pParse;.  sW
2fe50 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
2fe60 61 63 6b 20 3d 20 68 61 76 69 6e 67 54 6f 57 68  ack = havingToWh
2fe70 65 72 65 45 78 70 72 43 62 3b 0a 20 20 73 57 61  ereExprCb;.  sWa
2fe80 6c 6b 65 72 2e 75 2e 70 53 65 6c 65 63 74 20 3d  lker.u.pSelect =
2fe90 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   p;.  sqlite3Wal
2fea0 6b 45 78 70 72 28 26 73 57 61 6c 6b 65 72 2c 20  kExpr(&sWalker, 
2feb0 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 23 69 66  p->pHaving);.#if
2fec0 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
2fed0 42 4c 45 44 0a 20 20 69 66 28 20 73 57 61 6c 6b  BLED.  if( sWalk
2fee0 65 72 2e 65 43 6f 64 65 20 26 26 20 28 73 71 6c  er.eCode && (sql
2fef0 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
2ff00 26 20 30 78 31 30 30 29 21 3d 30 20 29 7b 0a 20  & 0x100)!=0 ){. 
2ff10 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
2ff20 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x100,pParse,p,("
2ff30 4d 6f 76 65 20 48 41 56 49 4e 47 20 74 65 72 6d  Move HAVING term
2ff40 73 20 69 6e 74 6f 20 57 48 45 52 45 3a 5c 6e 22  s into WHERE:\n"
2ff50 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ));.    sqlite3T
2ff60 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
2ff70 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
2ff80 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  if.}../*.** Chec
2ff90 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
2ffa0 70 54 68 69 73 20 65 6e 74 72 79 20 6f 66 20 70  pThis entry of p
2ffb0 54 61 62 4c 69 73 74 20 69 73 20 61 20 73 65 6c  TabList is a sel
2ffc0 66 2d 6a 6f 69 6e 20 6f 66 20 61 20 70 72 69 6f  f-join of a prio
2ffd0 72 20 76 69 65 77 2e 0a 2a 2a 20 49 66 20 69 74  r view..** If it
2ffe0 20 69 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e   is, then return
2fff0 20 74 68 65 20 53 72 63 4c 69 73 74 5f 69 74 65   the SrcList_ite
30000 6d 20 66 6f 72 20 74 68 65 20 70 72 69 6f 72 20  m for the prior 
30010 76 69 65 77 2e 20 20 49 66 20 69 74 20 69 73 20  view.  If it is 
30020 6e 6f 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74  not,.** then ret
30030 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  urn 0..*/.static
30040 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
30050 69 74 65 6d 20 2a 69 73 53 65 6c 66 4a 6f 69 6e  item *isSelfJoin
30060 56 69 65 77 28 0a 20 20 53 72 63 4c 69 73 74 20  View(.  SrcList 
30070 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
30080 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
30090 6f 72 20 73 65 6c 66 2d 6a 6f 69 6e 73 20 69 6e  or self-joins in
300a0 20 74 68 69 73 20 46 52 4f 4d 20 63 6c 61 75 73   this FROM claus
300b0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
300c0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 68 69  cList_item *pThi
300d0 73 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f  s   /* Search fo
300e0 72 20 70 72 69 6f 72 20 72 65 66 65 72 65 6e 63  r prior referenc
300f0 65 20 74 6f 20 74 68 69 73 20 73 75 62 71 75 65  e to this subque
30100 72 79 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  ry */.){.  struc
30110 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
30120 70 49 74 65 6d 3b 0a 20 20 66 6f 72 28 70 49 74  pItem;.  for(pIt
30130 65 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  em = pTabList->a
30140 3b 20 70 49 74 65 6d 3c 70 54 68 69 73 3b 20 70  ; pItem<pThis; p
30150 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Item++){.    if(
30160 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3d   pItem->pSelect=
30170 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
30180 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
30190 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 20  .viaCoroutine ) 
301a0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
301b0 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pItem->zName==
301c0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
301d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
301e0 72 69 63 6d 70 28 70 49 74 65 6d 2d 3e 7a 44 61  ricmp(pItem->zDa
301f0 74 61 62 61 73 65 2c 20 70 54 68 69 73 2d 3e 7a  tabase, pThis->z
30200 44 61 74 61 62 61 73 65 29 21 3d 30 20 29 20 63  Database)!=0 ) c
30210 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
30220 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
30230 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70  (pItem->zName, p
30240 54 68 69 73 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20  This->zName)!=0 
30250 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
30260 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
30270 6f 6d 70 61 72 65 28 30 2c 20 0a 20 20 20 20 20  ompare(0, .     
30280 20 20 20 20 20 70 54 68 69 73 2d 3e 70 53 65 6c       pThis->pSel
30290 65 63 74 2d 3e 70 57 68 65 72 65 2c 20 70 49 74  ect->pWhere, pIt
302a0 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 57 68  em->pSelect->pWh
302b0 65 72 65 2c 20 2d 31 29 20 0a 20 20 20 20 29 7b  ere, -1) .    ){
302c0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69  .      /* The vi
302d0 65 77 20 77 61 73 20 6d 6f 64 69 66 69 65 64 20  ew was modified 
302e0 62 79 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70  by some other op
302f0 74 69 6d 69 7a 61 74 69 6f 6e 20 73 75 63 68 20  timization such 
30300 61 73 0a 20 20 20 20 20 20 2a 2a 20 70 75 73 68  as.      ** push
30310 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 29  DownWhereTerms()
30320 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   */.      contin
30330 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ue;.    }.    re
30340 74 75 72 6e 20 70 49 74 65 6d 3b 0a 20 20 7d 0a  turn pItem;.  }.
30350 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23    return 0;.}..#
30360 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 4f 55  ifdef SQLITE_COU
30370 4e 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a  NTOFVIEW_OPTIMIZ
30380 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41 74 74 65  ATION./*.** Atte
30390 6d 70 74 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d  mpt to transform
303a0 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20   a query of the 
303b0 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  form.**.**    SE
303c0 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
303d0 4f 4d 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f  OM (SELECT x FRO
303e0 4d 20 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53  M t1 UNION ALL S
303f0 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 32 29  ELECT y FROM t2)
30400 0a 2a 2a 0a 2a 2a 20 49 6e 74 6f 20 74 68 69 73  .**.** Into this
30410 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
30420 54 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  T (SELECT count(
30430 2a 29 20 46 52 4f 4d 20 74 31 29 2b 28 53 45 4c  *) FROM t1)+(SEL
30440 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
30450 4d 20 74 32 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20  M t2).**.** The 
30460 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 6f  transformation o
30470 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 61 6c 6c  nly works if all
30480 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
30490 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
304a0 2a 20 20 20 2a 20 20 54 68 65 20 73 75 62 71 75  *   *  The subqu
304b0 65 72 79 20 69 73 20 61 20 55 4e 49 4f 4e 20 41  ery is a UNION A
304c0 4c 4c 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  LL of two or mor
304d0 65 20 74 65 72 6d 73 0a 2a 2a 20 20 20 2a 20 20  e terms.**   *  
304e0 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
304f0 73 20 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d  s not have a LIM
30500 49 54 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 2a  IT clause.**   *
30510 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 57 48    There is no WH
30520 45 52 45 20 6f 72 20 47 52 4f 55 50 20 42 59 20  ERE or GROUP BY 
30530 6f 72 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  or HAVING clause
30540 73 20 6f 6e 20 74 68 65 20 73 75 62 71 75 65 72  s on the subquer
30550 69 65 73 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20  ies.**   *  The 
30560 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 61  outer query is a
30570 20 73 69 6d 70 6c 65 20 63 6f 75 6e 74 28 2a 29   simple count(*)
30580 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  .**.** Return TR
30590 55 45 20 69 66 20 74 68 65 20 6f 70 74 69 6d 69  UE if the optimi
305a0 7a 61 74 69 6f 6e 20 69 73 20 75 6e 64 65 72 74  zation is undert
305b0 61 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aken..*/.static 
305c0 69 6e 74 20 63 6f 75 6e 74 4f 66 56 69 65 77 4f  int countOfViewO
305d0 70 74 69 6d 69 7a 61 74 69 6f 6e 28 50 61 72 73  ptimization(Pars
305e0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
305f0 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74 20  t *p){.  Select 
30600 2a 70 53 75 62 2c 20 2a 70 50 72 69 6f 72 3b 0a  *pSub, *pPrior;.
30610 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20    Expr *pExpr;. 
30620 20 45 78 70 72 20 2a 70 43 6f 75 6e 74 3b 0a 20   Expr *pCount;. 
30630 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
30640 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
30650 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
30660 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
30670 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20    /* This is an 
30680 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 69  aggregate */.  i
30690 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  f( p->pEList->nE
306a0 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
306b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
306c0 20 2f 2a 20 53 69 6e 67 6c 65 20 72 65 73 75 6c   /* Single resul
306d0 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 70 45  t column */.  pE
306e0 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
306f0 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[0].pExpr;.  i
30700 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
30710 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20  _AGG_FUNCTION ) 
30720 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
30730 20 2f 2a 20 52 65 73 75 6c 74 20 69 73 20 61 6e   /* Result is an
30740 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20   aggregate */.  
30750 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
30760 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  cmp(pExpr->u.zTo
30770 6b 65 6e 2c 22 63 6f 75 6e 74 22 29 20 29 20 72  ken,"count") ) r
30780 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 49 73 20  eturn 0;  /* Is 
30790 63 6f 75 6e 74 28 29 20 2a 2f 0a 20 20 69 66 28  count() */.  if(
307a0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21   pExpr->x.pList!
307b0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
307c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
307d0 2a 20 4d 75 73 74 20 62 65 20 63 6f 75 6e 74 28  * Must be count(
307e0 2a 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  *) */.  if( p->p
307f0 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72  Src->nSrc!=1 ) r
30800 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
30810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
30820 20 74 61 62 6c 65 20 69 6e 20 46 52 4f 4d 20 20   table in FROM  
30830 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 2d 3e 70  */.  pSub = p->p
30840 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
30850 74 3b 0a 20 20 69 66 28 20 70 53 75 62 3d 3d 30  t;.  if( pSub==0
30860 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
30870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30880 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52         /* The FR
30890 4f 4d 20 69 73 20 61 20 73 75 62 71 75 65 72 79  OM is a subquery
308a0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
308b0 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75  pPrior==0 ) retu
308c0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
308d0 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
308e0 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 72 79  be a compound ry
308f0 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66   */.  do{.    if
30900 28 20 70 53 75 62 2d 3e 6f 70 21 3d 54 4b 5f 41  ( pSub->op!=TK_A
30910 4c 4c 20 26 26 20 70 53 75 62 2d 3e 70 50 72 69  LL && pSub->pPri
30920 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  or ) return 0;  
30930 2f 2a 20 4d 75 73 74 20 62 65 20 55 4e 49 4f 4e  /* Must be UNION
30940 20 41 4c 4c 20 2a 2f 0a 20 20 20 20 69 66 28 20   ALL */.    if( 
30950 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 20 72  pSub->pWhere ) r
30960 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
30970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30980 20 4e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   No WHERE clause
30990 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62   */.    if( pSub
309a0 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->pLimit ) retur
309b0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
309c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
309d0 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a  LIMIT clause */.
309e0 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65      if( pSub->se
309f0 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
30a00 65 67 61 74 65 20 29 20 72 65 74 75 72 6e 20 30  egate ) return 0
30a10 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6e 20  ;     /* Not an 
30a20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 20  aggregate */.   
30a30 20 70 53 75 62 20 3d 20 70 53 75 62 2d 3e 70 50   pSub = pSub->pP
30a40 72 69 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  rior;           
30a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a60 20 20 20 2f 2a 20 52 65 70 65 61 74 20 6f 76 65     /* Repeat ove
30a70 72 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20  r compound */.  
30a80 7d 77 68 69 6c 65 28 20 70 53 75 62 20 29 3b 0a  }while( pSub );.
30a90 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
30aa0 68 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  h this point the
30ab0 6e 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 70 65  n it is OK to pe
30ac0 72 66 6f 72 6d 20 74 68 65 20 74 72 61 6e 73 66  rform the transf
30ad0 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64  ormation */..  d
30ae0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
30af0 20 20 70 43 6f 75 6e 74 20 3d 20 70 45 78 70 72    pCount = pExpr
30b00 3b 0a 20 20 70 45 78 70 72 20 3d 20 30 3b 0a 20  ;.  pExpr = 0;. 
30b10 20 70 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pSub = p->pSrc-
30b20 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20  >a[0].pSelect;. 
30b30 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
30b40 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 73 71  Select = 0;.  sq
30b50 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
30b60 74 65 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b  te(db, p->pSrc);
30b70 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 73 71 6c  .  p->pSrc = sql
30b80 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
30b90 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a  (pParse->db, siz
30ba0 65 6f 66 28 2a 70 2d 3e 70 53 72 63 29 29 3b 0a  eof(*p->pSrc));.
30bb0 20 20 77 68 69 6c 65 28 20 70 53 75 62 20 29 7b    while( pSub ){
30bc0 0a 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d  .    Expr *pTerm
30bd0 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70  ;.    pPrior = p
30be0 53 75 62 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  Sub->pPrior;.   
30bf0 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 3d 20   pSub->pPrior = 
30c00 30 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4e 65  0;.    pSub->pNe
30c10 78 74 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62  xt = 0;.    pSub
30c20 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
30c30 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20  _Aggregate;.    
30c40 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
30c50 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a  = ~SF_Compound;.
30c60 20 20 20 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63      pSub->nSelec
30c70 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 73 71  tRow = 0;.    sq
30c80 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
30c90 65 74 65 28 64 62 2c 20 70 53 75 62 2d 3e 70 45  ete(db, pSub->pE
30ca0 4c 69 73 74 29 3b 0a 20 20 20 20 70 54 65 72 6d  List);.    pTerm
30cb0 20 3d 20 70 50 72 69 6f 72 20 3f 20 73 71 6c 69   = pPrior ? sqli
30cc0 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
30cd0 43 6f 75 6e 74 2c 20 30 29 20 3a 20 70 43 6f 75  Count, 0) : pCou
30ce0 6e 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 45  nt;.    pSub->pE
30cf0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
30d00 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
30d10 72 73 65 2c 20 30 2c 20 70 54 65 72 6d 29 3b 0a  rse, 0, pTerm);.
30d20 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69      pTerm = sqli
30d30 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
30d40 20 54 4b 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30   TK_SELECT, 0, 0
30d50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 45  );.    sqlite3PE
30d60 78 70 72 41 64 64 53 65 6c 65 63 74 28 70 50 61  xprAddSelect(pPa
30d70 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 53 75 62  rse, pTerm, pSub
30d80 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  );.    if( pExpr
30d90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78  ==0 ){.      pEx
30da0 70 72 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  pr = pTerm;.    
30db0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 45 78  }else{.      pEx
30dc0 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
30dd0 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 50 4c 55  r(pParse, TK_PLU
30de0 53 2c 20 70 54 65 72 6d 2c 20 70 45 78 70 72 29  S, pTerm, pExpr)
30df0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62  ;.    }.    pSub
30e00 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20   = pPrior;.  }. 
30e10 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
30e20 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  .pExpr = pExpr;.
30e30 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
30e40 20 7e 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a   ~SF_Aggregate;.
30e50 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
30e60 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
30e70 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
30e80 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20  e & 0x400 ){.   
30e90 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34   SELECTTRACE(0x4
30ea0 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66  00,pParse,p,("Af
30eb0 74 65 72 20 63 6f 75 6e 74 2d 6f 66 2d 76 69 65  ter count-of-vie
30ec0 77 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a 5c  w optimization:\
30ed0 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n"));.    sqlite
30ee0 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
30ef0 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, p, 0);.  }.#e
30f00 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 31 3b  ndif.  return 1;
30f10 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
30f20 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f  ITE_COUNTOFVIEW_
30f30 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
30f40 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
30f50 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c  code for the SEL
30f60 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69  ECT statement gi
30f70 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67  ven in the p arg
30f80 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  ument.  .**.** T
30f90 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 72  he results are r
30fa0 65 74 75 72 6e 65 64 20 61 63 63 6f 72 64 69 6e  eturned accordin
30fb0 67 20 74 6f 20 74 68 65 20 53 65 6c 65 63 74 44  g to the SelectD
30fc0 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  est structure..*
30fd0 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 69  * See comments i
30fe0 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 66 6f  n sqliteInt.h fo
30ff0 72 20 66 75 72 74 68 65 72 20 69 6e 66 6f 72 6d  r further inform
31000 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
31010 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
31020 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
31030 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20  errors.  If any 
31040 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e  errors are.** en
31050 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
31060 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
31070 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
31080 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73  left in.** pPars
31090 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a  e->zErrMsg..**.*
310a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
310b0 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65  oes NOT free the
310c0 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
310d0 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68  e passed in.  Th
310e0 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e  e.** calling fun
310f0 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64  ction needs to d
31100 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73  o that..*/.int s
31110 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20  qlite3Select(.  
31120 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
31130 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
31140 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
31150 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
31160 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
31170 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
31180 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
31190 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
311a0 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68 61  Dest      /* Wha
311b0 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65  t to do with the
311c0 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
311d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
311e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
311f0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
31200 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
31210 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65  WInfo;     /* Re
31220 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65  turn from sqlite
31230 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f  3WhereBegin() */
31240 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
31250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
31260 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
31270 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
31280 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ion */.  int isA
31290 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gg;             
312a0 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65  /* True for sele
312b0 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63  ct lists like "c
312c0 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78  ount(*)" */.  Ex
312d0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
312e0 20 30 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20   0;  /* List of 
312f0 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61  columns to extra
31300 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ct. */.  SrcList
31310 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20   *pTabList;     
31320 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
31330 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d  s to select from
31340 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
31350 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  re;          /* 
31360 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
31370 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
31380 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  /.  ExprList *pG
31390 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68  roupBy;    /* Th
313a0 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
313b0 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
313c0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
313d0 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ng;         /* T
313e0 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
313f0 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
31400 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20  /.  int rc = 1; 
31410 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
31420 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72  lue to return fr
31430 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
31440 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74   */.  DistinctCt
31450 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a 20  x sDistinct; /* 
31460 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63  Info on how to c
31470 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e 43 54  ode the DISTINCT
31480 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 53 6f   keyword */.  So
31490 72 74 43 74 78 20 73 53 6f 72 74 3b 20 20 20 20  rtCtx sSort;    
314a0 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20       /* Info on 
314b0 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20  how to code the 
314c0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
314d0 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67  */.  AggInfo sAg
314e0 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49  gInfo;      /* I
314f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20  nformation used 
31500 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65  by aggregate que
31510 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ries */.  int iE
31520 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
31530 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
31540 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75  he end of the qu
31550 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
31560 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
31570 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
31580 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
31590 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61  ExprList *pMinMa
315a0 78 4f 72 64 65 72 42 79 20 3d 20 30 3b 20 20 2f  xOrderBy = 0;  /
315b0 2a 20 41 64 64 65 64 20 4f 52 44 45 52 20 42 59  * Added ORDER BY
315c0 20 66 6f 72 20 6d 69 6e 2f 6d 61 78 20 71 75 65   for min/max que
315d0 72 69 65 73 20 2a 2f 0a 20 20 75 38 20 6d 69 6e  ries */.  u8 min
315e0 4d 61 78 46 6c 61 67 3b 20 20 20 20 20 20 20 20  MaxFlag;        
315f0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
31600 20 66 6f 72 20 6d 69 6e 2f 6d 61 78 20 71 75 65   for min/max que
31610 72 69 65 73 20 2a 2f 0a 0a 20 20 64 62 20 3d 20  ries */..  db = 
31620 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20  pParse->db;.  v 
31630 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
31640 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
31650 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  p==0 || db->mall
31660 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
31670 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
31680 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
31690 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
316a0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
316b0 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30  ITE_SELECT, 0, 0
316c0 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b  , 0) ) return 1;
316d0 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49  .  memset(&sAggI
316e0 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  nfo, 0, sizeof(s
316f0 41 67 67 49 6e 66 6f 29 29 3b 0a 23 69 66 20 53  AggInfo));.#if S
31700 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
31710 45 44 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45  ED.  SELECTTRACE
31720 28 31 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 62  (1,pParse,p, ("b
31730 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 3a  egin processing:
31740 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 61 64 64  \n", pParse->add
31750 72 45 78 70 6c 61 69 6e 29 29 3b 0a 20 20 69 66  rExplain));.  if
31760 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
31770 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a  race & 0x100 ){.
31780 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
31790 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
317a0 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
317b0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
317c0 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
317d0 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69  t->eDest!=SRT_Di
317e0 73 74 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65  stFifo );.  asse
317f0 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
31800 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  =0 || pDest->eDe
31810 73 74 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a  st!=SRT_Fifo );.
31820 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
31830 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
31840 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69  t->eDest!=SRT_Di
31850 73 74 51 75 65 75 65 20 29 3b 0a 20 20 61 73 73  stQueue );.  ass
31860 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
31870 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
31880 65 73 74 21 3d 53 52 54 5f 51 75 65 75 65 20 29  est!=SRT_Queue )
31890 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c  ;.  if( Ignorabl
318a0 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
318b0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 44  ){.    assert(pD
318c0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
318d0 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d  Exists || pDest-
318e0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f  >eDest==SRT_Unio
318f0 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  n || .          
31900 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
31910 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65  RT_Except || pDe
31920 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44  st->eDest==SRT_D
31930 69 73 63 61 72 64 20 7c 7c 0a 20 20 20 20 20 20  iscard ||.      
31940 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
31950 74 3d 3d 53 52 54 5f 51 75 65 75 65 20 20 7c 7c  t==SRT_Queue  ||
31960 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
31970 52 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20  RT_DistFifo ||. 
31980 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d            pDest-
31990 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74  >eDest==SRT_Dist
319a0 51 75 65 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e  Queue || pDest->
319b0 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29  eDest==SRT_Fifo)
319c0 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52 44 45  ;.    /* If ORDE
319d0 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69  R BY makes no di
319e0 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20  fference in the 
319f0 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65 69 74  output then neit
31a00 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20  her does.    ** 
31a10 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74 20 63  DISTINCT so it c
31a20 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 74 6f  an be removed to
31a30 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  o. */.    sqlite
31a40 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
31a50 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  db, p->pOrderBy)
31a60 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
31a70 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65  y = 0;.    p->se
31a80 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69  lFlags &= ~SF_Di
31a90 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71  stinct;.  }.  sq
31aa0 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
31ab0 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20  pParse, p, 0);. 
31ac0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
31ad0 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
31ae0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
31af0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
31b00 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  }.  assert( p->p
31b10 45 4c 69 73 74 21 3d 30 20 29 3b 0a 23 69 66 20  EList!=0 );.#if 
31b20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
31b30 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LED.  if( sqlite
31b40 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
31b50 78 31 30 34 20 29 7b 0a 20 20 20 20 53 45 4c 45  x104 ){.    SELE
31b60 43 54 54 52 41 43 45 28 30 78 31 30 34 2c 70 50  CTTRACE(0x104,pP
31b70 61 72 73 65 2c 70 2c 20 28 22 61 66 74 65 72 20  arse,p, ("after 
31b80 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 3a  name resolution:
31b90 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  \n"));.    sqlit
31ba0 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
31bb0 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23  (0, p, 0);.  }.#
31bc0 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 44 65  endif..  if( pDe
31bd0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  st->eDest==SRT_O
31be0 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e  utput ){.    gen
31bf0 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
31c00 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d  (pParse, p);.  }
31c10 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
31c20 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
31c30 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 69  .  if( sqlite3Wi
31c40 6e 64 6f 77 52 65 77 72 69 74 65 28 70 50 61 72  ndowRewrite(pPar
31c50 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 67 6f  se, p) ){.    go
31c60 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
31c70 20 7d 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41   }.#if SELECTTRA
31c80 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
31c90 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
31ca0 61 63 65 20 26 20 30 78 31 30 38 20 29 7b 0a 20  ace & 0x108 ){. 
31cb0 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
31cc0 78 31 30 34 2c 70 50 61 72 73 65 2c 70 2c 20 28  x104,pParse,p, (
31cd0 22 61 66 74 65 72 20 77 69 6e 64 6f 77 20 72 65  "after window re
31ce0 77 72 69 74 65 3a 5c 6e 22 29 29 3b 0a 20 20 20  write:\n"));.   
31cf0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
31d00 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
31d10 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64  .  }.#endif.#end
31d20 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
31d30 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a  T_WINDOWFUNC */.
31d40 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
31d50 70 53 72 63 3b 0a 20 20 69 73 41 67 67 20 3d 20  pSrc;.  isAgg = 
31d60 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
31d70 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b  F_Aggregate)!=0;
31d80 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 6f 72 74  .  memset(&sSort
31d90 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72  , 0, sizeof(sSor
31da0 74 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72  t));.  sSort.pOr
31db0 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
31dc0 72 42 79 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74  rBy;..  /* Try t
31dd0 6f 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69  o various optimi
31de0 7a 61 74 69 6f 6e 73 20 28 66 6c 61 74 74 65 6e  zations (flatten
31df0 69 6e 67 20 73 75 62 71 75 65 72 69 65 73 2c 20  ing subqueries, 
31e00 61 6e 64 20 73 74 72 65 6e 67 74 68 0a 20 20 2a  and strength.  *
31e10 2a 20 72 65 64 75 63 74 69 6f 6e 20 6f 66 20 6a  * reduction of j
31e20 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 29 20 69  oin operators) i
31e30 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
31e40 65 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6d 61  e up into the ma
31e50 69 6e 20 71 75 65 72 79 0a 20 20 2a 2f 0a 23 69  in query.  */.#i
31e60 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
31e70 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
31e80 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
31e90 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20  ITE_OMIT_VIEW). 
31ea0 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50   for(i=0; !p->pP
31eb0 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69  rior && i<pTabLi
31ec0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
31ed0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
31ee0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
31ef0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d   &pTabList->a[i]
31f00 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53  ;.    Select *pS
31f10 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c  ub = pItem->pSel
31f20 65 63 74 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ect;.    Table *
31f30 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54  pTab = pItem->pT
31f40 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76  ab;..    /* Conv
31f50 65 72 74 20 4c 45 46 54 20 4a 4f 49 4e 20 69 6e  ert LEFT JOIN in
31f60 74 6f 20 4a 4f 49 4e 20 69 66 20 74 68 65 72 65  to JOIN if there
31f70 20 61 72 65 20 74 65 72 6d 73 20 6f 66 20 74 68   are terms of th
31f80 65 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20 20  e right table.  
31f90 20 20 2a 2a 20 6f 66 20 74 68 65 20 4c 45 46 54    ** of the LEFT
31fa0 20 4a 4f 49 4e 20 75 73 65 64 20 69 6e 20 74 68   JOIN used in th
31fb0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  e WHERE clause..
31fc0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
31fd0 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  pItem->fg.jointy
31fe0 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
31ff0 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
32000 45 78 70 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75  ExprImpliesNonNu
32010 6c 6c 52 6f 77 28 70 2d 3e 70 57 68 65 72 65 2c  llRow(p->pWhere,
32020 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
32030 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  .     && Optimiz
32040 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
32050 20 53 51 4c 49 54 45 5f 53 69 6d 70 6c 69 66 79   SQLITE_Simplify
32060 4a 6f 69 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20  Join).    ){.   
32070 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
32080 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 0a 20  x100,pParse,p,. 
32090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
320a0 22 4c 45 46 54 2d 4a 4f 49 4e 20 73 69 6d 70 6c  "LEFT-JOIN simpl
320b0 69 66 69 65 73 20 74 6f 20 4a 4f 49 4e 20 6f 6e  ifies to JOIN on
320c0 20 74 65 72 6d 20 25 64 5c 6e 22 2c 69 29 29 3b   term %d\n",i));
320d0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67  .      pItem->fg
320e0 2e 6a 6f 69 6e 74 79 70 65 20 26 3d 20 7e 28 4a  .jointype &= ~(J
320f0 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 29  T_LEFT|JT_OUTER)
32100 3b 0a 20 20 20 20 20 20 75 6e 73 65 74 4a 6f 69  ;.      unsetJoi
32110 6e 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c  nExpr(p->pWhere,
32120 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
32130 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
32140 4e 6f 20 66 75 74 68 65 72 20 61 63 74 69 6f 6e  No futher action
32150 20 69 66 20 74 68 69 73 20 74 65 72 6d 20 6f 66   if this term of
32160 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
32170 20 69 73 20 6e 6f 20 61 20 73 75 62 71 75 65 72   is no a subquer
32180 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75  y */.    if( pSu
32190 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  b==0 ) continue;
321a0 0a 0a 20 20 20 20 2f 2a 20 43 61 74 63 68 20 6d  ..    /* Catch m
321b0 69 73 6d 61 74 63 68 20 69 6e 20 74 68 65 20 64  ismatch in the d
321c0 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 73 20  eclared columns 
321d0 6f 66 20 61 20 76 69 65 77 20 61 6e 64 20 74 68  of a view and th
321e0 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  e number of.    
321f0 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ** columns in th
32200 65 20 53 45 4c 45 43 54 20 6f 6e 20 74 68 65 20  e SELECT on the 
32210 52 48 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  RHS */.    if( p
32220 54 61 62 2d 3e 6e 43 6f 6c 21 3d 70 53 75 62 2d  Tab->nCol!=pSub-
32230 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
32240 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
32250 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
32260 22 65 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c  "expected %d col
32270 75 6d 6e 73 20 66 6f 72 20 27 25 73 27 20 62 75  umns for '%s' bu
32280 74 20 67 6f 74 20 25 64 22 2c 0a 20 20 20 20 20  t got %d",.     
32290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
322a0 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61   pTab->nCol, pTa
322b0 62 2d 3e 7a 4e 61 6d 65 2c 20 70 53 75 62 2d 3e  b->zName, pSub->
322c0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
322d0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
322e0 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  t_end;.    }..  
322f0 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 74 72 79 20    /* Do not try 
32300 74 6f 20 66 6c 61 74 74 65 6e 20 61 6e 20 61 67  to flatten an ag
32310 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72 79  gregate subquery
32320 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
32330 46 6c 61 74 74 65 6e 69 6e 67 20 61 6e 20 61 67  Flattening an ag
32340 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72 79  gregate subquery
32350 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c   is only possibl
32360 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71  e if the outer q
32370 75 65 72 79 0a 20 20 20 20 2a 2a 20 69 73 20 6e  uery.    ** is n
32380 6f 74 20 61 20 6a 6f 69 6e 2e 20 20 42 75 74 20  ot a join.  But 
32390 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  if the outer que
323a0 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
323b0 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 71 75  , then the subqu
323c0 65 72 79 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  ery.    ** will 
323d0 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  be implemented a
323e0 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 61  s a co-routine a
323f0 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 61  nd there is no a
32400 64 76 61 6e 74 61 67 65 20 74 6f 0a 20 20 20 20  dvantage to.    
32410 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e  ** flattening in
32420 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20 20   that case..    
32430 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 53 75 62  */.    if( (pSub
32440 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
32450 41 67 67 72 65 67 61 74 65 29 21 3d 30 20 29 20  Aggregate)!=0 ) 
32460 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
32470 73 65 72 74 28 20 70 53 75 62 2d 3e 70 47 72 6f  sert( pSub->pGro
32480 75 70 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  upBy==0 );..    
32490 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 65 72 20  /* If the outer 
324a0 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 61  query contains a
324b0 20 22 63 6f 6d 70 6c 65 78 22 20 72 65 73 75 6c   "complex" resul
324c0 74 20 73 65 74 20 28 74 68 61 74 20 69 73 2c 0a  t set (that is,.
324d0 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 72 65      ** if the re
324e0 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
324f0 6f 75 74 65 72 20 71 75 65 72 79 20 75 73 65 73  outer query uses
32500 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 73 75   functions or su
32510 62 71 75 65 72 69 65 73 29 0a 20 20 20 20 2a 2a  bqueries).    **
32520 20 61 6e 64 20 69 66 20 74 68 65 20 73 75 62 71   and if the subq
32530 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e  uery contains an
32540 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
32550 20 61 6e 64 20 69 66 0a 20 20 20 20 2a 2a 20 69   and if.    ** i
32560 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 65 6d  t will be implem
32570 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f  ented as a co-ro
32580 75 74 69 6e 65 2c 20 74 68 65 6e 20 64 6f 20 6e  utine, then do n
32590 6f 74 20 66 6c 61 74 74 65 6e 2e 20 20 54 68 69  ot flatten.  Thi
325a0 73 0a 20 20 20 20 2a 2a 20 72 65 73 74 72 69 63  s.    ** restric
325b0 74 69 6f 6e 20 61 6c 6c 6f 77 73 20 53 51 4c 20  tion allows SQL 
325c0 63 6f 6e 73 74 72 75 63 74 73 20 6c 69 6b 65 20  constructs like 
325d0 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  this:.    **.   
325e0 20 2a 2a 20 20 53 45 4c 45 43 54 20 65 78 70 65   **  SELECT expe
325f0 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28 78  nsive_function(x
32600 29 0a 20 20 20 20 2a 2a 20 20 20 20 46 52 4f 4d  ).    **    FROM
32610 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20   (SELECT x FROM 
32620 74 61 62 20 4f 52 44 45 52 20 42 59 20 79 20 4c  tab ORDER BY y L
32630 49 4d 49 54 20 31 30 29 3b 0a 20 20 20 20 2a 2a  IMIT 10);.    **
32640 0a 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70 65  .    ** The expe
32650 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28 29  nsive_function()
32660 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 75 74 65   is only compute
32670 64 20 6f 6e 20 74 68 65 20 31 30 20 72 6f 77 73  d on the 10 rows
32680 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 72 65   that.    ** are
32690 20 6f 75 74 70 75 74 2c 20 72 61 74 68 65 72 20   output, rather 
326a0 74 68 61 6e 20 65 76 65 72 79 20 72 6f 77 20 6f  than every row o
326b0 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  f the table..   
326c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
326d0 65 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20  equirement that 
326e0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
326f0 68 61 76 65 20 61 20 63 6f 6d 70 6c 65 78 20 72  have a complex r
32700 65 73 75 6c 74 20 73 65 74 0a 20 20 20 20 2a 2a  esult set.    **
32710 20 6d 65 61 6e 73 20 74 68 61 74 20 66 6c 61 74   means that flat
32720 74 65 6e 69 6e 67 20 64 6f 65 73 20 6f 63 63 75  tening does occu
32730 72 20 6f 6e 20 73 69 6d 70 6c 65 72 20 53 51 4c  r on simpler SQL
32740 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 74   constraints wit
32750 68 6f 75 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  hout.    ** the 
32760 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63 74 69  expensive_functi
32770 6f 6e 28 29 20 6c 69 6b 65 3a 0a 20 20 20 20 2a  on() like:.    *
32780 2a 0a 20 20 20 20 2a 2a 20 20 53 45 4c 45 43 54  *.    **  SELECT
32790 20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   x FROM (SELECT 
327a0 78 20 46 52 4f 4d 20 74 61 62 20 4f 52 44 45 52  x FROM tab ORDER
327b0 20 42 59 20 79 20 4c 49 4d 49 54 20 31 30 29 3b   BY y LIMIT 10);
327c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
327d0 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 21 3d  pSub->pOrderBy!=
327e0 30 0a 20 20 20 20 20 26 26 20 69 3d 3d 30 0a 20  0.     && i==0. 
327f0 20 20 20 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c      && (p->selFl
32800 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6c 65 78  ags & SF_Complex
32810 52 65 73 75 6c 74 29 21 3d 30 0a 20 20 20 20 20  Result)!=0.     
32820 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53  && (pTabList->nS
32830 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 7c  rc==1.         |
32840 7c 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31  | (pTabList->a[1
32850 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a  ].fg.jointype&(J
32860 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29  T_LEFT|JT_CROSS)
32870 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0).    ){.   
32880 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
32890 20 7d 0a 0a 20 20 20 20 69 66 28 20 66 6c 61 74   }..    if( flat
328a0 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72  tenSubquery(pPar
328b0 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 29  se, p, i, isAgg)
328c0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
328d0 73 20 73 75 62 71 75 65 72 79 20 63 61 6e 20 62  s subquery can b
328e0 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20  e absorbed into 
328f0 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20  its parent. */. 
32900 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20       i = -1;.   
32910 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20   }.    pTabList 
32920 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69  = p->pSrc;.    i
32930 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
32940 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  led ) goto selec
32950 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 21  t_end;.    if( !
32960 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
32970 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20  (pDest) ){.     
32980 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
32990 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
329a0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
329b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
329c0 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
329d0 4c 45 43 54 0a 20 20 2f 2a 20 48 61 6e 64 6c 65  LECT.  /* Handle
329e0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
329f0 20 73 74 61 74 65 6d 65 6e 74 73 20 75 73 69 6e   statements usin
32a00 67 20 74 68 65 20 73 65 70 61 72 61 74 65 20 6d  g the separate m
32a10 75 6c 74 69 53 65 6c 65 63 74 28 29 0a 20 20 2a  ultiSelect().  *
32a20 2a 20 70 72 6f 63 65 64 75 72 65 2e 0a 20 20 2a  * procedure..  *
32a30 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
32a40 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75  r ){.    rc = mu
32a50 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65  ltiSelect(pParse
32a60 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 23 69 66  , p, pDest);.#if
32a70 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
32a80 42 4c 45 44 0a 20 20 20 20 53 45 4c 45 43 54 54  BLED.    SELECTT
32a90 52 41 43 45 28 30 78 31 2c 70 50 61 72 73 65 2c  RACE(0x1,pParse,
32aa0 70 2c 28 22 65 6e 64 20 63 6f 6d 70 6f 75 6e 64  p,("end compound
32ab0 2d 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69  -select processi
32ac0 6e 67 5c 6e 22 29 29 3b 0a 20 20 20 20 69 66 28  ng\n"));.    if(
32ad0 20 28 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54   (sqlite3SelectT
32ae0 72 61 63 65 20 26 20 30 78 32 30 30 30 29 21 3d  race & 0x2000)!=
32af0 30 20 26 26 20 45 78 70 6c 61 69 6e 51 75 65 72  0 && ExplainQuer
32b00 79 50 6c 61 6e 50 61 72 65 6e 74 28 70 50 61 72  yPlanParent(pPar
32b10 73 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  se)==0 ){.      
32b20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
32b30 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
32b40 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
32b50 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30   if( p->pNext==0
32b60 20 29 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50   ) ExplainQueryP
32b70 6c 61 6e 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  lanPop(pParse);.
32b80 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
32b90 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
32ba0 44 6f 20 74 68 65 20 57 48 45 52 45 2d 63 6c 61  Do the WHERE-cla
32bb0 75 73 65 20 63 6f 6e 73 74 61 6e 74 20 70 72 6f  use constant pro
32bc0 70 61 67 61 74 69 6f 6e 20 6f 70 74 69 6d 69 7a  pagation optimiz
32bd0 61 74 69 6f 6e 20 69 66 20 74 68 69 73 20 69 73  ation if this is
32be0 0a 20 20 2a 2a 20 61 20 6a 6f 69 6e 2e 20 20 4e  .  ** a join.  N
32bf0 6f 20 6e 65 65 64 20 74 6f 20 73 70 65 65 64 20  o need to speed 
32c00 74 69 6d 65 20 6f 6e 20 74 68 69 73 20 6f 70 65  time on this ope
32c10 72 61 74 69 6f 6e 20 66 6f 72 20 6e 6f 6e 2d 6a  ration for non-j
32c20 6f 69 6e 20 71 75 65 72 69 65 73 0a 20 20 2a 2a  oin queries.  **
32c30 20 61 73 20 74 68 65 20 65 71 75 69 76 61 6c 65   as the equivale
32c40 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  nt optimization 
32c50 77 69 6c 6c 20 62 65 20 68 61 6e 64 6c 65 64 20  will be handled 
32c60 62 79 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  by query planner
32c70 20 69 6e 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   in.  ** sqlite3
32c80 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 20 20  WhereBegin()..  
32c90 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73  */.  if( pTabLis
32ca0 74 2d 3e 6e 53 72 63 3e 31 0a 20 20 20 26 26 20  t->nSrc>1.   && 
32cb0 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
32cc0 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 50  led(db, SQLITE_P
32cd0 72 6f 70 61 67 61 74 65 43 6f 6e 73 74 29 0a 20  ropagateConst). 
32ce0 20 20 26 26 20 70 72 6f 70 61 67 61 74 65 43 6f    && propagateCo
32cf0 6e 73 74 61 6e 74 73 28 70 50 61 72 73 65 2c 20  nstants(pParse, 
32d00 70 29 0a 20 20 29 7b 0a 23 69 66 20 53 45 4c 45  p).  ){.#if SELE
32d10 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
32d20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
32d30 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31  electTrace & 0x1
32d40 30 30 20 29 7b 0a 20 20 20 20 20 20 53 45 4c 45  00 ){.      SELE
32d50 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50  CTTRACE(0x100,pP
32d60 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 63  arse,p,("After c
32d70 6f 6e 73 74 61 6e 74 20 70 72 6f 70 61 67 61 74  onstant propagat
32d80 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20  ion:\n"));.     
32d90 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
32da0 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
32db0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
32dc0 7d 65 6c 73 65 7b 0a 20 20 20 20 53 45 4c 45 43  }else{.    SELEC
32dd0 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61  TTRACE(0x100,pPa
32de0 72 73 65 2c 70 2c 28 22 43 6f 6e 73 74 61 6e 74  rse,p,("Constant
32df0 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6e 6f 74   propagation not
32e00 20 68 65 6c 70 66 75 6c 5c 6e 22 29 29 3b 0a 20   helpful\n"));. 
32e10 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
32e20 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50  E_COUNTOFVIEW_OP
32e30 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  TIMIZATION.  if(
32e40 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
32e50 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
32e60 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 7c 53  QueryFlattener|S
32e70 51 4c 49 54 45 5f 43 6f 75 6e 74 4f 66 56 69 65  QLITE_CountOfVie
32e80 77 29 0a 20 20 20 26 26 20 63 6f 75 6e 74 4f 66  w).   && countOf
32e90 56 69 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  ViewOptimization
32ea0 28 70 50 61 72 73 65 2c 20 70 29 0a 20 20 29 7b  (pParse, p).  ){
32eb0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
32ec0 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
32ed0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
32ee0 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
32ef0 69 73 74 3b 0a 20 20 20 20 70 54 61 62 4c 69 73  ist;.    pTabLis
32f00 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 7d  t = p->pSrc;.  }
32f10 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 6f  .#endif..  /* Fo
32f20 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 74  r each term in t
32f30 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20  he FROM clause, 
32f40 64 6f 20 74 77 6f 20 74 68 69 6e 67 73 3a 0a 20  do two things:. 
32f50 20 2a 2a 20 28 31 29 20 41 75 74 68 6f 72 69 7a   ** (1) Authoriz
32f60 65 64 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20  ed unreferenced 
32f70 74 61 62 6c 65 73 0a 20 20 2a 2a 20 28 32 29 20  tables.  ** (2) 
32f80 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
32f90 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65  r all sub-querie
32fa0 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  s.  */.  for(i=0
32fb0 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
32fc0 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
32fd0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
32fe0 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62  m *pItem = &pTab
32ff0 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  List->a[i];.    
33000 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
33010 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75  .    Select *pSu
33020 62 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  b;.#if !defined(
33030 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
33040 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
33050 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
33060 45 57 29 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  EW).    const ch
33070 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
33080 6e 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a 0a 20  ntext;.#endif.. 
33090 20 20 20 2f 2a 20 49 73 73 75 65 20 53 51 4c 49     /* Issue SQLI
330a0 54 45 5f 52 45 41 44 20 61 75 74 68 6f 72 69 7a  TE_READ authoriz
330b0 61 74 69 6f 6e 73 20 77 69 74 68 20 61 20 66 61  ations with a fa
330c0 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 66  ke column name f
330d0 6f 72 20 61 6e 79 0a 20 20 20 20 2a 2a 20 74 61  or any.    ** ta
330e0 62 6c 65 73 20 74 68 61 74 20 61 72 65 20 72 65  bles that are re
330f0 66 65 72 65 6e 63 65 64 20 62 75 74 20 66 72 6f  ferenced but fro
33100 6d 20 77 68 69 63 68 20 6e 6f 20 76 61 6c 75 65  m which no value
33110 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64 2e  s are extracted.
33120 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 73  .    ** Examples
33130 20 6f 66 20 77 68 65 72 65 20 74 68 65 73 65 20   of where these 
33140 6b 69 6e 64 73 20 6f 66 20 6e 75 6c 6c 20 53 51  kinds of null SQ
33150 4c 49 54 45 5f 52 45 41 44 20 61 75 74 68 6f 72  LITE_READ author
33160 69 7a 61 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20  izations.    ** 
33170 77 6f 75 6c 64 20 6f 63 63 75 72 3a 0a 20 20 20  would occur:.   
33180 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 53   **.    **     S
33190 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
331a0 52 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 53 51 4c  ROM t1;   -- SQL
331b0 49 54 45 5f 52 45 41 44 20 74 31 2e 22 22 0a 20  ITE_READ t1."". 
331c0 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54     **     SELECT
331d0 20 74 31 2e 2a 20 46 52 4f 4d 20 74 31 2c 20 74   t1.* FROM t1, t
331e0 32 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52  2;   -- SQLITE_R
331f0 45 41 44 20 74 32 2e 22 22 0a 20 20 20 20 2a 2a  EAD t2."".    **
33200 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 61 6b 65  .    ** The fake
33210 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
33220 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
33230 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65    It is possible
33240 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74 6f 0a   for a table to.
33250 20 20 20 20 2a 2a 20 68 61 76 65 20 61 20 63 6f      ** have a co
33260 6c 75 6d 6e 20 6e 61 6d 65 64 20 62 79 20 74 68  lumn named by th
33270 65 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20  e empty string, 
33280 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
33290 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f  ere is no way to
332a0 0a 20 20 20 20 2a 2a 20 64 69 73 74 69 6e 67 75  .    ** distingu
332b0 69 73 68 20 62 65 74 77 65 65 6e 20 61 6e 20 75  ish between an u
332c0 6e 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c  nreferenced tabl
332d0 65 20 61 6e 64 20 61 6e 20 61 63 74 75 61 6c 20  e and an actual 
332e0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
332f0 0a 20 20 20 20 2a 2a 20 22 22 20 63 6f 6c 75 6d  .    ** "" colum
33300 6e 2e 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  n. The original 
33310 64 65 73 69 67 6e 20 77 61 73 20 66 6f 72 20 74  design was for t
33320 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e  he fake column n
33330 61 6d 65 20 74 6f 20 62 65 20 61 20 4e 55 4c 4c  ame to be a NULL
33340 2c 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77  ,.    ** which w
33350 6f 75 6c 64 20 62 65 20 75 6e 61 6d 62 69 67 75  ould be unambigu
33360 6f 75 73 2e 20 20 42 75 74 20 6c 65 67 61 63 79  ous.  But legacy
33370 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63   authorization c
33380 61 6c 6c 62 61 63 6b 73 20 6d 69 67 68 74 0a 20  allbacks might. 
33390 20 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 65     ** assume the
333a0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
333b0 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 73 65 67  non-NULL and seg
333c0 66 61 75 6c 74 2e 20 20 54 68 65 20 75 73 65 20  fault.  The use 
333d0 6f 66 20 61 6e 20 65 6d 70 74 79 0a 20 20 20 20  of an empty.    
333e0 2a 2a 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68  ** string for th
333f0 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61  e fake column na
33400 6d 65 20 73 65 65 6d 73 20 73 61 66 65 72 2e 0a  me seems safer..
33410 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
33420 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3d 3d 30  Item->colUsed==0
33430 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
33440 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
33450 65 2c 20 53 51 4c 49 54 45 5f 52 45 41 44 2c 20  e, SQLITE_READ, 
33460 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 22 22  pItem->zName, ""
33470 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  , pItem->zDataba
33480 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  se);.    }..#if 
33490 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
334a0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
334b0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
334c0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 20  E_OMIT_VIEW).   
334d0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
334e0 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75  e for all sub-qu
334f0 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
33500 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2f 0a  M clause.    */.
33510 20 20 20 20 70 53 75 62 20 3d 20 70 49 74 65 6d      pSub = pItem
33520 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69  ->pSelect;.    i
33530 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e  f( pSub==0 ) con
33540 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53  tinue;..    /* S
33550 6f 6d 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64  ometimes the cod
33560 65 20 66 6f 72 20 61 20 73 75 62 71 75 65 72 79  e for a subquery
33570 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74   will be generat
33580 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20  ed more than.   
33590 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65   ** once, if the
335a0 20 73 75 62 71 75 65 72 79 20 69 73 20 70 61 72   subquery is par
335b0 74 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  t of the WHERE c
335c0 6c 61 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20  lause in a LEFT 
335d0 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72  JOIN,.    ** for
335e0 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68   example.  In th
335f0 61 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20  at case, do not 
33600 72 65 67 65 6e 65 72 61 74 65 20 74 68 65 20 63  regenerate the c
33610 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a  ode to manifest.
33620 20 20 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72      ** a view or
33630 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20   the co-routine 
33640 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76  to implement a v
33650 69 65 77 2e 20 20 54 68 65 20 66 69 72 73 74 20  iew.  The first 
33660 69 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20  instance.    ** 
33670 69 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74  is sufficient, t
33680 68 6f 75 67 68 20 74 68 65 20 73 75 62 72 6f 75  hough the subrou
33690 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74  tine to manifest
336a0 20 74 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e   the view does n
336b0 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65  eed.    ** to be
336c0 20 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20   invoked again. 
336d0 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  */.    if( pItem
336e0 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b  ->addrFillSub ){
336f0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
33700 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e  ->fg.viaCoroutin
33710 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
33720 2f 2a 20 54 68 65 20 73 75 62 72 6f 75 74 69 6e  /* The subroutin
33730 65 20 74 68 61 74 20 6d 61 6e 69 66 65 73 74 73  e that manifests
33740 20 74 68 65 20 76 69 65 77 20 6d 69 67 68 74 20   the view might 
33750 62 65 20 61 20 6f 6e 65 2d 74 69 6d 65 20 72 6f  be a one-time ro
33760 75 74 69 6e 65 2c 0a 20 20 20 20 20 20 20 20 2a  utine,.        *
33770 2a 20 6f 72 20 69 74 20 6d 69 67 68 74 20 6e 65  * or it might ne
33780 65 64 20 74 6f 20 62 65 20 72 65 72 75 6e 20 6f  ed to be rerun o
33790 6e 20 65 61 63 68 20 69 74 65 72 61 74 69 6f 6e  n each iteration
337a0 20 62 65 63 61 75 73 65 20 69 74 0a 20 20 20 20   because it.    
337b0 20 20 20 20 2a 2a 20 65 6e 63 6f 64 65 73 20 61      ** encodes a
337c0 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71   correlated subq
337d0 75 65 72 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  uery. */.       
337e0 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
337f0 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
33800 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
33810 62 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f  b)->opcode==OP_O
33820 6e 63 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73  nce );.        s
33830 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
33840 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49  (v, OP_Gosub, pI
33850 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  tem->regReturn, 
33860 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
33870 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ub);.      }.   
33880 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
33890 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65   }..    /* Incre
338a0 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67  ment Parse.nHeig
338b0 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74  ht by the height
338c0 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20   of the largest 
338d0 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
338e0 2a 20 74 72 65 65 20 72 65 66 65 72 72 65 64 20  * tree referred 
338f0 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20  to by this, the 
33900 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54  parent select. T
33910 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a  he child select.
33920 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61      ** may conta
33930 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  in expression tr
33940 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20  ees of at most. 
33950 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41     ** (SQLITE_MA
33960 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72  X_EXPR_DEPTH-Par
33970 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67  se.nHeight) heig
33980 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69  ht. This is a bi
33990 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f  t.    ** more co
339a0 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20  nservative than 
339b0 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d  necessary, but m
339c0 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20  uch easier than 
339d0 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a  enforcing.    **
339e0 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e   an exact limit.
339f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
33a00 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73  se->nHeight += s
33a10 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
33a20 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20  Height(p);..    
33a30 2f 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  /* Make copies o
33a40 66 20 63 6f 6e 73 74 61 6e 74 20 57 48 45 52 45  f constant WHERE
33a50 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 20 69 6e  -clause terms in
33a60 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
33a70 20 64 6f 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73   down.    ** ins
33a80 69 64 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ide the subquery
33a90 2e 20 20 54 68 69 73 20 63 61 6e 20 68 65 6c 70  .  This can help
33aa0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74 6f   the subquery to
33ab0 20 72 75 6e 20 6d 6f 72 65 20 65 66 66 69 63 69   run more effici
33ac0 65 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ently..    */.  
33ad0 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
33ae0 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
33af0 4c 49 54 45 5f 50 75 73 68 44 6f 77 6e 29 0a 20  LITE_PushDown). 
33b00 20 20 20 20 26 26 20 70 75 73 68 44 6f 77 6e 57      && pushDownW
33b10 68 65 72 65 54 65 72 6d 73 28 70 50 61 72 73 65  hereTerms(pParse
33b20 2c 20 70 53 75 62 2c 20 70 2d 3e 70 57 68 65 72  , pSub, p->pWher
33b30 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e, pItem->iCurso
33b40 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
33b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70                (p
33b60 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  Item->fg.jointyp
33b70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
33b80 29 0a 20 20 20 20 29 7b 0a 23 69 66 20 53 45 4c  ).    ){.#if SEL
33b90 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
33ba0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
33bb0 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
33bc0 30 78 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20  0x100 ){.       
33bd0 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
33be0 30 30 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20 20  00,pParse,p,.   
33bf0 20 20 20 20 20 20 20 20 20 28 22 41 66 74 65 72           ("After
33c00 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 70 75   WHERE-clause pu
33c10 73 68 2d 64 6f 77 6e 20 69 6e 74 6f 20 73 75 62  sh-down into sub
33c20 71 75 65 72 79 20 25 64 3a 5c 6e 22 2c 20 70 53  query %d:\n", pS
33c30 75 62 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20 20  ub->selId));.   
33c40 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
33c50 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
33c60 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
33c70 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
33c80 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
33c90 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x100,pParse,p,
33ca0 28 22 50 75 73 68 2d 64 6f 77 6e 20 6e 6f 74 20  ("Push-down not 
33cb0 70 6f 73 73 69 62 6c 65 5c 6e 22 29 29 3b 0a 20  possible\n"));. 
33cc0 20 20 20 7d 0a 0a 20 20 20 20 7a 53 61 76 65 64     }..    zSaved
33cd0 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50  AuthContext = pP
33ce0 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
33cf0 78 74 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  xt;.    pParse->
33d00 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  zAuthContext = p
33d10 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20  Item->zName;..  
33d20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
33d30 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  de to implement 
33d40 74 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20  the subquery.   
33d50 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
33d60 75 62 71 75 65 72 79 20 69 73 20 69 6d 70 6c 65  ubquery is imple
33d70 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72  mented as a co-r
33d80 6f 75 74 69 6e 65 20 69 66 20 74 68 65 20 73 75  outine if the su
33d90 62 71 75 65 72 79 20 69 73 0a 20 20 20 20 2a 2a  bquery is.    **
33da0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
33db0 65 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70  e the outer loop
33dc0 20 28 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65   (so that it doe
33dd0 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
33de0 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64  .    ** computed
33df0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 29   more than once)
33e00 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
33e10 4f 44 4f 3a 20 41 72 65 20 74 68 65 72 65 20 6f  ODO: Are there o
33e20 74 68 65 72 20 72 65 61 73 6f 6e 73 20 62 65 73  ther reasons bes
33e30 69 64 65 20 28 31 29 20 74 6f 20 75 73 65 20 61  ide (1) to use a
33e40 20 63 6f 2d 72 6f 75 74 69 6e 65 0a 20 20 20 20   co-routine.    
33e50 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
33e60 6e 3f 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n?.    */.    if
33e70 28 20 69 3d 3d 30 0a 20 20 20 20 20 26 26 20 28  ( i==0.     && (
33e80 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d  pTabList->nSrc==
33e90 31 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  1.            ||
33ea0 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d   (pTabList->a[1]
33eb0 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54  .fg.jointype&(JT
33ec0 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29  _LEFT|JT_CROSS))
33ed0 21 3d 30 29 20 20 2f 2a 20 28 31 29 20 2a 2f 0a  !=0)  /* (1) */.
33ee0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
33ef0 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72  Implement a co-r
33f00 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
33f10 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65   return a single
33f20 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75   row of the resu
33f30 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20  lt.      ** set 
33f40 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69  on each invocati
33f50 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
33f60 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 20 3d     int addrTop =
33f70 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
33f80 65 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a 20 20  entAddr(v)+1;.  
33f90 20 20 20 0a 20 20 20 20 20 20 70 49 74 65 6d 2d     .      pItem-
33fa0 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70  >regReturn = ++p
33fb0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
33fc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
33fd0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
33fe0 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d  oroutine, pItem-
33ff0 3e 72 65 67 52 65 74 75 72 6e 2c 20 30 2c 20 61  >regReturn, 0, a
34000 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 56  ddrTop);.      V
34010 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
34020 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  %s", pItem->pTab
34030 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
34040 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
34050 53 75 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20  Sub = addrTop;. 
34060 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
34070 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
34080 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
34090 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
340a0 6e 29 3b 0a 20 20 20 20 20 20 45 78 70 6c 61 69  n);.      Explai
340b0 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
340c0 73 65 2c 20 31 2c 20 22 43 4f 2d 52 4f 55 54 49  se, 1, "CO-ROUTI
340d0 4e 45 20 25 75 22 2c 20 70 53 75 62 2d 3e 73 65  NE %u", pSub->se
340e0 6c 49 64 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  lId));.      sql
340f0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
34100 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b  e, pSub, &dest);
34110 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54  .      pItem->pT
34120 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
34130 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f   pSub->nSelectRo
34140 77 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  w;.      pItem->
34150 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  fg.viaCoroutine 
34160 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  = 1;.      pItem
34170 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 64 65  ->regResult = de
34180 73 74 2e 69 53 64 73 74 3b 0a 20 20 20 20 20 20  st.iSdst;.      
34190 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f  sqlite3VdbeEndCo
341a0 72 6f 75 74 69 6e 65 28 76 2c 20 70 49 74 65 6d  routine(v, pItem
341b0 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
341c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
341d0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
341e0 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  op-1);.      sql
341f0 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67  ite3ClearTempReg
34200 43 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20  Cache(pParse);. 
34210 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34220 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
34230 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  broutine that wi
34240 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d  ll fill an ephem
34250 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a  eral table with.
34260 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e        ** the con
34270 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73 75 62  tent of this sub
34280 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61  query.  pItem->a
34290 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20  ddrFillSub will 
342a0 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74  point.      ** t
342b0 6f 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  o the address of
342c0 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 73   the generated s
342d0 75 62 72 6f 75 74 69 6e 65 2e 20 20 70 49 74 65  ubroutine.  pIte
342e0 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20 20 20  m->regReturn.   
342f0 20 20 20 2a 2a 20 69 73 20 61 20 72 65 67 69 73     ** is a regis
34300 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ter allocated to
34310 20 68 6f 6c 64 20 74 68 65 20 73 75 62 72 6f 75   hold the subrou
34320 74 69 6e 65 20 72 65 74 75 72 6e 20 61 64 64 72  tine return addr
34330 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ess.      */.   
34340 20 20 20 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a     int topAddr;.
34350 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 41 64        int onceAd
34360 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  dr = 0;.      in
34370 74 20 72 65 74 41 64 64 72 3b 0a 20 20 20 20 20  t retAddr;.     
34380 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
34390 69 74 65 6d 20 2a 70 50 72 69 6f 72 3b 0a 0a 20  item *pPrior;.. 
343a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
343b0 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d  em->addrFillSub=
343c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65  =0 );.      pIte
343d0 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  m->regReturn = +
343e0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
343f0 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73       topAddr = s
34400 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
34410 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
34420 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  0, pItem->regRet
34430 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65  urn);.      pIte
34440 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
34450 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20   topAddr+1;.    
34460 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
34470 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20  isCorrelated==0 
34480 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
34490 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
344a0 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64 20   not correlated 
344b0 61 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f  and if we are no
344c0 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20  t inside of.    
344d0 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72      ** a trigger
344e0 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e  , then we only n
344f0 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
34500 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
34510 73 75 62 71 75 65 72 79 0a 20 20 20 20 20 20 20  subquery.       
34520 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20   ** once. */.   
34530 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20       onceAddr = 
34540 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34550 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56  0(v, OP_Once); V
34560 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
34570 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
34580 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61  ent((v, "materia
34590 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49  lize \"%s\"", pI
345a0 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
345b0 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
345c0 0a 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f 6f  .        VdbeNoo
345d0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61  pComment((v, "ma
345e0 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22  terialize \"%s\"
345f0 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
34600 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d  zName));.      }
34610 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20  .      pPrior = 
34620 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28 70  isSelfJoinView(p
34630 54 61 62 4c 69 73 74 2c 20 70 49 74 65 6d 29 3b  TabList, pItem);
34640 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f  .      if( pPrio
34650 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
34660 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
34670 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 49  , OP_OpenDup, pI
34680 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50  tem->iCursor, pP
34690 72 69 6f 72 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  rior->iCursor);.
346a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
346b0 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74 21  pPrior->pSelect!
346c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 53  =0 );.        pS
346d0 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d  ub->nSelectRow =
346e0 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74   pPrior->pSelect
346f0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
34700 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34710 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
34720 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
34730 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49  SRT_EphemTab, pI
34740 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
34750 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75         ExplainQu
34760 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
34770 20 31 2c 20 22 4d 41 54 45 52 49 41 4c 49 5a 45   1, "MATERIALIZE
34780 20 25 75 22 2c 20 70 53 75 62 2d 3e 73 65 6c 49   %u", pSub->selI
34790 64 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  d));.        sql
347a0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
347b0 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b  e, pSub, &dest);
347c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
347d0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77  Item->pTab->nRow
347e0 4c 6f 67 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e  LogEst = pSub->n
347f0 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
34800 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29 20   if( onceAddr ) 
34810 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
34820 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72 29  ere(v, onceAddr)
34830 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64 72 20  ;.      retAddr 
34840 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
34850 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
34860 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
34870 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  rn);.      VdbeC
34880 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20  omment((v, "end 
34890 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  %s", pItem->pTab
348a0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
348b0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
348c0 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72 2c  geP1(v, topAddr,
348d0 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20 20   retAddr);.     
348e0 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d   sqlite3ClearTem
348f0 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65  pRegCache(pParse
34900 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
34910 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
34920 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
34930 65 6e 64 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  end;.    pParse-
34940 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c 69  >nHeight -= sqli
34950 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
34960 67 68 74 28 70 29 3b 0a 20 20 20 20 70 50 61 72  ght(p);.    pPar
34970 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
34980 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e   = zSavedAuthCon
34990 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  text;.#endif.  }
349a0 0a 0a 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 65  ..  /* Various e
349b0 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 53  lements of the S
349c0 45 4c 45 43 54 20 63 6f 70 69 65 64 20 69 6e 74  ELECT copied int
349d0 6f 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65  o local variable
349e0 73 20 66 6f 72 0a 20 20 2a 2a 20 63 6f 6e 76 65  s for.  ** conve
349f0 6e 69 65 6e 63 65 20 2a 2f 0a 20 20 70 45 4c 69  nience */.  pELi
34a00 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
34a10 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57    pWhere = p->pW
34a20 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79  here;.  pGroupBy
34a30 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
34a40 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70    pHaving = p->p
34a50 48 61 76 69 6e 67 3b 0a 20 20 73 44 69 73 74 69  Having;.  sDisti
34a60 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20 28 70 2d  nct.isTnct = (p-
34a70 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
34a80 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69  istinct)!=0;..#i
34a90 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
34aa0 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
34ab0 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
34ac0 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 53 45   0x400 ){.    SE
34ad0 4c 45 43 54 54 52 41 43 45 28 30 78 34 30 30 2c  LECTTRACE(0x400,
34ae0 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72  pParse,p,("After
34af0 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65   all FROM-clause
34b00 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22 29 29 3b   analysis:\n"));
34b10 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
34b20 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
34b30 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
34b40 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65  .  /* If the que
34b50 72 79 20 69 73 20 44 49 53 54 49 4e 43 54 20 77  ry is DISTINCT w
34b60 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ith an ORDER BY 
34b70 62 75 74 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  but is not an ag
34b80 67 72 65 67 61 74 65 2c 20 61 6e 64 20 0a 20 20  gregate, and .  
34b90 2a 2a 20 69 66 20 74 68 65 20 73 65 6c 65 63 74  ** if the select
34ba0 2d 6c 69 73 74 20 69 73 20 74 68 65 20 73 61 6d  -list is the sam
34bb0 65 20 61 73 20 74 68 65 20 4f 52 44 45 52 20 42  e as the ORDER B
34bc0 59 20 6c 69 73 74 2c 20 74 68 65 6e 20 74 68 69  Y list, then thi
34bd0 73 20 71 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e  s query.  ** can
34be0 20 62 65 20 72 65 77 72 69 74 74 65 6e 20 61 73   be rewritten as
34bf0 20 61 20 47 52 4f 55 50 20 42 59 2e 20 49 6e 20   a GROUP BY. In 
34c00 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 69  other words, thi
34c10 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
34c20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54   SELECT DISTINCT
34c30 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52   xyz FROM ... OR
34c40 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a  DER BY xyz.  **.
34c50 20 20 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f 72    ** is transfor
34c60 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  med to:.  **.  *
34c70 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 79 7a  *     SELECT xyz
34c80 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20   FROM ... GROUP 
34c90 42 59 20 78 79 7a 20 4f 52 44 45 52 20 42 59 20  BY xyz ORDER BY 
34ca0 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  xyz.  **.  ** Th
34cb0 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73  e second form is
34cc0 20 70 72 65 66 65 72 72 65 64 20 61 73 20 61 20   preferred as a 
34cd0 73 69 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f 72  single index (or
34ce0 20 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79   temp-table) may
34cf0 20 62 65 20 0a 20 20 2a 2a 20 75 73 65 64 20 66   be .  ** used f
34d00 6f 72 20 62 6f 74 68 20 74 68 65 20 4f 52 44 45  or both the ORDE
34d10 52 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43  R BY and DISTINC
34d20 54 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 41 73  T processing. As
34d30 20 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a   originally .  *
34d40 2a 20 77 72 69 74 74 65 6e 20 74 68 65 20 71 75  * written the qu
34d50 65 72 79 20 6d 75 73 74 20 75 73 65 20 61 20 74  ery must use a t
34d60 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 61 74  emp-table for at
34d70 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68   least one of th
34d80 65 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42 59  e ORDER .  ** BY
34d90 20 61 6e 64 20 44 49 53 54 49 4e 43 54 2c 20 61   and DISTINCT, a
34da0 6e 64 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 73  nd an index or s
34db0 65 70 61 72 61 74 65 20 74 65 6d 70 2d 74 61 62  eparate temp-tab
34dc0 6c 65 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72  le for the other
34dd0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d  ..  */.  if( (p-
34de0 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
34df0 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
34e00 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74  egate))==SF_Dist
34e10 69 6e 63 74 20 0a 20 20 20 26 26 20 73 71 6c 69  inct .   && sqli
34e20 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
34e30 72 65 28 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  re(sSort.pOrderB
34e40 79 2c 20 70 45 4c 69 73 74 2c 20 2d 31 29 3d 3d  y, pEList, -1)==
34e50 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65  0.  ){.    p->se
34e60 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69  lFlags &= ~SF_Di
34e70 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 47 72 6f  stinct;.    pGro
34e80 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
34e90 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
34ea0 4c 69 73 74 44 75 70 28 64 62 2c 20 70 45 4c 69  ListDup(db, pELi
34eb0 73 74 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20 4e  st, 0);.    /* N
34ec0 6f 74 69 63 65 20 74 68 61 74 20 65 76 65 6e 20  otice that even 
34ed0 74 68 6f 75 67 68 74 20 53 46 5f 44 69 73 74 69  thought SF_Disti
34ee0 6e 63 74 20 68 61 73 20 62 65 65 6e 20 63 6c 65  nct has been cle
34ef0 61 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73 65 6c  ared from p->sel
34f00 46 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20 74 68  Flags,.    ** th
34f10 65 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e  e sDistinct.isTn
34f20 63 74 20 69 73 20 73 74 69 6c 6c 20 73 65 74 2e  ct is still set.
34f30 20 20 48 65 6e 63 65 2c 20 69 73 54 6e 63 74 20    Hence, isTnct 
34f40 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 0a 20  represents the. 
34f50 20 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 73     ** original s
34f60 65 74 74 69 6e 67 20 6f 66 20 74 68 65 20 53 46  etting of the SF
34f70 5f 44 69 73 74 69 6e 63 74 20 66 6c 61 67 2c 20  _Distinct flag, 
34f80 6e 6f 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  not the current 
34f90 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20 20 61  setting */.    a
34fa0 73 73 65 72 74 28 20 73 44 69 73 74 69 6e 63 74  ssert( sDistinct
34fb0 2e 69 73 54 6e 63 74 20 29 3b 0a 0a 23 69 66 20  .isTnct );..#if 
34fc0 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
34fd0 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69  LED.    if( sqli
34fe0 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
34ff0 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20   0x400 ){.      
35000 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30  SELECTTRACE(0x40
35010 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 54 72 61  0,pParse,p,("Tra
35020 6e 73 66 6f 72 6d 20 44 49 53 54 49 4e 43 54 20  nsform DISTINCT 
35030 69 6e 74 6f 20 47 52 4f 55 50 20 42 59 3a 5c 6e  into GROUP BY:\n
35040 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
35050 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
35060 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d  (0, p, 0);.    }
35070 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
35080 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
35090 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
350a0 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e  , then create an
350b0 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
350c0 20 74 6f 0a 20 20 2a 2a 20 64 6f 20 74 68 65 20   to.  ** do the 
350d0 73 6f 72 74 69 6e 67 2e 20 20 42 75 74 20 74 68  sorting.  But th
350e0 69 73 20 73 6f 72 74 69 6e 67 20 65 70 68 65 6d  is sorting ephem
350f0 65 72 61 6c 20 69 6e 64 65 78 20 6d 69 67 68 74  eral index might
35100 20 65 6e 64 20 75 70 0a 20 20 2a 2a 20 62 65 69   end up.  ** bei
35110 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74 68 65  ng unused if the
35120 20 64 61 74 61 20 63 61 6e 20 62 65 20 65 78 74   data can be ext
35130 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f  racted in pre-so
35140 72 74 65 64 20 6f 72 64 65 72 2e 0a 20 20 2a 2a  rted order..  **
35150 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20   If that is the 
35160 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 4f  case, then the O
35170 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
35180 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c  instruction will
35190 20 62 65 0a 20 20 2a 2a 20 63 68 61 6e 67 65 64   be.  ** changed
351a0 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f   to an OP_Noop o
351b0 6e 63 65 20 77 65 20 66 69 67 75 72 65 20 6f 75  nce we figure ou
351c0 74 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 69  t that the sorti
351d0 6e 67 20 69 6e 64 65 78 20 69 73 0a 20 20 2a 2a  ng index is.  **
351e0 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68   not needed.  Th
351f0 65 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  e sSort.addrSort
35200 49 6e 64 65 78 20 76 61 72 69 61 62 6c 65 20 69  Index variable i
35210 73 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69  s used to facili
35220 74 61 74 65 0a 20 20 2a 2a 20 74 68 61 74 20 63  tate.  ** that c
35230 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  hange..  */.  if
35240 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  ( sSort.pOrderBy
35250 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
35260 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70  *pKeyInfo;.    p
35270 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
35280 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  3KeyInfoFromExpr
35290 4c 69 73 74 28 0a 20 20 20 20 20 20 20 20 70 50  List(.        pP
352a0 61 72 73 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64  arse, sSort.pOrd
352b0 65 72 42 79 2c 20 30 2c 20 70 45 4c 69 73 74 2d  erBy, 0, pEList-
352c0 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 73 53 6f  >nExpr);.    sSo
352d0 72 74 2e 69 45 43 75 72 73 6f 72 20 3d 20 70 50  rt.iECursor = pP
352e0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
352f0 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74    sSort.addrSort
35300 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71  Index =.      sq
35310 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
35320 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
35330 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 73  ral,.          s
35340 53 6f 72 74 2e 69 45 43 75 72 73 6f 72 2c 20 73  Sort.iECursor, s
35350 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e  Sort.pOrderBy->n
35360 45 78 70 72 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e  Expr+1+pEList->n
35370 45 78 70 72 2c 20 30 2c 0a 20 20 20 20 20 20 20  Expr, 0,.       
35380 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
35390 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 0a 20  fo, P4_KEYINFO. 
353a0 20 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b       );.  }else{
353b0 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53  .    sSort.addrS
353c0 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20  ortIndex = -1;. 
353d0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
353e0 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e  output is destin
353f0 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61  ed for a tempora
35400 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74  ry table, open t
35410 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  hat table..  */.
35420 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65    if( pDest->eDe
35430 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
35440 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
35450 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
35460 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
35470 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70  Dest->iSDParm, p
35480 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
35490 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
354a0 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20   limiter..  */. 
354b0 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56   iEnd = sqlite3V
354c0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
354d0 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
354e0 61 67 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69  ags & SF_FixedLi
354f0 6d 69 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  mit)==0 ){.    p
35500 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 33  ->nSelectRow = 3
35510 32 30 3b 20 20 2f 2a 20 34 20 62 69 6c 6c 69 6f  20;  /* 4 billio
35520 6e 20 72 6f 77 73 20 2a 2f 0a 20 20 7d 0a 20 20  n rows */.  }.  
35530 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
35540 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
35550 20 69 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d   iEnd);.  if( p-
35560 3e 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20 73 53  >iLimit==0 && sS
35570 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
35580 78 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x>=0 ){.    sqli
35590 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63  te3VdbeChangeOpc
355a0 6f 64 65 28 76 2c 20 73 53 6f 72 74 2e 61 64 64  ode(v, sSort.add
355b0 72 53 6f 72 74 49 6e 64 65 78 2c 20 4f 50 5f 53  rSortIndex, OP_S
355c0 6f 72 74 65 72 4f 70 65 6e 29 3b 0a 20 20 20 20  orterOpen);.    
355d0 73 53 6f 72 74 2e 73 6f 72 74 46 6c 61 67 73 20  sSort.sortFlags 
355e0 7c 3d 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53  |= SORTFLAG_UseS
355f0 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  orter;.  }..  /*
35600 20 4f 70 65 6e 20 61 6e 20 65 70 68 65 6d 65 72   Open an ephemer
35610 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  al index to use 
35620 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74  for the distinct
35630 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   set..  */.  if(
35640 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
35650 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  F_Distinct ){.  
35660 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54    sDistinct.tabT
35670 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
35680 61 62 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74 69  ab++;.    sDisti
35690 6e 63 74 2e 61 64 64 72 54 6e 63 74 20 3d 20 73  nct.addrTnct = s
356a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
356b0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
356c0 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  eral,.          
356d0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 44 69               sDi
356e0 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20  stinct.tabTnct, 
356f0 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
35700 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
35710 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
35720 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
35730 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
35740 2c 30 2c 30 29 2c 0a 20 20 20 20 20 20 20 20 20  ,0,0),.         
35750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34                P4
35760 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73  _KEYINFO);.    s
35770 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
35780 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52  P5(v, BTREE_UNOR
35790 44 45 52 45 44 29 3b 0a 20 20 20 20 73 44 69 73  DERED);.    sDis
357a0 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20  tinct.eTnctType 
357b0 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
357c0 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65  _UNORDERED;.  }e
357d0 6c 73 65 7b 0a 20 20 20 20 73 44 69 73 74 69 6e  lse{.    sDistin
357e0 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57  ct.eTnctType = W
357f0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f  HERE_DISTINCT_NO
35800 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  OP;.  }..  if( !
35810 69 73 41 67 67 20 26 26 20 70 47 72 6f 75 70 42  isAgg && pGroupB
35820 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  y==0 ){.    /* N
35830 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  o aggregate func
35840 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f  tions and no GRO
35850 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  UP BY clause */.
35860 20 20 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61      u16 wctrlFla
35870 67 73 20 3d 20 28 73 44 69 73 74 69 6e 63 74 2e  gs = (sDistinct.
35880 69 73 54 6e 63 74 20 3f 20 57 48 45 52 45 5f 57  isTnct ? WHERE_W
35890 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 3a 20 30  ANT_DISTINCT : 0
358a0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
358b0 20 20 20 20 20 7c 20 28 70 2d 3e 73 65 6c 46 6c       | (p->selFl
358c0 61 67 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69  ags & SF_FixedLi
358d0 6d 69 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  mit);.#ifndef SQ
358e0 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
358f0 46 55 4e 43 0a 20 20 20 20 57 69 6e 64 6f 77 20  FUNC.    Window 
35900 2a 70 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b  *pWin = p->pWin;
35910 20 20 20 20 20 20 2f 2a 20 4d 61 73 74 65 72 20        /* Master 
35920 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 28 6f  window object (o
35930 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69  r NULL) */.    i
35940 66 28 20 70 57 69 6e 20 29 7b 0a 20 20 20 20 20  f( pWin ){.     
35950 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f   sqlite3WindowCo
35960 64 65 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70  deInit(pParse, p
35970 57 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Win);.    }.#end
35980 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  if.    assert( W
35990 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 3d 3d  HERE_USE_LIMIT==
359a0 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 20 29 3b  SF_FixedLimit );
359b0 0a 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  ...    /* Begin 
359c0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
359d0 6e 2e 20 2a 2f 0a 20 20 20 20 53 45 4c 45 43 54  n. */.    SELECT
359e0 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
359f0 2c 28 22 57 68 65 72 65 42 65 67 69 6e 5c 6e 22  ,("WhereBegin\n"
35a00 29 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d  ));.    pWInfo =
35a10 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
35a20 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
35a30 69 73 74 2c 20 70 57 68 65 72 65 2c 20 73 53 6f  ist, pWhere, sSo
35a40 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20 20  rt.pOrderBy,.   
35a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a60 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
35a70 45 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c 61 67  EList, wctrlFlag
35a80 73 2c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  s, p->nSelectRow
35a90 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  );.    if( pWInf
35aa0 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
35ab0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20  ct_end;.    if( 
35ac0 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70  sqlite3WhereOutp
35ad0 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66  utRowCount(pWInf
35ae0 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52  o) < p->nSelectR
35af0 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  ow ){.      p->n
35b00 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
35b10 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
35b20 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a  wCount(pWInfo);.
35b30 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 44      }.    if( sD
35b40 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26  istinct.isTnct &
35b50 26 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  & sqlite3WhereIs
35b60 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29  Distinct(pWInfo)
35b70 20 29 7b 0a 20 20 20 20 20 20 73 44 69 73 74 69   ){.      sDisti
35b80 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20  nct.eTnctType = 
35b90 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69  sqlite3WhereIsDi
35ba0 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a  stinct(pWInfo);.
35bb0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 53      }.    if( sS
35bc0 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ort.pOrderBy ){.
35bd0 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53        sSort.nOBS
35be0 61 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  at = sqlite3Wher
35bf0 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66  eIsOrdered(pWInf
35c00 6f 29 3b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e  o);.      sSort.
35c10 6c 61 62 65 6c 4f 42 4c 6f 70 74 20 3d 20 73 71  labelOBLopt = sq
35c20 6c 69 74 65 33 57 68 65 72 65 4f 72 64 65 72 42  lite3WhereOrderB
35c30 79 4c 69 6d 69 74 4f 70 74 4c 61 62 65 6c 28 70  yLimitOptLabel(p
35c40 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66  WInfo);.      if
35c50 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d  ( sSort.nOBSat==
35c60 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e  sSort.pOrderBy->
35c70 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
35c80 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
35c90 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
35ca0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f   }..    /* If so
35cb0 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
35cc0 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
35cd0 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45  a prior OP_OpenE
35ce0 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a  phemeral .    **
35cf0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64   instruction end
35d00 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20  ed up not being 
35d10 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61  needed, then cha
35d20 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  nge the OP_OpenE
35d30 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20  phemeral.    ** 
35d40 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e  into an OP_Noop.
35d50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
35d60 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
35d70 64 65 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e  dex>=0 && sSort.
35d80 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
35d90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
35da0 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
35db0 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
35dc0 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  dex);.    }..   
35dd0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
35de0 73 74 3d 3d 70 45 4c 69 73 74 20 29 3b 0a 23 69  st==pEList );.#i
35df0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
35e00 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20  T_WINDOWFUNC.   
35e10 20 69 66 28 20 70 57 69 6e 20 29 7b 0a 20 20 20   if( pWin ){.   
35e20 20 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62     int addrGosub
35e30 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
35e40 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
35e50 20 20 69 6e 74 20 69 43 6f 6e 74 20 3d 20 73 71    int iCont = sq
35e60 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
35e70 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74  el(v);.      int
35e80 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
35e90 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
35ea0 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  );.      int reg
35eb0 47 6f 73 75 62 20 3d 20 2b 2b 70 50 61 72 73 65  Gosub = ++pParse
35ec0 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 20 20 73  ->nMem;..      s
35ed0 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65  qlite3WindowCode
35ee0 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Step(pParse, p, 
35ef0 70 57 49 6e 66 6f 2c 20 72 65 67 47 6f 73 75 62  pWInfo, regGosub
35f00 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 0a 20  , addrGosub);.. 
35f10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
35f20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
35f30 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20  o, 0, iBreak);. 
35f40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
35f50 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
35f60 61 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 20 20  addrGosub);.    
35f70 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
35f80 74 28 28 76 2c 20 22 69 6e 6e 65 72 2d 6c 6f 6f  t((v, "inner-loo
35f90 70 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  p subroutine"));
35fa0 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6c 61 62  .      sSort.lab
35fb0 65 6c 4f 42 4c 6f 70 74 20 3d 20 30 3b 0a 20 20  elOBLopt = 0;.  
35fc0 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
35fd0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d  oop(pParse, p, -
35fe0 31 2c 20 26 73 53 6f 72 74 2c 20 26 73 44 69 73  1, &sSort, &sDis
35ff0 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 20 69 43  tinct, pDest, iC
36000 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ont, iBreak);.  
36010 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
36020 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
36030 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Cont);.      sql
36040 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
36050 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
36060 47 6f 73 75 62 29 3b 0a 20 20 20 20 20 20 56 64  Gosub);.      Vd
36070 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
36080 6e 64 20 69 6e 6e 65 72 2d 6c 6f 6f 70 20 73 75  nd inner-loop su
36090 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
360a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
360b0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
360c0 72 65 61 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65  reak);.    }else
360d0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
360e0 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
360f0 43 20 2a 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20  C */.    {.     
36100 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e   /* Use the stan
36110 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e  dard inner loop.
36120 20 2a 2f 0a 20 20 20 20 20 20 73 65 6c 65 63 74   */.      select
36130 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
36140 2c 20 70 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c  , p, -1, &sSort,
36150 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65   &sDistinct, pDe
36160 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71  st,.          sq
36170 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e  lite3WhereContin
36180 75 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c  ueLabel(pWInfo),
36190 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
361a0 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65  e3WhereBreakLabe
361b0 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20  l(pWInfo));..   
361c0 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61     /* End the da
361d0 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70  tabase scan loop
361e0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
361f0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
36200 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  (pWInfo);.    }.
36210 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
36220 54 68 69 73 20 63 61 73 65 20 77 68 65 6e 20 74  This case when t
36230 68 65 72 65 20 65 78 69 73 74 20 61 67 67 72 65  here exist aggre
36240 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f  gate functions o
36250 72 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  r a GROUP BY cla
36260 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f  use.    ** or bo
36270 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f  th */.    NameCo
36280 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a  ntext sNC;    /*
36290 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
362a0 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67  r processing agg
362b0 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69  regate informati
362c0 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41  on */.    int iA
362d0 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem;          /*
362e0 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65   First Mem addre
362f0 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63  ss for storing c
36300 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
36310 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d  */.    int iBMem
36320 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
36330 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20  rst Mem address 
36340 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f  for previous GRO
36350 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74  UP BY */.    int
36360 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20   iUseFlag;      
36370 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20   /* Mem address 
36380 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64  holding flag ind
36390 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 74 20  icating that at 
363a0 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 20 20  least.          
363b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
363c0 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20   one row of the 
363d0 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67 67  input to the agg
363e0 72 65 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e  regator has been
363f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
36400 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
36410 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  essed */.    int
36420 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20   iAbortFlag;    
36430 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20   /* Mem address 
36440 77 68 69 63 68 20 63 61 75 73 65 73 20 71 75 65  which causes que
36450 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69  ry abort if posi
36460 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tive */.    int 
36470 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20  groupBySort;    
36480 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f  /* Rows come fro
36490 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55  m source in GROU
364a0 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20  P BY order */.  
364b0 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20    int addrEnd;  
364c0 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
364d0 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74  processing for t
364e0 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  his SELECT */.  
364f0 20 20 69 6e 74 20 73 6f 72 74 50 54 61 62 20 3d    int sortPTab =
36500 20 30 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f 74   0;   /* Pseudot
36510 61 62 6c 65 20 75 73 65 64 20 74 6f 20 64 65 63  able used to dec
36520 6f 64 65 20 73 6f 72 74 69 6e 67 20 72 65 73 75  ode sorting resu
36530 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lts */.    int s
36540 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f  ortOut = 0;    /
36550 2a 20 4f 75 74 70 75 74 20 72 65 67 69 73 74 65  * Output registe
36560 72 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65  r from the sorte
36570 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 72 64  r */.    int ord
36580 65 72 42 79 47 72 70 20 3d 20 30 3b 20 2f 2a 20  erByGrp = 0; /* 
36590 54 72 75 65 20 69 66 20 74 68 65 20 47 52 4f 55  True if the GROU
365a0 50 20 42 59 20 61 6e 64 20 4f 52 44 45 52 20 42  P BY and ORDER B
365b0 59 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 2a  Y are the same *
365c0 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  /..    /* Remove
365d0 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69   any and all ali
365e0 61 73 65 73 20 62 65 74 77 65 65 6e 20 74 68 65  ases between the
365f0 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20   result set and 
36600 74 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50  the.    ** GROUP
36610 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20   BY clause..    
36620 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75  */.    if( pGrou
36630 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  pBy ){.      int
36640 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   k;             
36650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
36660 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
36670 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
36680 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
36690 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
366a0 20 6f 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e   over expression
366b0 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20   in a list */.. 
366c0 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45       for(k=p->pE
366d0 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74  List->nExpr, pIt
366e0 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b  em=p->pEList->a;
366f0 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d   k>0; k--, pItem
36700 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  ++){.        pIt
36710 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d  em->u.x.iAlias =
36720 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
36730 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79    for(k=pGroupBy
36740 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
36750 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b  GroupBy->a; k>0;
36760 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   k--, pItem++){.
36770 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75          pItem->u
36780 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20  .x.iAlias = 0;. 
36790 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
367a0 65 72 74 28 20 36 36 3d 3d 73 71 6c 69 74 65 33  ert( 66==sqlite3
367b0 4c 6f 67 45 73 74 28 31 30 30 29 20 29 3b 0a 20  LogEst(100) );. 
367c0 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c       if( p->nSel
367d0 65 63 74 52 6f 77 3e 36 36 20 29 20 70 2d 3e 6e  ectRow>66 ) p->n
367e0 53 65 6c 65 63 74 52 6f 77 20 3d 20 36 36 3b 0a  SelectRow = 66;.
367f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36800 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69   assert( 0==sqli
36810 74 65 33 4c 6f 67 45 73 74 28 31 29 20 29 3b 0a  te3LogEst(1) );.
36820 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
36830 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  Row = 0;.    }..
36840 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
36850 69 73 20 62 6f 74 68 20 61 20 47 52 4f 55 50 20  is both a GROUP 
36860 42 59 20 61 6e 64 20 61 6e 20 4f 52 44 45 52 20  BY and an ORDER 
36870 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68  BY clause and th
36880 65 79 20 61 72 65 0a 20 20 20 20 2a 2a 20 69 64  ey are.    ** id
36890 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20 69 74  entical, then it
368a0 20 6d 61 79 20 62 65 20 70 6f 73 73 69 62 6c 65   may be possible
368b0 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20   to disable the 
368c0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
368d0 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 67  .    ** on the g
368e0 72 6f 75 6e 64 73 20 74 68 61 74 20 74 68 65 20  rounds that the 
368f0 47 52 4f 55 50 20 42 59 20 77 69 6c 6c 20 63 61  GROUP BY will ca
36900 75 73 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20  use elements to 
36910 63 6f 6d 65 20 6f 75 74 20 0a 20 20 20 20 2a 2a  come out .    **
36920 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20   in the correct 
36930 6f 72 64 65 72 2e 20 49 74 20 61 6c 73 6f 20 6d  order. It also m
36940 61 79 20 6e 6f 74 20 2d 20 74 68 65 20 47 52 4f  ay not - the GRO
36950 55 50 20 42 59 20 6d 69 67 68 74 20 75 73 65 20  UP BY might use 
36960 61 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  a.    ** databas
36970 65 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 75  e index that cau
36980 73 65 73 20 72 6f 77 73 20 74 6f 20 62 65 20 67  ses rows to be g
36990 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 20  rouped together 
369a0 61 73 20 72 65 71 75 69 72 65 64 0a 20 20 20 20  as required.    
369b0 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63 74 75 61  ** but not actua
369c0 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45 69 74 68  lly sorted. Eith
369d0 65 72 20 77 61 79 2c 20 72 65 63 6f 72 64 20 74  er way, record t
369e0 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65  he fact that the
369f0 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59  .    ** ORDER BY
36a00 20 61 6e 64 20 47 52 4f 55 50 20 42 59 20 63 6c   and GROUP BY cl
36a10 61 75 73 65 73 20 61 72 65 20 74 68 65 20 73 61  auses are the sa
36a20 6d 65 20 62 79 20 73 65 74 74 69 6e 67 20 74 68  me by setting th
36a30 65 20 6f 72 64 65 72 42 79 47 72 70 0a 20 20 20  e orderByGrp.   
36a40 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 20 2a   ** variable.  *
36a50 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
36a60 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
36a70 28 70 47 72 6f 75 70 42 79 2c 20 73 53 6f 72 74  (pGroupBy, sSort
36a80 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d 3d  .pOrderBy, -1)==
36a90 30 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72  0 ){.      order
36aa0 42 79 47 72 70 20 3d 20 31 3b 0a 20 20 20 20 7d  ByGrp = 1;.    }
36ab0 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  . .    /* Create
36ac0 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70   a label to jump
36ad0 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74   to when we want
36ae0 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75   to abort the qu
36af0 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45  ery */.    addrE
36b00 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
36b10 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
36b20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b     /* Convert TK
36b30 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e  _COLUMN nodes in
36b40 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  to TK_AGG_COLUMN
36b50 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65   and make entrie
36b60 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67  s in.    ** sAgg
36b70 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f  Info for all TK_
36b80 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64  AGG_FUNCTION nod
36b90 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  es in expression
36ba0 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  s of the.    ** 
36bb0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
36bc0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d  ..    */.    mem
36bd0 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
36be0 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73  eof(sNC));.    s
36bf0 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
36c00 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63  se;.    sNC.pSrc
36c10 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
36c20 0a 20 20 20 20 73 4e 43 2e 75 4e 43 2e 70 41 67  .    sNC.uNC.pAg
36c30 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66  gInfo = &sAggInf
36c40 6f 3b 0a 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28  o;.    VVA_ONLY(
36c50 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 3d 20 4e   sNC.ncFlags = N
36c60 43 5f 55 41 67 67 49 6e 66 6f 3b 20 29 0a 20 20  C_UAggInfo; ).  
36c70 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67    sAggInfo.mnReg
36c80 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
36c90 31 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  1;.    sAggInfo.
36ca0 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d  nSortingColumn =
36cb0 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f   pGroupBy ? pGro
36cc0 75 70 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  upBy->nExpr : 0;
36cd0 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47  .    sAggInfo.pG
36ce0 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
36cf0 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  y;.    sqlite3Ex
36d00 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
36d10 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a  (&sNC, pEList);.
36d20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
36d30 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
36d40 4e 43 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  NC, sSort.pOrder
36d50 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61  By);.    if( pHa
36d60 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 69 66  ving ){.      if
36d70 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
36d80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57        assert( pW
36d90 68 65 72 65 3d 3d 70 2d 3e 70 57 68 65 72 65 20  here==p->pWhere 
36da0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
36db0 74 28 20 70 48 61 76 69 6e 67 3d 3d 70 2d 3e 70  t( pHaving==p->p
36dc0 48 61 76 69 6e 67 20 29 3b 0a 20 20 20 20 20 20  Having );.      
36dd0 20 20 61 73 73 65 72 74 28 20 70 47 72 6f 75 70    assert( pGroup
36de0 42 79 3d 3d 70 2d 3e 70 47 72 6f 75 70 42 79 20  By==p->pGroupBy 
36df0 29 3b 0a 20 20 20 20 20 20 20 20 68 61 76 69 6e  );.        havin
36e00 67 54 6f 57 68 65 72 65 28 70 50 61 72 73 65 2c  gToWhere(pParse,
36e10 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70 57 68   p);.        pWh
36e20 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
36e30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
36e40 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
36e50 65 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43  eAggregates(&sNC
36e60 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20  , pHaving);.    
36e70 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e  }.    sAggInfo.n
36e80 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41  Accumulator = sA
36e90 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a  ggInfo.nColumn;.
36ea0 20 20 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75      if( p->pGrou
36eb0 70 42 79 3d 3d 30 20 26 26 20 70 2d 3e 70 48 61  pBy==0 && p->pHa
36ec0 76 69 6e 67 3d 3d 30 20 26 26 20 73 41 67 67 49  ving==0 && sAggI
36ed0 6e 66 6f 2e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a  nfo.nFunc==1 ){.
36ee0 20 20 20 20 20 20 6d 69 6e 4d 61 78 46 6c 61 67        minMaxFlag
36ef0 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 64   = minMaxQuery(d
36f00 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  b, sAggInfo.aFun
36f10 63 5b 30 5d 2e 70 45 78 70 72 2c 20 26 70 4d 69  c[0].pExpr, &pMi
36f20 6e 4d 61 78 4f 72 64 65 72 42 79 29 3b 0a 20 20  nMaxOrderBy);.  
36f30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
36f40 69 6e 4d 61 78 46 6c 61 67 20 3d 20 57 48 45 52  inMaxFlag = WHER
36f50 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
36f60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
36f70 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e  i=0; i<sAggInfo.
36f80 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFunc; i++){.   
36f90 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
36fa0 48 61 73 50 72 6f 70 65 72 74 79 28 73 41 67 67  HasProperty(sAgg
36fb0 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45  Info.aFunc[i].pE
36fc0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
36fd0 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e  t) );.      sNC.
36fe0 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e  ncFlags |= NC_In
36ff0 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 20 20 73  AggFunc;.      s
37000 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
37010 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73  eAggList(&sNC, s
37020 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d  AggInfo.aFunc[i]
37030 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29  .pExpr->x.pList)
37040 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c  ;.      sNC.ncFl
37050 61 67 73 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67  ags &= ~NC_InAgg
37060 46 75 6e 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Func;.    }.    
37070 73 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 3d  sAggInfo.mxReg =
37080 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20   pParse->nMem;. 
37090 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
370a0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73  cFailed ) goto s
370b0 65 6c 65 63 74 5f 65 6e 64 3b 0a 23 69 66 20 53  elect_end;.#if S
370c0 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
370d0 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ED.    if( sqlit
370e0 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
370f0 30 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20 69  0x400 ){.      i
37100 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 53 45 4c  nt ii;.      SEL
37110 45 43 54 54 52 41 43 45 28 30 78 34 30 30 2c 70  ECTTRACE(0x400,p
37120 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20  Parse,p,("After 
37130 61 67 67 72 65 67 61 74 65 20 61 6e 61 6c 79 73  aggregate analys
37140 69 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  is:\n"));.      
37150 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
37160 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
37170 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
37180 69 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c  ii<sAggInfo.nCol
37190 75 6d 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  umn; ii++){.    
371a0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
371b0 50 72 69 6e 74 66 28 22 61 67 67 2d 63 6f 6c 75  Printf("agg-colu
371c0 6d 6e 5b 25 64 5d 20 69 4d 65 6d 3d 25 64 5c 6e  mn[%d] iMem=%d\n
371d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ",.            i
371e0 69 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  i, sAggInfo.aCol
371f0 5b 69 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20  [ii].iMem);.    
37200 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
37210 69 65 77 45 78 70 72 28 30 2c 20 73 41 67 67 49  iewExpr(0, sAggI
37220 6e 66 6f 2e 61 43 6f 6c 5b 69 69 5d 2e 70 45 78  nfo.aCol[ii].pEx
37230 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  pr, 0);.      }.
37240 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
37250 69 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e  ii<sAggInfo.nFun
37260 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
37270 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
37280 69 6e 74 66 28 22 61 67 67 2d 66 75 6e 63 5b 25  intf("agg-func[%
37290 64 5d 3a 20 69 4d 65 6d 3d 25 64 5c 6e 22 2c 0a  d]: iMem=%d\n",.
372a0 20 20 20 20 20 20 20 20 20 20 20 20 69 69 2c 20              ii, 
372b0 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69  sAggInfo.aFunc[i
372c0 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  i].iMem);.      
372d0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
372e0 77 45 78 70 72 28 30 2c 20 73 41 67 67 49 6e 66  wExpr(0, sAggInf
372f0 6f 2e 61 46 75 6e 63 5b 69 69 5d 2e 70 45 78 70  o.aFunc[ii].pExp
37300 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r, 0);.      }. 
37310 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20     }.#endif...  
37320 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20    /* Processing 
37330 66 6f 72 20 61 67 67 72 65 67 61 74 65 73 20 77  for aggregates w
37340 69 74 68 20 47 52 4f 55 50 20 42 59 20 69 73 20  ith GROUP BY is 
37350 76 65 72 79 20 64 69 66 66 65 72 65 6e 74 20 61  very different a
37360 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d  nd.    ** much m
37370 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e  ore complex than
37380 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
37390 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a  out a GROUP BY..
373a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
373b0 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
373c0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
373d0 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69  fo;  /* Keying i
373e0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
373f0 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75  he group by clau
37400 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  se */.      int 
37410 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20  addr1;          
37420 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72  /* A-vs-B compar
37430 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20  ision jump */.  
37440 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70      int addrOutp
37450 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74  utRow;  /* Start
37460 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74   of subroutine t
37470 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 72 65  hat outputs a re
37480 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20  sult row */.    
37490 20 20 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52    int regOutputR
374a0 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  ow;   /* Return 
374b0 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
374c0 20 66 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72   for output subr
374d0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20  outine */.      
374e0 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72 74  int addrSetAbort
374f0 3b 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61  ;   /* Set the a
37500 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65  bort flag and re
37510 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  turn */.      in
37520 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b  t addrTopOfLoop;
37530 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
37540 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20  input loop */.  
37550 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74      int addrSort
37560 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f  ingIdx; /* The O
37570 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
37580 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20  for the sorting 
37590 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69  index */.      i
375a0 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20 20 20  nt addrReset;   
375b0 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65     /* Subroutine
375c0 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74   for resetting t
375d0 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a  he accumulator *
375e0 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52  /.      int regR
375f0 65 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52  eset;       /* R
37600 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65  eturn address re
37610 67 69 73 74 65 72 20 66 6f 72 20 72 65 73 65 74  gister for reset
37620 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a   subroutine */..
37630 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
37640 65 20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20  e is a GROUP BY 
37650 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74 20  clause we might 
37660 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69  need a sorting i
37670 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ndex to.      **
37680 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20   implement it.  
37690 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f  Allocate that so
376a0 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e  rting index now.
376b0 20 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75    If it turns ou
376c0 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  t.      ** that 
376d0 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69  we do not need i
376e0 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65  t after all, the
376f0 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69   OP_SorterOpen i
37700 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20  nstruction.     
37710 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76   ** will be conv
37720 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f  erted into a Noo
37730 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  p.  .      */.  
37740 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
37750 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65  tingIdx = pParse
37760 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
37770 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
37780 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  e3KeyInfoFromExp
37790 72 4c 69 73 74 28 70 50 61 72 73 65 2c 70 47 72  rList(pParse,pGr
377a0 6f 75 70 42 79 2c 30 2c 73 41 67 67 49 6e 66 6f  oupBy,0,sAggInfo
377b0 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  .nColumn);.     
377c0 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20   addrSortingIdx 
377d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
377e0 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op4(v, OP_Sorter
377f0 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20  Open, .         
37800 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
37810 67 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e  gIdx, sAggInfo.n
37820 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a  SortingColumn, .
37830 20 20 20 20 20 20 20 20 20 20 30 2c 20 28 63 68            0, (ch
37840 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
37850 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20 20  _KEYINFO);..    
37860 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
37870 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73  memory locations
37880 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20 42   used by GROUP B
37890 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f 63  Y aggregate proc
378a0 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a  essing.      */.
378b0 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d        iUseFlag =
378c0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
378d0 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61  .      iAbortFla
378e0 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
378f0 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74  em;.      regOut
37900 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73  putRow = ++pPars
37910 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61  e->nMem;.      a
37920 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73  ddrOutputRow = s
37930 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
37940 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72 65  bel(v);.      re
37950 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  gReset = ++pPars
37960 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61  e->nMem;.      a
37970 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74  ddrReset = sqlit
37980 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
37990 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20  v);.      iAMem 
379a0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
379b0 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65   1;.      pParse
379c0 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70  ->nMem += pGroup
379d0 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
379e0 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iBMem = pParse-
379f0 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20  >nMem + 1;.     
37a00 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
37a10 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
37a20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
37a30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
37a40 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f  Integer, 0, iAbo
37a50 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  rtFlag);.      V
37a60 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
37a70 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67  clear abort flag
37a80 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
37a90 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
37aa0 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65  OP_Null, 0, iAMe
37ab0 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42  m, iAMem+pGroupB
37ac0 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20  y->nExpr-1);..  
37ad0 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c      /* Begin a l
37ae0 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78  oop that will ex
37af0 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65  tract all source
37b00 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42   rows in GROUP B
37b10 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a  Y order..      *
37b20 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76  * This might inv
37b30 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74  olve two separat
37b40 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20  e loops with an 
37b50 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65  OP_Sort in betwe
37b60 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  en, or.      ** 
37b70 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69  it might be a si
37b80 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75  ngle loop that u
37b90 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ses an index to 
37ba0 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74  extract informat
37bb0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ion.      ** in 
37bc0 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20  the right order 
37bd0 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20  to begin with.. 
37be0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
37bf0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
37c00 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
37c10 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74  Reset, addrReset
37c20 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54  );.      SELECTT
37c30 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c  RACE(1,pParse,p,
37c40 28 22 57 68 65 72 65 42 65 67 69 6e 5c 6e 22 29  ("WhereBegin\n")
37c50 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20  );.      pWInfo 
37c60 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
37c70 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
37c80 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 47  List, pWhere, pG
37c90 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20 20 20  roupBy, 0,.     
37ca0 20 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55 50       WHERE_GROUP
37cb0 42 59 20 7c 20 28 6f 72 64 65 72 42 79 47 72 70  BY | (orderByGrp
37cc0 20 3f 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47   ? WHERE_SORTBYG
37cd0 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20 20 20  ROUP : 0), 0.   
37ce0 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
37cf0 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
37d00 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
37d10 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
37d20 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49  ereIsOrdered(pWI
37d30 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e  nfo)==pGroupBy->
37d40 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
37d50 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65   /* The optimize
37d60 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c  r is able to del
37d70 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f  iver rows in gro
37d80 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20  up by order so. 
37d90 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20         ** we do 
37da0 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74  not have to sort
37db0 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  .  The OP_OpenEp
37dc0 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69  hemeral table wi
37dd0 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ll be.        **
37de0 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72   cancelled later
37df0 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c   because we stil
37e00 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68  l need to use th
37e10 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20  e pKeyInfo.     
37e20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72     */.        gr
37e30 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20  oupBySort = 0;. 
37e40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
37e50 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20      /* Rows are 
37e60 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e  coming out in un
37e70 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72  determined order
37e80 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75  .  We have to pu
37e90 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61  sh.        ** ea
37ea0 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f  ch row into a so
37eb0 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72  rting index, ter
37ec0 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74  minate the first
37ed0 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a   loop,.        *
37ee0 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72  * then loop over
37ef0 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
37f00 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ex in order to g
37f10 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20  et the output.  
37f20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74        ** in sort
37f30 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  ed order.       
37f40 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
37f50 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20  regBase;.       
37f60 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a   int regRecord;.
37f70 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c          int nCol
37f80 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47  ;.        int nG
37f90 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20  roupBy;..       
37fa0 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
37fb0 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
37fc0 20 20 20 20 20 20 20 28 73 44 69 73 74 69 6e 63         (sDistinc
37fd0 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d 3e  t.isTnct && (p->
37fe0 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73 74  selFlags&SF_Dist
37ff0 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20  inct)==0) ?.    
38000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38010 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47 52  "DISTINCT" : "GR
38020 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20  OUP BY");..     
38030 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d     groupBySort =
38040 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f   1;.        nGro
38050 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d  upBy = pGroupBy-
38060 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
38070 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 3b  nCol = nGroupBy;
38080 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72  .        j = nGr
38090 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66  oupBy;.        f
380a0 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
380b0 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  fo.nColumn; i++)
380c0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
380d0 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
380e0 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d  .iSorterColumn>=
380f0 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  j ){.           
38100 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20   nCol++;.       
38110 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
38120 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
38130 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20          regBase 
38140 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
38150 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43  Range(pParse, nC
38160 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
38170 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
38180 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72  List(pParse, pGr
38190 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65 2c 20  oupBy, regBase, 
381a0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6a  0, 0);.        j
381b0 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20   = nGroupBy;.   
381c0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
381d0 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
381e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
381f0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
38200 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41  _col *pCol = &sA
38210 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a  ggInfo.aCol[i];.
38220 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
38230 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
38240 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=j ){.        
38250 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b      int r1 = j +
38260 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20   regBase;.      
38270 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
38280 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66  rCodeGetColumnOf
38290 54 61 62 6c 65 28 76 2c 0a 20 20 20 20 20 20 20  Table(v,.       
382a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
382b0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54          pCol->pT
382c0 61 62 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65  ab, pCol->iTable
382d0 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c  , pCol->iColumn,
382e0 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r1);.          
382f0 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    j++;.         
38300 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
38310 20 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d       regRecord =
38320 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
38330 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
38340 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
38350 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
38360 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c  Record, regBase,
38370 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64   nCol, regRecord
38380 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
38390 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
383a0 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c  OP_SorterInsert,
383b0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
383